blob: 7ff3f204964127374ae2a337819ce0bce7be9ab2 [file] [log] [blame]
Brian Gesiak303d1d02014-02-28 15:43:33 +09001#include "git-compat-util.h"
Daniel Barkalowe496c002008-02-07 11:40:08 -05002#include "cache.h"
3#include "branch.h"
4#include "refs.h"
5#include "remote.h"
6#include "commit.h"
Michael Rappazzoac6c5612015-10-02 07:55:31 -04007#include "worktree.h"
Daniel Barkalowe496c002008-02-07 11:40:08 -05008
9struct tracking {
10 struct refspec spec;
11 char *src;
12 const char *remote;
13 int matches;
14};
15
16static int find_tracked_branch(struct remote *remote, void *priv)
17{
18 struct tracking *tracking = priv;
19
20 if (!remote_find_tracking(remote, &tracking->spec)) {
21 if (++tracking->matches == 1) {
22 tracking->src = tracking->spec.src;
23 tracking->remote = remote->name;
24 } else {
25 free(tracking->spec.src);
26 if (tracking->src) {
27 free(tracking->src);
28 tracking->src = NULL;
29 }
30 }
31 tracking->spec.src = NULL;
32 }
33
34 return 0;
35}
36
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080037static int should_setup_rebase(const char *origin)
Dustin Sallingsc998ae92008-05-10 15:36:29 -070038{
39 switch (autorebase) {
40 case AUTOREBASE_NEVER:
41 return 0;
42 case AUTOREBASE_LOCAL:
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080043 return origin == NULL;
Dustin Sallingsc998ae92008-05-10 15:36:29 -070044 case AUTOREBASE_REMOTE:
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080045 return origin != NULL;
Dustin Sallingsc998ae92008-05-10 15:36:29 -070046 case AUTOREBASE_ALWAYS:
47 return 1;
48 }
49 return 0;
50}
51
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080052void install_branch_config(int flag, const char *local, const char *origin, const char *remote)
53{
Jeff Kingcf4fff52014-06-18 15:44:19 -040054 const char *shortname = NULL;
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080055 struct strbuf key = STRBUF_INIT;
56 int rebasing = should_setup_rebase(origin);
57
Jeff Kingcf4fff52014-06-18 15:44:19 -040058 if (skip_prefix(remote, "refs/heads/", &shortname)
Matthieu Moy85e22332010-01-18 22:44:12 +020059 && !strcmp(local, shortname)
60 && !origin) {
Jiang Xinbc554df2013-04-16 11:37:50 +080061 warning(_("Not setting branch %s as its own upstream."),
Matthieu Moy85e22332010-01-18 22:44:12 +020062 local);
63 return;
64 }
65
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080066 strbuf_addf(&key, "branch.%s.remote", local);
67 git_config_set(key.buf, origin ? origin : ".");
68
69 strbuf_reset(&key);
70 strbuf_addf(&key, "branch.%s.merge", local);
71 git_config_set(key.buf, remote);
72
73 if (rebasing) {
74 strbuf_reset(&key);
75 strbuf_addf(&key, "branch.%s.rebase", local);
76 git_config_set(key.buf, "true");
77 }
Nguyễn Thái Ngọc Duyd53a35032012-06-07 19:05:10 +070078 strbuf_release(&key);
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080079
Junio C Hamano72f60082009-03-10 01:20:42 -070080 if (flag & BRANCH_CONFIG_VERBOSE) {
Junio C Hamano1d9aaed2014-03-31 16:31:19 -070081 if (shortname) {
Adam9fe0cf32014-03-10 01:32:01 -040082 if (origin)
83 printf_ln(rebasing ?
84 _("Branch %s set up to track remote branch %s from %s by rebasing.") :
85 _("Branch %s set up to track remote branch %s from %s."),
86 local, shortname, origin);
87 else
88 printf_ln(rebasing ?
89 _("Branch %s set up to track local branch %s by rebasing.") :
90 _("Branch %s set up to track local branch %s."),
91 local, shortname);
92 } else {
93 if (origin)
94 printf_ln(rebasing ?
95 _("Branch %s set up to track remote ref %s by rebasing.") :
96 _("Branch %s set up to track remote ref %s."),
97 local, remote);
98 else
99 printf_ln(rebasing ?
100 _("Branch %s set up to track local ref %s by rebasing.") :
101 _("Branch %s set up to track local ref %s."),
102 local, remote);
103 }
Junio C Hamano72f60082009-03-10 01:20:42 -0700104 }
Junio C Hamanoa9f2c132009-03-03 22:29:55 -0800105}
106
Daniel Barkalowe496c002008-02-07 11:40:08 -0500107/*
108 * This is called when new_ref is branched off of orig_ref, and tries
109 * to infer the settings for branch.<new_ref>.{remote,merge} from the
110 * config.
111 */
Jay Soffian9ed36cf2008-02-19 11:24:37 -0500112static int setup_tracking(const char *new_ref, const char *orig_ref,
Jeff Kingf9a482e2012-03-26 19:51:01 -0400113 enum branch_track track, int quiet)
Daniel Barkalowe496c002008-02-07 11:40:08 -0500114{
Daniel Barkalowe496c002008-02-07 11:40:08 -0500115 struct tracking tracking;
Jeff Kingf9a482e2012-03-26 19:51:01 -0400116 int config_flags = quiet ? 0 : BRANCH_CONFIG_VERBOSE;
Daniel Barkalowe496c002008-02-07 11:40:08 -0500117
Daniel Barkalowe496c002008-02-07 11:40:08 -0500118 memset(&tracking, 0, sizeof(tracking));
119 tracking.spec.dst = (char *)orig_ref;
Jay Soffian9ed36cf2008-02-19 11:24:37 -0500120 if (for_each_remote(find_tracked_branch, &tracking))
Daniel Barkalowe496c002008-02-07 11:40:08 -0500121 return 1;
122
Jay Soffian9ed36cf2008-02-19 11:24:37 -0500123 if (!tracking.matches)
124 switch (track) {
125 case BRANCH_TRACK_ALWAYS:
126 case BRANCH_TRACK_EXPLICIT:
Ilari Liusvaara4fc50062010-01-18 22:44:11 +0200127 case BRANCH_TRACK_OVERRIDE:
Jay Soffian9ed36cf2008-02-19 11:24:37 -0500128 break;
129 default:
130 return 1;
131 }
132
Daniel Barkalowe496c002008-02-07 11:40:08 -0500133 if (tracking.matches > 1)
Jiang Xinbc554df2013-04-16 11:37:50 +0800134 return error(_("Not tracking: ambiguous information for ref %s"),
Daniel Barkalowe496c002008-02-07 11:40:08 -0500135 orig_ref);
136
Jeff Kingf9a482e2012-03-26 19:51:01 -0400137 install_branch_config(config_flags, new_ref, tracking.remote,
Junio C Hamanoa9f2c132009-03-03 22:29:55 -0800138 tracking.src ? tracking.src : orig_ref);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500139
Junio C Hamanoa9f2c132009-03-03 22:29:55 -0800140 free(tracking.src);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500141 return 0;
142}
143
Junio C Hamano6f9a3322011-09-21 20:19:38 -0700144int read_branch_desc(struct strbuf *buf, const char *branch_name)
145{
Tanay Abhra540b0f42014-08-07 23:26:42 +0530146 char *v = NULL;
Junio C Hamano6f9a3322011-09-21 20:19:38 -0700147 struct strbuf name = STRBUF_INIT;
148 strbuf_addf(&name, "branch.%s.description", branch_name);
Tanay Abhra540b0f42014-08-07 23:26:42 +0530149 if (git_config_get_string(name.buf, &v)) {
150 strbuf_release(&name);
151 return -1;
152 }
153 strbuf_addstr(buf, v);
154 free(v);
Junio C Hamano6f9a3322011-09-21 20:19:38 -0700155 strbuf_release(&name);
156 return 0;
157}
158
Junio C Hamanofa799372011-09-16 16:28:38 -0700159int validate_new_branchname(const char *name, struct strbuf *ref,
160 int force, int attr_only)
Conrad Irwin55c4a672011-08-20 14:49:48 -0700161{
Conrad Irwin55c4a672011-08-20 14:49:48 -0700162 if (strbuf_check_branch_ref(ref, name))
Jiang Xinbc554df2013-04-16 11:37:50 +0800163 die(_("'%s' is not a valid branch name."), name);
Conrad Irwin55c4a672011-08-20 14:49:48 -0700164
165 if (!ref_exists(ref->buf))
166 return 0;
Junio C Hamanofa799372011-09-16 16:28:38 -0700167 else if (!force && !attr_only)
Jiang Xinbc554df2013-04-16 11:37:50 +0800168 die(_("A branch named '%s' already exists."), ref->buf + strlen("refs/heads/"));
Conrad Irwin55c4a672011-08-20 14:49:48 -0700169
Junio C Hamanofa799372011-09-16 16:28:38 -0700170 if (!attr_only) {
171 const char *head;
172 unsigned char sha1[20];
Conrad Irwin55c4a672011-08-20 14:49:48 -0700173
Ronnie Sahlberg7695d112014-07-15 12:59:36 -0700174 head = resolve_ref_unsafe("HEAD", 0, sha1, NULL);
Junio C Hamanofa799372011-09-16 16:28:38 -0700175 if (!is_bare_repository() && head && !strcmp(head, ref->buf))
Jiang Xinbc554df2013-04-16 11:37:50 +0800176 die(_("Cannot force update the current branch."));
Junio C Hamanofa799372011-09-16 16:28:38 -0700177 }
Conrad Irwin55c4a672011-08-20 14:49:48 -0700178 return 1;
179}
180
Johan Herland41c21f22013-04-21 23:52:05 +0200181static int check_tracking_branch(struct remote *remote, void *cb_data)
182{
183 char *tracking_branch = cb_data;
184 struct refspec query;
185 memset(&query, 0, sizeof(struct refspec));
186 query.dst = tracking_branch;
Per Cederqvist1d7358c2013-09-08 22:58:15 +0200187 return !remote_find_tracking(remote, &query);
Johan Herland41c21f22013-04-21 23:52:05 +0200188}
189
190static int validate_remote_tracking_branch(char *ref)
191{
192 return !for_each_remote(check_tracking_branch, ref);
193}
194
Jeff Kinge2b6aa52013-04-02 15:03:55 -0400195static const char upstream_not_branch[] =
Jeff King1a15d002013-04-02 15:04:51 -0400196N_("Cannot setup tracking information; starting point '%s' is not a branch.");
Jeff Kinga5e91c72013-04-02 15:04:27 -0400197static const char upstream_missing[] =
Jeff Kingcaa20362013-04-02 15:05:12 -0400198N_("the requested upstream branch '%s' does not exist");
199static const char upstream_advice[] =
200N_("\n"
201"If you are planning on basing your work on an upstream\n"
202"branch that already exists at the remote, you may need to\n"
203"run \"git fetch\" to retrieve it.\n"
204"\n"
205"If you are planning to push out a new local branch that\n"
206"will track its remote counterpart, you may want to use\n"
207"\"git push -u\" to set the upstream config as you push.");
Jeff Kinge2b6aa52013-04-02 15:03:55 -0400208
Daniel Barkalowe496c002008-02-07 11:40:08 -0500209void create_branch(const char *head,
210 const char *name, const char *start_name,
Jonathan Nieder39bd6f72011-11-26 02:54:55 -0600211 int force, int reflog, int clobber_head,
Jeff Kingf9a482e2012-03-26 19:51:01 -0400212 int quiet, enum branch_track track)
Daniel Barkalowe496c002008-02-07 11:40:08 -0500213{
Daniel Barkalowe496c002008-02-07 11:40:08 -0500214 struct commit *commit;
215 unsigned char sha1[20];
Junio C Hamano8415d5c2009-02-13 23:08:05 -0800216 char *real_ref, msg[PATH_MAX + 20];
217 struct strbuf ref = STRBUF_INIT;
Daniel Barkalowe496c002008-02-07 11:40:08 -0500218 int forcing = 0;
Ilari Liusvaara4fc50062010-01-18 22:44:11 +0200219 int dont_change_ref = 0;
220 int explicit_tracking = 0;
221
222 if (track == BRANCH_TRACK_EXPLICIT || track == BRANCH_TRACK_OVERRIDE)
223 explicit_tracking = 1;
Daniel Barkalowe496c002008-02-07 11:40:08 -0500224
Junio C Hamanofa799372011-09-16 16:28:38 -0700225 if (validate_new_branchname(name, &ref, force,
Jonathan Nieder39bd6f72011-11-26 02:54:55 -0600226 track == BRANCH_TRACK_OVERRIDE ||
227 clobber_head)) {
Conrad Irwin55c4a672011-08-20 14:49:48 -0700228 if (!force)
Ilari Liusvaara4fc50062010-01-18 22:44:11 +0200229 dont_change_ref = 1;
Conrad Irwin55c4a672011-08-20 14:49:48 -0700230 else
231 forcing = 1;
Daniel Barkalowe496c002008-02-07 11:40:08 -0500232 }
233
234 real_ref = NULL;
Jeff Kinga5e91c72013-04-02 15:04:27 -0400235 if (get_sha1(start_name, sha1)) {
Jeff Kingcaa20362013-04-02 15:05:12 -0400236 if (explicit_tracking) {
237 if (advice_set_upstream_failure) {
238 error(_(upstream_missing), start_name);
239 advise(_(upstream_advice));
240 exit(1);
241 }
Jeff King1a15d002013-04-02 15:04:51 -0400242 die(_(upstream_missing), start_name);
Jeff Kingcaa20362013-04-02 15:05:12 -0400243 }
Jiang Xinbc554df2013-04-16 11:37:50 +0800244 die(_("Not a valid object name: '%s'."), start_name);
Jeff Kinga5e91c72013-04-02 15:04:27 -0400245 }
Daniel Barkalowe496c002008-02-07 11:40:08 -0500246
247 switch (dwim_ref(start_name, strlen(start_name), sha1, &real_ref)) {
248 case 0:
249 /* Not branching from any existing branch */
Ilari Liusvaara4fc50062010-01-18 22:44:11 +0200250 if (explicit_tracking)
Jeff King1a15d002013-04-02 15:04:51 -0400251 die(_(upstream_not_branch), start_name);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500252 break;
253 case 1:
Johan Herland21b5b1e2011-02-17 00:12:20 +0100254 /* Unique completion -- good, only if it is a real branch */
Christian Couder59556542013-11-30 21:55:40 +0100255 if (!starts_with(real_ref, "refs/heads/") &&
Johan Herland41c21f22013-04-21 23:52:05 +0200256 validate_remote_tracking_branch(real_ref)) {
Johan Herland21b5b1e2011-02-17 00:12:20 +0100257 if (explicit_tracking)
Jeff King1a15d002013-04-02 15:04:51 -0400258 die(_(upstream_not_branch), start_name);
Johan Herland21b5b1e2011-02-17 00:12:20 +0100259 else
260 real_ref = NULL;
261 }
Daniel Barkalowe496c002008-02-07 11:40:08 -0500262 break;
263 default:
Jiang Xinbc554df2013-04-16 11:37:50 +0800264 die(_("Ambiguous object name: '%s'."), start_name);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500265 break;
266 }
267
268 if ((commit = lookup_commit_reference(sha1)) == NULL)
Jiang Xinbc554df2013-04-16 11:37:50 +0800269 die(_("Not a valid branch point: '%s'."), start_name);
brian m. carlsoned1c9972015-11-10 02:22:29 +0000270 hashcpy(sha1, commit->object.oid.hash);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500271
Daniel Barkalowe496c002008-02-07 11:40:08 -0500272 if (forcing)
Junio C Hamanoda288e22010-04-09 20:42:10 -0700273 snprintf(msg, sizeof msg, "branch: Reset to %s",
Daniel Barkalowe496c002008-02-07 11:40:08 -0500274 start_name);
Ilari Liusvaara4fc50062010-01-18 22:44:11 +0200275 else if (!dont_change_ref)
Daniel Barkalowe496c002008-02-07 11:40:08 -0500276 snprintf(msg, sizeof msg, "branch: Created from %s",
277 start_name);
278
Ronnie Sahlbergd43f9902014-04-16 16:21:53 -0700279 if (reflog)
280 log_all_ref_updates = 1;
281
282 if (!dont_change_ref) {
283 struct ref_transaction *transaction;
284 struct strbuf err = STRBUF_INIT;
285
286 transaction = ref_transaction_begin(&err);
287 if (!transaction ||
Michael Haggerty1d147bd2015-02-17 18:00:15 +0100288 ref_transaction_update(transaction, ref.buf,
289 sha1, forcing ? NULL : null_sha1,
290 0, msg, &err) ||
Ronnie Sahlbergdb7516a2014-04-30 12:22:42 -0700291 ref_transaction_commit(transaction, &err))
Ronnie Sahlbergd43f9902014-04-16 16:21:53 -0700292 die("%s", err.buf);
293 ref_transaction_free(transaction);
294 strbuf_release(&err);
295 }
296
Daniel Barkalowe496c002008-02-07 11:40:08 -0500297 if (real_ref && track)
Felipe Contreras82a06722013-08-30 16:56:46 -0500298 setup_tracking(ref.buf + 11, real_ref, track, quiet);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500299
Junio C Hamano8415d5c2009-02-13 23:08:05 -0800300 strbuf_release(&ref);
Jay Soffian9ed36cf2008-02-19 11:24:37 -0500301 free(real_ref);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500302}
Daniel Barkalowc369e7b2008-02-07 11:40:16 -0500303
304void remove_branch_state(void)
305{
Jeff Kingf9327292015-08-10 05:38:57 -0400306 unlink(git_path_cherry_pick_head());
307 unlink(git_path_revert_head());
308 unlink(git_path_merge_head());
309 unlink(git_path_merge_rr());
310 unlink(git_path_merge_msg());
311 unlink(git_path_merge_mode());
312 unlink(git_path_squash_msg());
Daniel Barkalowc369e7b2008-02-07 11:40:16 -0500313}
Eric Sunshineed89f842015-07-17 19:00:04 -0400314
David Turner41af6562015-08-10 13:52:44 -0400315void die_if_checked_out(const char *branch)
316{
317 char *existing;
318
319 existing = find_shared_symref("HEAD", branch);
320 if (existing) {
321 skip_prefix(branch, "refs/heads/", &branch);
322 die(_("'%s' is already checked out at '%s'"), branch, existing);
323 }
Eric Sunshineed89f842015-07-17 19:00:04 -0400324}