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"
11 
12 struct tracking {
13 	struct refspec_item spec;
14 	char *src;
15 	const char *remote;
16 	int matches;
17 };
18 
find_tracked_branch(struct remote * remote,void * priv)19 static int find_tracked_branch(struct remote *remote, void *priv)
20 {
21 	struct tracking *tracking = priv;
22 
23 	if (!remote_find_tracking(remote, &tracking->spec)) {
24 		if (++tracking->matches == 1) {
25 			tracking->src = tracking->spec.src;
26 			tracking->remote = remote->name;
27 		} else {
28 			free(tracking->spec.src);
29 			FREE_AND_NULL(tracking->src);
30 		}
31 		tracking->spec.src = NULL;
32 	}
33 
34 	return 0;
35 }
36 
should_setup_rebase(const char * origin)37 static int should_setup_rebase(const char *origin)
38 {
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;
48 	}
49 	return 0;
50 }
51 
52 static const char tracking_advice[] =
53 N_("\n"
54 "After fixing the error cause you may try to fix up\n"
55 "the remote tracking information by invoking\n"
56 "\"git branch --set-upstream-to=%s%s%s\".");
57 
install_branch_config(int flag,const char * local,const char * origin,const char * remote)58 int install_branch_config(int flag, const char *local, const char *origin, const char *remote)
59 {
60 	const char *shortname = NULL;
61 	struct strbuf key = STRBUF_INIT;
62 	int rebasing = should_setup_rebase(origin);
63 
64 	if (skip_prefix(remote, "refs/heads/", &shortname)
65 	    && !strcmp(local, shortname)
66 	    && !origin) {
67 		warning(_("Not setting branch %s as its own upstream."),
68 			local);
69 		return 0;
70 	}
71 
72 	strbuf_addf(&key, "branch.%s.remote", local);
73 	if (git_config_set_gently(key.buf, origin ? origin : ".") < 0)
74 		goto out_err;
75 
76 	strbuf_reset(&key);
77 	strbuf_addf(&key, "branch.%s.merge", local);
78 	if (git_config_set_gently(key.buf, remote) < 0)
79 		goto out_err;
80 
81 	if (rebasing) {
82 		strbuf_reset(&key);
83 		strbuf_addf(&key, "branch.%s.rebase", local);
84 		if (git_config_set_gently(key.buf, "true") < 0)
85 			goto out_err;
86 	}
87 	strbuf_release(&key);
88 
89 	if (flag & BRANCH_CONFIG_VERBOSE) {
90 		if (shortname) {
91 			if (origin)
92 				printf_ln(rebasing ?
93 					  _("Branch '%s' set up to track remote branch '%s' from '%s' by rebasing.") :
94 					  _("Branch '%s' set up to track remote branch '%s' from '%s'."),
95 					  local, shortname, origin);
96 			else
97 				printf_ln(rebasing ?
98 					  _("Branch '%s' set up to track local branch '%s' by rebasing.") :
99 					  _("Branch '%s' set up to track local branch '%s'."),
100 					  local, shortname);
101 		} else {
102 			if (origin)
103 				printf_ln(rebasing ?
104 					  _("Branch '%s' set up to track remote ref '%s' by rebasing.") :
105 					  _("Branch '%s' set up to track remote ref '%s'."),
106 					  local, remote);
107 			else
108 				printf_ln(rebasing ?
109 					  _("Branch '%s' set up to track local ref '%s' by rebasing.") :
110 					  _("Branch '%s' set up to track local ref '%s'."),
111 					  local, remote);
112 		}
113 	}
114 
115 	return 0;
116 
117 out_err:
118 	strbuf_release(&key);
119 	error(_("Unable to write upstream branch configuration"));
120 
121 	advise(_(tracking_advice),
122 	       origin ? origin : "",
123 	       origin ? "/" : "",
124 	       shortname ? shortname : remote);
125 
126 	return -1;
127 }
128 
129 /*
130  * This is called when new_ref is branched off of orig_ref, and tries
131  * to infer the settings for branch.<new_ref>.{remote,merge} from the
132  * config.
133  */
setup_tracking(const char * new_ref,const char * orig_ref,enum branch_track track,int quiet)134 static void setup_tracking(const char *new_ref, const char *orig_ref,
135 			   enum branch_track track, int quiet)
136 {
137 	struct tracking tracking;
138 	int config_flags = quiet ? 0 : BRANCH_CONFIG_VERBOSE;
139 
140 	memset(&tracking, 0, sizeof(tracking));
141 	tracking.spec.dst = (char *)orig_ref;
142 	if (for_each_remote(find_tracked_branch, &tracking))
143 		return;
144 
145 	if (!tracking.matches)
146 		switch (track) {
147 		case BRANCH_TRACK_ALWAYS:
148 		case BRANCH_TRACK_EXPLICIT:
149 		case BRANCH_TRACK_OVERRIDE:
150 			break;
151 		default:
152 			return;
153 		}
154 
155 	if (tracking.matches > 1)
156 		die(_("Not tracking: ambiguous information for ref %s"),
157 		    orig_ref);
158 
159 	if (install_branch_config(config_flags, new_ref, tracking.remote,
160 			      tracking.src ? tracking.src : orig_ref) < 0)
161 		exit(-1);
162 
163 	free(tracking.src);
164 }
165 
read_branch_desc(struct strbuf * buf,const char * branch_name)166 int read_branch_desc(struct strbuf *buf, const char *branch_name)
167 {
168 	char *v = NULL;
169 	struct strbuf name = STRBUF_INIT;
170 	strbuf_addf(&name, "branch.%s.description", branch_name);
171 	if (git_config_get_string(name.buf, &v)) {
172 		strbuf_release(&name);
173 		return -1;
174 	}
175 	strbuf_addstr(buf, v);
176 	free(v);
177 	strbuf_release(&name);
178 	return 0;
179 }
180 
181 /*
182  * Check if 'name' can be a valid name for a branch; die otherwise.
183  * Return 1 if the named branch already exists; return 0 otherwise.
184  * Fill ref with the full refname for the branch.
185  */
validate_branchname(const char * name,struct strbuf * ref)186 int validate_branchname(const char *name, struct strbuf *ref)
187 {
188 	if (strbuf_check_branch_ref(ref, name))
189 		die(_("'%s' is not a valid branch name."), name);
190 
191 	return ref_exists(ref->buf);
192 }
193 
194 /*
195  * Check if a branch 'name' can be created as a new branch; die otherwise.
196  * 'force' can be used when it is OK for the named branch already exists.
197  * Return 1 if the named branch already exists; return 0 otherwise.
198  * Fill ref with the full refname for the branch.
199  */
validate_new_branchname(const char * name,struct strbuf * ref,int force)200 int validate_new_branchname(const char *name, struct strbuf *ref, int force)
201 {
202 	const char *head;
203 
204 	if (!validate_branchname(name, ref))
205 		return 0;
206 
207 	if (!force)
208 		die(_("A branch named '%s' already exists."),
209 		    ref->buf + strlen("refs/heads/"));
210 
211 	head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
212 	if (!is_bare_repository() && head && !strcmp(head, ref->buf))
213 		die(_("Cannot force update the current branch."));
214 
215 	return 1;
216 }
217 
check_tracking_branch(struct remote * remote,void * cb_data)218 static int check_tracking_branch(struct remote *remote, void *cb_data)
219 {
220 	char *tracking_branch = cb_data;
221 	struct refspec_item query;
222 	memset(&query, 0, sizeof(struct refspec_item));
223 	query.dst = tracking_branch;
224 	return !remote_find_tracking(remote, &query);
225 }
226 
validate_remote_tracking_branch(char * ref)227 static int validate_remote_tracking_branch(char *ref)
228 {
229 	return !for_each_remote(check_tracking_branch, ref);
230 }
231 
232 static const char upstream_not_branch[] =
233 N_("Cannot setup tracking information; starting point '%s' is not a branch.");
234 static const char upstream_missing[] =
235 N_("the requested upstream branch '%s' does not exist");
236 static const char upstream_advice[] =
237 N_("\n"
238 "If you are planning on basing your work on an upstream\n"
239 "branch that already exists at the remote, you may need to\n"
240 "run \"git fetch\" to retrieve it.\n"
241 "\n"
242 "If you are planning to push out a new local branch that\n"
243 "will track its remote counterpart, you may want to use\n"
244 "\"git push -u\" to set the upstream config as you push.");
245 
create_branch(struct repository * r,const char * name,const char * start_name,int force,int clobber_head_ok,int reflog,int quiet,enum branch_track track)246 void create_branch(struct repository *r,
247 		   const char *name, const char *start_name,
248 		   int force, int clobber_head_ok, int reflog,
249 		   int quiet, enum branch_track track)
250 {
251 	struct commit *commit;
252 	struct object_id oid;
253 	char *real_ref;
254 	struct strbuf ref = STRBUF_INIT;
255 	int forcing = 0;
256 	int dont_change_ref = 0;
257 	int explicit_tracking = 0;
258 
259 	if (track == BRANCH_TRACK_EXPLICIT || track == BRANCH_TRACK_OVERRIDE)
260 		explicit_tracking = 1;
261 
262 	if ((track == BRANCH_TRACK_OVERRIDE || clobber_head_ok)
263 	    ? validate_branchname(name, &ref)
264 	    : validate_new_branchname(name, &ref, force)) {
265 		if (!force)
266 			dont_change_ref = 1;
267 		else
268 			forcing = 1;
269 	}
270 
271 	real_ref = NULL;
272 	if (get_oid_mb(start_name, &oid)) {
273 		if (explicit_tracking) {
274 			if (advice_enabled(ADVICE_SET_UPSTREAM_FAILURE)) {
275 				error(_(upstream_missing), start_name);
276 				advise(_(upstream_advice));
277 				exit(1);
278 			}
279 			die(_(upstream_missing), start_name);
280 		}
281 		die(_("Not a valid object name: '%s'."), start_name);
282 	}
283 
284 	switch (dwim_ref(start_name, strlen(start_name), &oid, &real_ref, 0)) {
285 	case 0:
286 		/* Not branching from any existing branch */
287 		if (explicit_tracking)
288 			die(_(upstream_not_branch), start_name);
289 		break;
290 	case 1:
291 		/* Unique completion -- good, only if it is a real branch */
292 		if (!starts_with(real_ref, "refs/heads/") &&
293 		    validate_remote_tracking_branch(real_ref)) {
294 			if (explicit_tracking)
295 				die(_(upstream_not_branch), start_name);
296 			else
297 				FREE_AND_NULL(real_ref);
298 		}
299 		break;
300 	default:
301 		die(_("Ambiguous object name: '%s'."), start_name);
302 		break;
303 	}
304 
305 	if ((commit = lookup_commit_reference(r, &oid)) == NULL)
306 		die(_("Not a valid branch point: '%s'."), start_name);
307 	oidcpy(&oid, &commit->object.oid);
308 
309 	if (reflog)
310 		log_all_ref_updates = LOG_REFS_NORMAL;
311 
312 	if (!dont_change_ref) {
313 		struct ref_transaction *transaction;
314 		struct strbuf err = STRBUF_INIT;
315 		char *msg;
316 
317 		if (forcing)
318 			msg = xstrfmt("branch: Reset to %s", start_name);
319 		else
320 			msg = xstrfmt("branch: Created from %s", start_name);
321 
322 		transaction = ref_transaction_begin(&err);
323 		if (!transaction ||
324 		    ref_transaction_update(transaction, ref.buf,
325 					   &oid, forcing ? NULL : null_oid(),
326 					   0, msg, &err) ||
327 		    ref_transaction_commit(transaction, &err))
328 			die("%s", err.buf);
329 		ref_transaction_free(transaction);
330 		strbuf_release(&err);
331 		free(msg);
332 	}
333 
334 	if (real_ref && track)
335 		setup_tracking(ref.buf + 11, real_ref, track, quiet);
336 
337 	strbuf_release(&ref);
338 	free(real_ref);
339 }
340 
remove_merge_branch_state(struct repository * r)341 void remove_merge_branch_state(struct repository *r)
342 {
343 	unlink(git_path_merge_head(r));
344 	unlink(git_path_merge_rr(r));
345 	unlink(git_path_merge_msg(r));
346 	unlink(git_path_merge_mode(r));
347 	unlink(git_path_auto_merge(r));
348 	save_autostash(git_path_merge_autostash(r));
349 }
350 
remove_branch_state(struct repository * r,int verbose)351 void remove_branch_state(struct repository *r, int verbose)
352 {
353 	sequencer_post_commit_cleanup(r, verbose);
354 	unlink(git_path_squash_msg(r));
355 	remove_merge_branch_state(r);
356 }
357 
die_if_checked_out(const char * branch,int ignore_current_worktree)358 void die_if_checked_out(const char *branch, int ignore_current_worktree)
359 {
360 	const struct worktree *wt;
361 
362 	wt = find_shared_symref("HEAD", branch);
363 	if (!wt || (ignore_current_worktree && wt->is_current))
364 		return;
365 	skip_prefix(branch, "refs/heads/", &branch);
366 	die(_("'%s' is already checked out at '%s'"),
367 	    branch, wt->path);
368 }
369 
replace_each_worktree_head_symref(const char * oldref,const char * newref,const char * logmsg)370 int replace_each_worktree_head_symref(const char *oldref, const char *newref,
371 				      const char *logmsg)
372 {
373 	int ret = 0;
374 	struct worktree **worktrees = get_worktrees();
375 	int i;
376 
377 	for (i = 0; worktrees[i]; i++) {
378 		struct ref_store *refs;
379 
380 		if (worktrees[i]->is_detached)
381 			continue;
382 		if (!worktrees[i]->head_ref)
383 			continue;
384 		if (strcmp(oldref, worktrees[i]->head_ref))
385 			continue;
386 
387 		refs = get_worktree_ref_store(worktrees[i]);
388 		if (refs_create_symref(refs, "HEAD", newref, logmsg))
389 			ret = error(_("HEAD of working tree %s is not updated"),
390 				    worktrees[i]->path);
391 	}
392 
393 	free_worktrees(worktrees);
394 	return ret;
395 }
396