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.rebase", local);
75 git_config_set(key.buf, "true");
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);
106 void install_branch_base(const char *local, const unsigned char *tail)
108 struct strbuf ref = STRBUF_INIT;
110 strbuf_addf(&ref, "refs/tails/%s", local);
111 update_ref(NULL, ref.buf, tail, NULL, 0, MSG_ON_ERR);
113 strbuf_release(&ref);
117 * This is called when new_ref is branched off of orig_ref, and tries
118 * to infer the settings for branch.<new_ref>.{remote,merge} from the
121 static int setup_tracking(const char *new_ref, const char *orig_ref,
122 enum branch_track track, int quiet)
124 struct tracking tracking;
125 int config_flags = quiet ? 0 : BRANCH_CONFIG_VERBOSE;
127 if (strlen(new_ref) > 1024 - 7 - 7 - 1)
128 return error(_("Tracking not set up: name too long: %s"),
131 memset(&tracking, 0, sizeof(tracking));
132 tracking.spec.dst = (char *)orig_ref;
133 if (for_each_remote(find_tracked_branch, &tracking))
136 if (!tracking.matches)
138 case BRANCH_TRACK_ALWAYS:
139 case BRANCH_TRACK_EXPLICIT:
140 case BRANCH_TRACK_OVERRIDE:
146 if (tracking.matches > 1)
147 return error(_("Not tracking: ambiguous information for ref %s"),
150 install_branch_config(config_flags, new_ref, tracking.remote,
151 tracking.src ? tracking.src : orig_ref);
157 struct branch_desc_cb {
158 const char *config_name;
162 static int read_branch_desc_cb(const char *var, const char *value, void *cb)
164 struct branch_desc_cb *desc = cb;
165 if (strcmp(desc->config_name, var))
167 free((char *)desc->value);
168 return git_config_string(&desc->value, var, value);
171 int read_branch_desc(struct strbuf *buf, const char *branch_name)
173 struct branch_desc_cb cb;
174 struct strbuf name = STRBUF_INIT;
175 strbuf_addf(&name, "branch.%s.description", branch_name);
176 cb.config_name = name.buf;
178 if (git_config(read_branch_desc_cb, &cb) < 0) {
179 strbuf_release(&name);
183 strbuf_addstr(buf, cb.value);
184 strbuf_release(&name);
188 int validate_new_branchname(const char *name, struct strbuf *ref,
189 int force, int attr_only)
191 if (strbuf_check_branch_ref(ref, name))
192 die(_("'%s' is not a valid branch name."), name);
194 if (!ref_exists(ref->buf))
196 else if (!force && !attr_only)
197 die(_("A branch named '%s' already exists."), ref->buf + strlen("refs/heads/"));
201 unsigned char sha1[20];
203 head = resolve_ref_unsafe("HEAD", sha1, 0, NULL);
204 if (!is_bare_repository() && head && !strcmp(head, ref->buf))
205 die(_("Cannot force update the current branch."));
210 static int check_tracking_branch(struct remote *remote, void *cb_data)
212 char *tracking_branch = cb_data;
213 struct refspec query;
214 memset(&query, 0, sizeof(struct refspec));
215 query.dst = tracking_branch;
216 return !remote_find_tracking(remote, &query);
219 static int validate_remote_tracking_branch(char *ref)
221 return !for_each_remote(check_tracking_branch, ref);
224 static const char upstream_not_branch[] =
225 N_("Cannot setup tracking information; starting point '%s' is not a branch.");
226 static const char upstream_missing[] =
227 N_("the requested upstream branch '%s' does not exist");
228 static const char upstream_advice[] =
230 "If you are planning on basing your work on an upstream\n"
231 "branch that already exists at the remote, you may need to\n"
232 "run \"git fetch\" to retrieve it.\n"
234 "If you are planning to push out a new local branch that\n"
235 "will track its remote counterpart, you may want to use\n"
236 "\"git push -u\" to set the upstream config as you push.");
238 void create_branch(const char *head,
239 const char *name, const char *start_name,
240 int force, int reflog, int clobber_head,
241 int quiet, enum branch_track track)
243 struct ref_lock *lock = NULL;
244 struct commit *commit;
245 unsigned char sha1[20];
246 char *real_ref, msg[PATH_MAX + 20];
247 struct strbuf ref = STRBUF_INIT;
249 int dont_change_ref = 0;
250 int explicit_tracking = 0;
252 if (track == BRANCH_TRACK_EXPLICIT || track == BRANCH_TRACK_OVERRIDE)
253 explicit_tracking = 1;
255 if (validate_new_branchname(name, &ref, force,
256 track == BRANCH_TRACK_OVERRIDE ||
265 if (get_sha1(start_name, sha1)) {
266 if (explicit_tracking) {
267 if (advice_set_upstream_failure) {
268 error(_(upstream_missing), start_name);
269 advise(_(upstream_advice));
272 die(_(upstream_missing), start_name);
274 die(_("Not a valid object name: '%s'."), start_name);
277 switch (dwim_ref(start_name, strlen(start_name), sha1, &real_ref)) {
279 /* Not branching from any existing branch */
280 if (explicit_tracking)
281 die(_(upstream_not_branch), start_name);
284 /* Unique completion -- good, only if it is a real branch */
285 if (!starts_with(real_ref, "refs/heads/") &&
286 validate_remote_tracking_branch(real_ref)) {
287 if (explicit_tracking)
288 die(_(upstream_not_branch), start_name);
294 die(_("Ambiguous object name: '%s'."), start_name);
298 if ((commit = lookup_commit_reference(sha1)) == NULL)
299 die(_("Not a valid branch point: '%s'."), start_name);
300 hashcpy(sha1, commit->object.sha1);
302 if (!dont_change_ref) {
303 lock = lock_any_ref_for_update(ref.buf, NULL, 0, NULL);
305 die_errno(_("Failed to lock ref for update"));
309 log_all_ref_updates = 1;
312 snprintf(msg, sizeof msg, "branch: Reset to %s",
314 else if (!dont_change_ref)
315 snprintf(msg, sizeof msg, "branch: Created from %s",
318 if (real_ref && track)
319 setup_tracking(ref.buf + 11, real_ref, track, quiet);
321 install_branch_base(ref.buf + 11, sha1);
323 if (!dont_change_ref)
324 if (write_ref_sha1(lock, sha1, msg) < 0)
325 die_errno(_("Failed to write ref"));
327 strbuf_release(&ref);
331 void remove_branch_state(void)
333 unlink(git_path("CHERRY_PICK_HEAD"));
334 unlink(git_path("REVERT_HEAD"));
335 unlink(git_path("MERGE_HEAD"));
336 unlink(git_path("MERGE_RR"));
337 unlink(git_path("MERGE_MSG"));
338 unlink(git_path("MERGE_MODE"));
339 unlink(git_path("SQUASH_MSG"));