branch,checkout: fix --track usage strings
[git.git] / branch.c
bloba4e4631ef16722c3e360970d52356ee3f9693d35
1 #include "git-compat-util.h"
2 #include "cache.h"
3 #include "config.h"
4 #include "branch.h"
5 #include "refs.h"
6 #include "refspec.h"
7 #include "remote.h"
8 #include "sequencer.h"
9 #include "commit.h"
10 #include "worktree.h"
12 struct tracking {
13 struct refspec_item spec;
14 struct string_list *srcs;
15 const char *remote;
16 int matches;
19 static int find_tracked_branch(struct remote *remote, void *priv)
21 struct tracking *tracking = priv;
23 if (!remote_find_tracking(remote, &tracking->spec)) {
24 if (++tracking->matches == 1) {
25 string_list_append(tracking->srcs, tracking->spec.src);
26 tracking->remote = remote->name;
27 } else {
28 free(tracking->spec.src);
29 string_list_clear(tracking->srcs, 0);
31 tracking->spec.src = NULL;
34 return 0;
37 static int should_setup_rebase(const char *origin)
39 switch (autorebase) {
40 case AUTOREBASE_NEVER:
41 return 0;
42 case AUTOREBASE_LOCAL:
43 return origin == NULL;
44 case AUTOREBASE_REMOTE:
45 return origin != NULL;
46 case AUTOREBASE_ALWAYS:
47 return 1;
49 return 0;
52 /**
53 * Install upstream tracking configuration for a branch; specifically, add
54 * `branch.<name>.remote` and `branch.<name>.merge` entries.
56 * `flag` contains integer flags for options; currently only
57 * BRANCH_CONFIG_VERBOSE is checked.
59 * `local` is the name of the branch whose configuration we're installing.
61 * `origin` is the name of the remote owning the upstream branches. NULL means
62 * the upstream branches are local to this repo.
64 * `remotes` is a list of refs that are upstream of local
66 static int install_branch_config_multiple_remotes(int flag, const char *local,
67 const char *origin, struct string_list *remotes)
69 const char *shortname = NULL;
70 struct strbuf key = STRBUF_INIT;
71 struct string_list_item *item;
72 int rebasing = should_setup_rebase(origin);
74 if (!remotes->nr)
75 BUG("must provide at least one remote for branch config");
76 if (rebasing && remotes->nr > 1)
77 die(_("cannot inherit upstream tracking configuration of "
78 "multiple refs when rebasing is requested"));
81 * If the new branch is trying to track itself, something has gone
82 * wrong. Warn the user and don't proceed any further.
84 if (!origin)
85 for_each_string_list_item(item, remotes)
86 if (skip_prefix(item->string, "refs/heads/", &shortname)
87 && !strcmp(local, shortname)) {
88 warning(_("not setting branch '%s' as its own upstream."),
89 local);
90 return 0;
93 strbuf_addf(&key, "branch.%s.remote", local);
94 if (git_config_set_gently(key.buf, origin ? origin : ".") < 0)
95 goto out_err;
97 strbuf_reset(&key);
98 strbuf_addf(&key, "branch.%s.merge", local);
100 * We want to overwrite any existing config with all the branches in
101 * "remotes". Override any existing config, then write our branches. If
102 * more than one is provided, use CONFIG_REGEX_NONE to preserve what
103 * we've written so far.
105 if (git_config_set_gently(key.buf, NULL) < 0)
106 goto out_err;
107 for_each_string_list_item(item, remotes)
108 if (git_config_set_multivar_gently(key.buf, item->string, CONFIG_REGEX_NONE, 0) < 0)
109 goto out_err;
111 if (rebasing) {
112 strbuf_reset(&key);
113 strbuf_addf(&key, "branch.%s.rebase", local);
114 if (git_config_set_gently(key.buf, "true") < 0)
115 goto out_err;
117 strbuf_release(&key);
119 if (flag & BRANCH_CONFIG_VERBOSE) {
120 struct strbuf tmp_ref_name = STRBUF_INIT;
121 struct string_list friendly_ref_names = STRING_LIST_INIT_DUP;
123 for_each_string_list_item(item, remotes) {
124 shortname = item->string;
125 skip_prefix(shortname, "refs/heads/", &shortname);
126 if (origin) {
127 strbuf_addf(&tmp_ref_name, "%s/%s",
128 origin, shortname);
129 string_list_append_nodup(
130 &friendly_ref_names,
131 strbuf_detach(&tmp_ref_name, NULL));
132 } else {
133 string_list_append(
134 &friendly_ref_names, shortname);
138 if (remotes->nr == 1) {
140 * Rebasing is only allowed in the case of a single
141 * upstream branch.
143 printf_ln(rebasing ?
144 _("branch '%s' set up to track '%s' by rebasing.") :
145 _("branch '%s' set up to track '%s'."),
146 local, friendly_ref_names.items[0].string);
147 } else {
148 printf_ln(_("branch '%s' set up to track:"), local);
149 for_each_string_list_item(item, &friendly_ref_names)
150 printf_ln(" %s", item->string);
153 string_list_clear(&friendly_ref_names, 0);
156 return 0;
158 out_err:
159 strbuf_release(&key);
160 error(_("Unable to write upstream branch configuration"));
162 advise(_("\nAfter fixing the error cause you may try to fix up\n"
163 "the remote tracking information by invoking:"));
164 if (remotes->nr == 1)
165 advise(" git branch --set-upstream-to=%s%s%s",
166 origin ? origin : "",
167 origin ? "/" : "",
168 remotes->items[0].string);
169 else {
170 advise(" git config --add branch.\"%s\".remote %s",
171 local, origin ? origin : ".");
172 for_each_string_list_item(item, remotes)
173 advise(" git config --add branch.\"%s\".merge %s",
174 local, item->string);
177 return -1;
180 int install_branch_config(int flag, const char *local, const char *origin,
181 const char *remote)
183 int ret;
184 struct string_list remotes = STRING_LIST_INIT_DUP;
186 string_list_append(&remotes, remote);
187 ret = install_branch_config_multiple_remotes(flag, local, origin, &remotes);
188 string_list_clear(&remotes, 0);
189 return ret;
192 static int inherit_tracking(struct tracking *tracking, const char *orig_ref)
194 const char *bare_ref;
195 struct branch *branch;
196 int i;
198 bare_ref = orig_ref;
199 skip_prefix(orig_ref, "refs/heads/", &bare_ref);
201 branch = branch_get(bare_ref);
202 if (!branch->remote_name) {
203 warning(_("asked to inherit tracking from '%s', but no remote is set"),
204 bare_ref);
205 return -1;
208 if (branch->merge_nr < 1 || !branch->merge_name || !branch->merge_name[0]) {
209 warning(_("asked to inherit tracking from '%s', but no merge configuration is set"),
210 bare_ref);
211 return -1;
214 tracking->remote = xstrdup(branch->remote_name);
215 for (i = 0; i < branch->merge_nr; i++)
216 string_list_append(tracking->srcs, branch->merge_name[i]);
217 return 0;
221 * This is called when new_ref is branched off of orig_ref, and tries
222 * to infer the settings for branch.<new_ref>.{remote,merge} from the
223 * config.
225 static void setup_tracking(const char *new_ref, const char *orig_ref,
226 enum branch_track track, int quiet)
228 struct tracking tracking;
229 struct string_list tracking_srcs = STRING_LIST_INIT_DUP;
230 int config_flags = quiet ? 0 : BRANCH_CONFIG_VERBOSE;
232 memset(&tracking, 0, sizeof(tracking));
233 tracking.spec.dst = (char *)orig_ref;
234 tracking.srcs = &tracking_srcs;
235 if (track != BRANCH_TRACK_INHERIT)
236 for_each_remote(find_tracked_branch, &tracking);
237 else if (inherit_tracking(&tracking, orig_ref))
238 return;
240 if (!tracking.matches)
241 switch (track) {
242 case BRANCH_TRACK_ALWAYS:
243 case BRANCH_TRACK_EXPLICIT:
244 case BRANCH_TRACK_OVERRIDE:
245 case BRANCH_TRACK_INHERIT:
246 break;
247 default:
248 return;
251 if (tracking.matches > 1)
252 die(_("Not tracking: ambiguous information for ref %s"),
253 orig_ref);
255 if (tracking.srcs->nr < 1)
256 string_list_append(tracking.srcs, orig_ref);
257 if (install_branch_config_multiple_remotes(config_flags, new_ref,
258 tracking.remote, tracking.srcs) < 0)
259 exit(-1);
261 string_list_clear(tracking.srcs, 0);
264 int read_branch_desc(struct strbuf *buf, const char *branch_name)
266 char *v = NULL;
267 struct strbuf name = STRBUF_INIT;
268 strbuf_addf(&name, "branch.%s.description", branch_name);
269 if (git_config_get_string(name.buf, &v)) {
270 strbuf_release(&name);
271 return -1;
273 strbuf_addstr(buf, v);
274 free(v);
275 strbuf_release(&name);
276 return 0;
280 * Check if 'name' can be a valid name for a branch; die otherwise.
281 * Return 1 if the named branch already exists; return 0 otherwise.
282 * Fill ref with the full refname for the branch.
284 int validate_branchname(const char *name, struct strbuf *ref)
286 if (strbuf_check_branch_ref(ref, name))
287 die(_("'%s' is not a valid branch name."), name);
289 return ref_exists(ref->buf);
293 * Check if a branch 'name' can be created as a new branch; die otherwise.
294 * 'force' can be used when it is OK for the named branch already exists.
295 * Return 1 if the named branch already exists; return 0 otherwise.
296 * Fill ref with the full refname for the branch.
298 int validate_new_branchname(const char *name, struct strbuf *ref, int force)
300 const char *head;
302 if (!validate_branchname(name, ref))
303 return 0;
305 if (!force)
306 die(_("A branch named '%s' already exists."),
307 ref->buf + strlen("refs/heads/"));
309 head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
310 if (!is_bare_repository() && head && !strcmp(head, ref->buf))
311 die(_("Cannot force update the current branch."));
313 return 1;
316 static int check_tracking_branch(struct remote *remote, void *cb_data)
318 char *tracking_branch = cb_data;
319 struct refspec_item query;
320 memset(&query, 0, sizeof(struct refspec_item));
321 query.dst = tracking_branch;
322 return !remote_find_tracking(remote, &query);
325 static int validate_remote_tracking_branch(char *ref)
327 return !for_each_remote(check_tracking_branch, ref);
330 static const char upstream_not_branch[] =
331 N_("Cannot setup tracking information; starting point '%s' is not a branch.");
332 static const char upstream_missing[] =
333 N_("the requested upstream branch '%s' does not exist");
334 static const char upstream_advice[] =
335 N_("\n"
336 "If you are planning on basing your work on an upstream\n"
337 "branch that already exists at the remote, you may need to\n"
338 "run \"git fetch\" to retrieve it.\n"
339 "\n"
340 "If you are planning to push out a new local branch that\n"
341 "will track its remote counterpart, you may want to use\n"
342 "\"git push -u\" to set the upstream config as you push.");
344 void create_branch(struct repository *r,
345 const char *name, const char *start_name,
346 int force, int clobber_head_ok, int reflog,
347 int quiet, enum branch_track track)
349 struct commit *commit;
350 struct object_id oid;
351 char *real_ref;
352 struct strbuf ref = STRBUF_INIT;
353 int forcing = 0;
354 int dont_change_ref = 0;
355 int explicit_tracking = 0;
357 if (track == BRANCH_TRACK_EXPLICIT || track == BRANCH_TRACK_OVERRIDE)
358 explicit_tracking = 1;
360 if ((track == BRANCH_TRACK_OVERRIDE || clobber_head_ok)
361 ? validate_branchname(name, &ref)
362 : validate_new_branchname(name, &ref, force)) {
363 if (!force)
364 dont_change_ref = 1;
365 else
366 forcing = 1;
369 real_ref = NULL;
370 if (get_oid_mb(start_name, &oid)) {
371 if (explicit_tracking) {
372 if (advice_enabled(ADVICE_SET_UPSTREAM_FAILURE)) {
373 error(_(upstream_missing), start_name);
374 advise(_(upstream_advice));
375 exit(1);
377 die(_(upstream_missing), start_name);
379 die(_("Not a valid object name: '%s'."), start_name);
382 switch (dwim_ref(start_name, strlen(start_name), &oid, &real_ref, 0)) {
383 case 0:
384 /* Not branching from any existing branch */
385 if (explicit_tracking)
386 die(_(upstream_not_branch), start_name);
387 break;
388 case 1:
389 /* Unique completion -- good, only if it is a real branch */
390 if (!starts_with(real_ref, "refs/heads/") &&
391 validate_remote_tracking_branch(real_ref)) {
392 if (explicit_tracking)
393 die(_(upstream_not_branch), start_name);
394 else
395 FREE_AND_NULL(real_ref);
397 break;
398 default:
399 die(_("Ambiguous object name: '%s'."), start_name);
400 break;
403 if ((commit = lookup_commit_reference(r, &oid)) == NULL)
404 die(_("Not a valid branch point: '%s'."), start_name);
405 oidcpy(&oid, &commit->object.oid);
407 if (reflog)
408 log_all_ref_updates = LOG_REFS_NORMAL;
410 if (!dont_change_ref) {
411 struct ref_transaction *transaction;
412 struct strbuf err = STRBUF_INIT;
413 char *msg;
415 if (forcing)
416 msg = xstrfmt("branch: Reset to %s", start_name);
417 else
418 msg = xstrfmt("branch: Created from %s", start_name);
420 transaction = ref_transaction_begin(&err);
421 if (!transaction ||
422 ref_transaction_update(transaction, ref.buf,
423 &oid, forcing ? NULL : null_oid(),
424 0, msg, &err) ||
425 ref_transaction_commit(transaction, &err))
426 die("%s", err.buf);
427 ref_transaction_free(transaction);
428 strbuf_release(&err);
429 free(msg);
432 if (real_ref && track)
433 setup_tracking(ref.buf + 11, real_ref, track, quiet);
435 strbuf_release(&ref);
436 free(real_ref);
439 void remove_merge_branch_state(struct repository *r)
441 unlink(git_path_merge_head(r));
442 unlink(git_path_merge_rr(r));
443 unlink(git_path_merge_msg(r));
444 unlink(git_path_merge_mode(r));
445 unlink(git_path_auto_merge(r));
446 save_autostash(git_path_merge_autostash(r));
449 void remove_branch_state(struct repository *r, int verbose)
451 sequencer_post_commit_cleanup(r, verbose);
452 unlink(git_path_squash_msg(r));
453 remove_merge_branch_state(r);
456 void die_if_checked_out(const char *branch, int ignore_current_worktree)
458 const struct worktree *wt;
460 wt = find_shared_symref("HEAD", branch);
461 if (!wt || (ignore_current_worktree && wt->is_current))
462 return;
463 skip_prefix(branch, "refs/heads/", &branch);
464 die(_("'%s' is already checked out at '%s'"),
465 branch, wt->path);
468 int replace_each_worktree_head_symref(const char *oldref, const char *newref,
469 const char *logmsg)
471 int ret = 0;
472 struct worktree **worktrees = get_worktrees();
473 int i;
475 for (i = 0; worktrees[i]; i++) {
476 struct ref_store *refs;
478 if (worktrees[i]->is_detached)
479 continue;
480 if (!worktrees[i]->head_ref)
481 continue;
482 if (strcmp(oldref, worktrees[i]->head_ref))
483 continue;
485 refs = get_worktree_ref_store(worktrees[i]);
486 if (refs_create_symref(refs, "HEAD", newref, logmsg))
487 ret = error(_("HEAD of working tree %s is not updated"),
488 worktrees[i]->path);
491 free_worktrees(worktrees);
492 return ret;