14 static int find_tracked_branch(struct remote *remote, void *priv)
16 struct tracking *tracking = priv;
18 if (!remote_find_tracking(remote, &tracking->spec)) {
19 if (++tracking->matches == 1) {
20 tracking->src = tracking->spec.src;
21 tracking->remote = remote->name;
23 free(tracking->spec.src);
29 tracking->spec.src = NULL;
35 static int should_setup_rebase(const char *origin)
38 case AUTOREBASE_NEVER:
40 case AUTOREBASE_LOCAL:
41 return origin == NULL;
42 case AUTOREBASE_REMOTE:
43 return origin != NULL;
44 case AUTOREBASE_ALWAYS:
50 void install_branch_config(int flag, const char *local, const char *origin, const char *remote)
52 const char *shortname = remote + 11;
53 int remote_is_branch = starts_with(remote, "refs/heads/");
54 struct strbuf key = STRBUF_INIT;
55 int rebasing = should_setup_rebase(origin);
58 && !strcmp(local, shortname)
60 warning(_("Not setting branch %s as its own upstream."),
65 strbuf_addf(&key, "branch.%s.remote", local);
66 git_config_set(key.buf, origin ? origin : ".");
69 strbuf_addf(&key, "branch.%s.merge", local);
70 git_config_set(key.buf, remote);
74 strbuf_addf(&key, "branch.%s.pullmode", local);
75 git_config_set(key.buf, "rebase");
79 if (flag & BRANCH_CONFIG_VERBOSE) {
80 if (remote_is_branch && origin)
82 _("Branch %s set up to track remote branch %s from %s by rebasing.") :
83 _("Branch %s set up to track remote branch %s from %s."),
84 local, shortname, origin);
85 else if (remote_is_branch && !origin)
87 _("Branch %s set up to track local branch %s by rebasing.") :
88 _("Branch %s set up to track local branch %s."),
90 else if (!remote_is_branch && origin)
92 _("Branch %s set up to track remote ref %s by rebasing.") :
93 _("Branch %s set up to track remote ref %s."),
95 else if (!remote_is_branch && !origin)
97 _("Branch %s set up to track local ref %s by rebasing.") :
98 _("Branch %s set up to track local ref %s."),
101 die("BUG: impossible combination of %d and %p",
102 remote_is_branch, origin);
107 * This is called when new_ref is branched off of orig_ref, and tries
108 * to infer the settings for branch.<new_ref>.{remote,merge} from the
111 static int setup_tracking(const char *new_ref, const char *orig_ref,
112 enum branch_track track, int quiet)
114 struct tracking tracking;
115 int config_flags = quiet ? 0 : BRANCH_CONFIG_VERBOSE;
117 if (strlen(new_ref) > 1024 - 7 - 7 - 1)
118 return error(_("Tracking not set up: name too long: %s"),
121 memset(&tracking, 0, sizeof(tracking));
122 tracking.spec.dst = (char *)orig_ref;
123 if (for_each_remote(find_tracked_branch, &tracking))
126 if (!tracking.matches)
128 case BRANCH_TRACK_ALWAYS:
129 case BRANCH_TRACK_EXPLICIT:
130 case BRANCH_TRACK_OVERRIDE:
136 if (tracking.matches > 1)
137 return error(_("Not tracking: ambiguous information for ref %s"),
140 install_branch_config(config_flags, new_ref, tracking.remote,
141 tracking.src ? tracking.src : orig_ref);
147 void install_branch_publish(const char *name, const char *remote, const char *remote_ref)
149 struct strbuf key = STRBUF_INIT;
151 if (!remote && !strcmp(name, remote_ref + 11) &&
152 starts_with(remote_ref, "refs/heads")) {
153 warning(_("Not setting branch %s as its own publish branch."), name);
157 strbuf_addf(&key, "branch.%s.pushremote", name);
158 git_config_set(key.buf, remote ? remote : ".");
161 strbuf_addf(&key, "branch.%s.push", name);
162 git_config_set(key.buf, remote_ref);
164 strbuf_release(&key);
167 int setup_publish(const char *name, const char *ref)
169 struct tracking tracking;
170 const char *remote, *remote_ref;
172 memset(&tracking, 0, sizeof(tracking));
173 tracking.spec.dst = (char *)ref;
174 if (for_each_remote(find_tracked_branch, &tracking))
177 if (tracking.matches > 1)
178 return error(_("Not tracking: ambiguous information for ref %s"),
181 remote = tracking.remote;
182 remote_ref = tracking.src ? tracking.src : ref;
184 install_branch_publish(name, remote, remote_ref);
191 struct branch_desc_cb {
192 const char *config_name;
196 static int read_branch_desc_cb(const char *var, const char *value, void *cb)
198 struct branch_desc_cb *desc = cb;
199 if (strcmp(desc->config_name, var))
201 free((char *)desc->value);
202 return git_config_string(&desc->value, var, value);
205 int read_branch_desc(struct strbuf *buf, const char *branch_name)
207 struct branch_desc_cb cb;
208 struct strbuf name = STRBUF_INIT;
209 strbuf_addf(&name, "branch.%s.description", branch_name);
210 cb.config_name = name.buf;
212 if (git_config(read_branch_desc_cb, &cb) < 0) {
213 strbuf_release(&name);
217 strbuf_addstr(buf, cb.value);
218 strbuf_release(&name);
222 int validate_new_branchname(const char *name, struct strbuf *ref,
223 int force, int attr_only)
225 if (strbuf_check_branch_ref(ref, name))
226 die(_("'%s' is not a valid branch name."), name);
228 if (!ref_exists(ref->buf))
230 else if (!force && !attr_only)
231 die(_("A branch named '%s' already exists."), ref->buf + strlen("refs/heads/"));
235 unsigned char sha1[20];
237 head = resolve_ref_unsafe("HEAD", sha1, 0, NULL);
238 if (!is_bare_repository() && head && !strcmp(head, ref->buf))
239 die(_("Cannot force update the current branch."));
244 static int check_tracking_branch(struct remote *remote, void *cb_data)
246 char *tracking_branch = cb_data;
247 struct refspec query;
248 memset(&query, 0, sizeof(struct refspec));
249 query.dst = tracking_branch;
250 return !remote_find_tracking(remote, &query);
253 static int validate_remote_tracking_branch(char *ref)
255 return !for_each_remote(check_tracking_branch, ref);
258 static const char upstream_not_branch[] =
259 N_("Cannot setup tracking information; starting point '%s' is not a branch.");
260 static const char upstream_missing[] =
261 N_("the requested upstream branch '%s' does not exist");
262 static const char upstream_advice[] =
264 "If you are planning on basing your work on an upstream\n"
265 "branch that already exists at the remote, you may need to\n"
266 "run \"git fetch\" to retrieve it.\n"
268 "If you are planning to push out a new local branch that\n"
269 "will track its remote counterpart, you may want to use\n"
270 "\"git push -u\" to set the upstream config as you push.");
272 void create_branch(const char *head,
273 const char *name, const char *start_name,
274 int force, int reflog, int clobber_head,
275 int quiet, enum branch_track track)
277 struct ref_lock *lock = NULL;
278 struct commit *commit;
279 unsigned char sha1[20];
280 char *real_ref, msg[PATH_MAX + 20];
281 struct strbuf ref = STRBUF_INIT;
283 int dont_change_ref = 0;
284 int explicit_tracking = 0;
286 if (track == BRANCH_TRACK_EXPLICIT || track == BRANCH_TRACK_OVERRIDE)
287 explicit_tracking = 1;
289 if (validate_new_branchname(name, &ref, force,
290 track == BRANCH_TRACK_OVERRIDE ||
299 if (get_sha1(start_name, sha1)) {
300 if (explicit_tracking) {
301 if (advice_set_upstream_failure) {
302 error(_(upstream_missing), start_name);
303 advise(_(upstream_advice));
306 die(_(upstream_missing), start_name);
308 die(_("Not a valid object name: '%s'."), start_name);
311 switch (dwim_ref(start_name, strlen(start_name), sha1, &real_ref)) {
313 /* Not branching from any existing branch */
314 if (explicit_tracking)
315 die(_(upstream_not_branch), start_name);
318 /* Unique completion -- good, only if it is a real branch */
319 if (!starts_with(real_ref, "refs/heads/") &&
320 validate_remote_tracking_branch(real_ref)) {
321 if (explicit_tracking)
322 die(_(upstream_not_branch), start_name);
328 die(_("Ambiguous object name: '%s'."), start_name);
332 if ((commit = lookup_commit_reference(sha1)) == NULL)
333 die(_("Not a valid branch point: '%s'."), start_name);
334 hashcpy(sha1, commit->object.sha1);
336 if (!dont_change_ref) {
337 lock = lock_any_ref_for_update(ref.buf, NULL, 0, NULL);
339 die_errno(_("Failed to lock ref for update"));
343 log_all_ref_updates = 1;
346 snprintf(msg, sizeof msg, "branch: Reset to %s",
348 else if (!dont_change_ref)
349 snprintf(msg, sizeof msg, "branch: Created from %s",
352 if (real_ref && track)
353 setup_tracking(ref.buf + 11, real_ref, track, quiet);
355 if (!dont_change_ref)
356 if (write_ref_sha1(lock, sha1, msg) < 0)
357 die_errno(_("Failed to write ref"));
359 strbuf_release(&ref);
363 void remove_branch_state(void)
365 unlink(git_path("CHERRY_PICK_HEAD"));
366 unlink(git_path("REVERT_HEAD"));
367 unlink(git_path("MERGE_HEAD"));
368 unlink(git_path("MERGE_RR"));
369 unlink(git_path("MERGE_MSG"));
370 unlink(git_path("MERGE_MODE"));
371 unlink(git_path("SQUASH_MSG"));