37
* to infer the settings for branch.<new_ref>.{remote,merge} from the
38
* config.
39
*/
40
-static int setup_tracking(const char *new_ref, const char *orig_ref)
40
+static int setup_tracking(const char *new_ref, const char *orig_ref,
41
+ enum branch_track track)
42
{
43
char key[1024];
44
struct tracking tracking;
49
50
memset(&tracking, 0, sizeof(tracking));
51
tracking.spec.dst = (char *)orig_ref;
51
- if (for_each_remote(find_tracked_branch, &tracking) ||
52
- !tracking.matches)
52
+ if (for_each_remote(find_tracked_branch, &tracking))
53
return 1;
54
55
+ if (!tracking.matches)
56
+ switch (track) {
57
+ case BRANCH_TRACK_ALWAYS:
58
+ case BRANCH_TRACK_EXPLICIT:
59
+ break;
60
+ default:
61
+ return 1;
62
+ }
63
+
64
if (tracking.matches > 1)
65
return error("Not tracking: ambiguous information for ref %s",
66
orig_ref);
67
59
- if (tracking.matches == 1) {
60
- sprintf(key, "branch.%s.remote", new_ref);
61
- git_config_set(key, tracking.remote ? tracking.remote : ".");
62
- sprintf(key, "branch.%s.merge", new_ref);
63
- git_config_set(key, tracking.src);
64
- free(tracking.src);
65
- printf("Branch %s set up to track remote branch %s.\n",
66
- new_ref, orig_ref);
67
- }
68
+ sprintf(key, "branch.%s.remote", new_ref);
69
+ git_config_set(key, tracking.remote ? tracking.remote : ".");
70
+ sprintf(key, "branch.%s.merge", new_ref);
71
+ git_config_set(key, tracking.src ? tracking.src : orig_ref);
72
+ free(tracking.src);
73
+ printf("Branch %s set up to track %s branch %s.\n", new_ref,
74
+ tracking.remote ? "remote" : "local", orig_ref);
75
76
return 0;
77
}
78
79
void create_branch(const char *head,
80
const char *name, const char *start_name,
74
- int force, int reflog, int track)
81
+ int force, int reflog, enum branch_track track)
82
{
83
struct ref_lock *lock;
84
struct commit *commit;
105
switch (dwim_ref(start_name, strlen(start_name), sha1, &real_ref)) {
106
case 0:
107
/* Not branching from any existing branch */
101
- real_ref = NULL;
108
+ if (track == BRANCH_TRACK_EXPLICIT)
109
+ die("Cannot setup tracking information; starting point is not a branch.");
110
break;
111
case 1:
112
/* Unique completion -- good */
134
snprintf(msg, sizeof msg, "branch: Created from %s",
135
start_name);
136
129
- /* When branching off a remote branch, set up so that git-pull
130
- automatically merges from there. So far, this is only done for
131
- remotes registered via .git/config. */
137
if (real_ref && track)
133
- setup_tracking(name, real_ref);
138
+ setup_tracking(name, real_ref, track);
139
140
if (write_ref_sha1(lock, sha1, msg) < 0)
141
die("Failed to write ref: %s.", strerror(errno));
142
138
- if (real_ref)
139
- free(real_ref);
143
+ free(real_ref);
144
}
145
146
void remove_branch_state(void)