blob: ecd710d7308c9d2be85cd3bcde4fd9d38dec0edc [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"
Brandon Williamsb2141fc2017-06-14 11:07:36 -07003#include "config.h"
Daniel Barkalowe496c002008-02-07 11:40:08 -05004#include "branch.h"
5#include "refs.h"
Brandon Williamsec0cb492018-05-16 15:57:48 -07006#include "refspec.h"
Daniel Barkalowe496c002008-02-07 11:40:08 -05007#include "remote.h"
8#include "commit.h"
Michael Rappazzoac6c5612015-10-02 07:55:31 -04009#include "worktree.h"
Daniel Barkalowe496c002008-02-07 11:40:08 -050010
11struct tracking {
Brandon Williams0ad4a5f2018-05-16 15:57:49 -070012 struct refspec_item spec;
Daniel Barkalowe496c002008-02-07 11:40:08 -050013 char *src;
14 const char *remote;
15 int matches;
16};
17
18static int find_tracked_branch(struct remote *remote, void *priv)
19{
20 struct tracking *tracking = priv;
21
22 if (!remote_find_tracking(remote, &tracking->spec)) {
23 if (++tracking->matches == 1) {
24 tracking->src = tracking->spec.src;
25 tracking->remote = remote->name;
26 } else {
27 free(tracking->spec.src);
28 if (tracking->src) {
Ævar Arnfjörð Bjarmason6a83d902017-06-15 23:15:46 +000029 FREE_AND_NULL(tracking->src);
Daniel Barkalowe496c002008-02-07 11:40:08 -050030 }
31 }
32 tracking->spec.src = NULL;
33 }
34
35 return 0;
36}
37
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080038static int should_setup_rebase(const char *origin)
Dustin Sallingsc998ae92008-05-10 15:36:29 -070039{
40 switch (autorebase) {
41 case AUTOREBASE_NEVER:
42 return 0;
43 case AUTOREBASE_LOCAL:
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080044 return origin == NULL;
Dustin Sallingsc998ae92008-05-10 15:36:29 -070045 case AUTOREBASE_REMOTE:
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080046 return origin != NULL;
Dustin Sallingsc998ae92008-05-10 15:36:29 -070047 case AUTOREBASE_ALWAYS:
48 return 1;
49 }
50 return 0;
51}
52
Patrick Steinhardt27852b22016-02-22 12:23:23 +010053static const char tracking_advice[] =
54N_("\n"
55"After fixing the error cause you may try to fix up\n"
56"the remote tracking information by invoking\n"
57"\"git branch --set-upstream-to=%s%s%s\".");
58
59int install_branch_config(int flag, const char *local, const char *origin, const char *remote)
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080060{
Jeff Kingcf4fff52014-06-18 15:44:19 -040061 const char *shortname = NULL;
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080062 struct strbuf key = STRBUF_INIT;
63 int rebasing = should_setup_rebase(origin);
64
Jeff Kingcf4fff52014-06-18 15:44:19 -040065 if (skip_prefix(remote, "refs/heads/", &shortname)
Matthieu Moy85e22332010-01-18 22:44:12 +020066 && !strcmp(local, shortname)
67 && !origin) {
Jiang Xinbc554df2013-04-16 11:37:50 +080068 warning(_("Not setting branch %s as its own upstream."),
Matthieu Moy85e22332010-01-18 22:44:12 +020069 local);
Patrick Steinhardt27852b22016-02-22 12:23:23 +010070 return 0;
Matthieu Moy85e22332010-01-18 22:44:12 +020071 }
72
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080073 strbuf_addf(&key, "branch.%s.remote", local);
Patrick Steinhardt30598ad2016-02-22 12:23:35 +010074 if (git_config_set_gently(key.buf, origin ? origin : ".") < 0)
Patrick Steinhardt27852b22016-02-22 12:23:23 +010075 goto out_err;
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080076
77 strbuf_reset(&key);
78 strbuf_addf(&key, "branch.%s.merge", local);
Patrick Steinhardt30598ad2016-02-22 12:23:35 +010079 if (git_config_set_gently(key.buf, remote) < 0)
Patrick Steinhardt27852b22016-02-22 12:23:23 +010080 goto out_err;
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080081
82 if (rebasing) {
83 strbuf_reset(&key);
84 strbuf_addf(&key, "branch.%s.rebase", local);
Patrick Steinhardt30598ad2016-02-22 12:23:35 +010085 if (git_config_set_gently(key.buf, "true") < 0)
Patrick Steinhardt27852b22016-02-22 12:23:23 +010086 goto out_err;
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080087 }
Nguyễn Thái Ngọc Duyd53a35032012-06-07 19:05:10 +070088 strbuf_release(&key);
Junio C Hamanoa9f2c132009-03-03 22:29:55 -080089
Junio C Hamano72f60082009-03-10 01:20:42 -070090 if (flag & BRANCH_CONFIG_VERBOSE) {
Junio C Hamano1d9aaed2014-03-31 16:31:19 -070091 if (shortname) {
Adam9fe0cf32014-03-10 01:32:01 -040092 if (origin)
93 printf_ln(rebasing ?
Kaartic Sivaraam9c93ff72017-08-17 08:24:25 +053094 _("Branch '%s' set up to track remote branch '%s' from '%s' by rebasing.") :
95 _("Branch '%s' set up to track remote branch '%s' from '%s'."),
Adam9fe0cf32014-03-10 01:32:01 -040096 local, shortname, origin);
97 else
98 printf_ln(rebasing ?
Kaartic Sivaraam9c93ff72017-08-17 08:24:25 +053099 _("Branch '%s' set up to track local branch '%s' by rebasing.") :
100 _("Branch '%s' set up to track local branch '%s'."),
Adam9fe0cf32014-03-10 01:32:01 -0400101 local, shortname);
102 } else {
103 if (origin)
104 printf_ln(rebasing ?
Kaartic Sivaraam9c93ff72017-08-17 08:24:25 +0530105 _("Branch '%s' set up to track remote ref '%s' by rebasing.") :
106 _("Branch '%s' set up to track remote ref '%s'."),
Adam9fe0cf32014-03-10 01:32:01 -0400107 local, remote);
108 else
109 printf_ln(rebasing ?
Kaartic Sivaraam9c93ff72017-08-17 08:24:25 +0530110 _("Branch '%s' set up to track local ref '%s' by rebasing.") :
111 _("Branch '%s' set up to track local ref '%s'."),
Adam9fe0cf32014-03-10 01:32:01 -0400112 local, remote);
113 }
Junio C Hamano72f60082009-03-10 01:20:42 -0700114 }
Patrick Steinhardt27852b22016-02-22 12:23:23 +0100115
116 return 0;
117
118out_err:
119 strbuf_release(&key);
120 error(_("Unable to write upstream branch configuration"));
121
122 advise(_(tracking_advice),
123 origin ? origin : "",
124 origin ? "/" : "",
125 shortname ? shortname : remote);
126
127 return -1;
Junio C Hamanoa9f2c132009-03-03 22:29:55 -0800128}
129
Daniel Barkalowe496c002008-02-07 11:40:08 -0500130/*
131 * This is called when new_ref is branched off of orig_ref, and tries
132 * to infer the settings for branch.<new_ref>.{remote,merge} from the
133 * config.
134 */
Patrick Steinhardt27852b22016-02-22 12:23:23 +0100135static void setup_tracking(const char *new_ref, const char *orig_ref,
136 enum branch_track track, int quiet)
Daniel Barkalowe496c002008-02-07 11:40:08 -0500137{
Daniel Barkalowe496c002008-02-07 11:40:08 -0500138 struct tracking tracking;
Jeff Kingf9a482e2012-03-26 19:51:01 -0400139 int config_flags = quiet ? 0 : BRANCH_CONFIG_VERBOSE;
Daniel Barkalowe496c002008-02-07 11:40:08 -0500140
Daniel Barkalowe496c002008-02-07 11:40:08 -0500141 memset(&tracking, 0, sizeof(tracking));
142 tracking.spec.dst = (char *)orig_ref;
Jay Soffian9ed36cf2008-02-19 11:24:37 -0500143 if (for_each_remote(find_tracked_branch, &tracking))
Patrick Steinhardt27852b22016-02-22 12:23:23 +0100144 return;
Daniel Barkalowe496c002008-02-07 11:40:08 -0500145
Jay Soffian9ed36cf2008-02-19 11:24:37 -0500146 if (!tracking.matches)
147 switch (track) {
148 case BRANCH_TRACK_ALWAYS:
149 case BRANCH_TRACK_EXPLICIT:
Ilari Liusvaara4fc50062010-01-18 22:44:11 +0200150 case BRANCH_TRACK_OVERRIDE:
Jay Soffian9ed36cf2008-02-19 11:24:37 -0500151 break;
152 default:
Patrick Steinhardt27852b22016-02-22 12:23:23 +0100153 return;
Jay Soffian9ed36cf2008-02-19 11:24:37 -0500154 }
155
Daniel Barkalowe496c002008-02-07 11:40:08 -0500156 if (tracking.matches > 1)
Patrick Steinhardt27852b22016-02-22 12:23:23 +0100157 die(_("Not tracking: ambiguous information for ref %s"),
158 orig_ref);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500159
Patrick Steinhardt27852b22016-02-22 12:23:23 +0100160 if (install_branch_config(config_flags, new_ref, tracking.remote,
161 tracking.src ? tracking.src : orig_ref) < 0)
162 exit(-1);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500163
Junio C Hamanoa9f2c132009-03-03 22:29:55 -0800164 free(tracking.src);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500165}
166
Junio C Hamano6f9a3322011-09-21 20:19:38 -0700167int read_branch_desc(struct strbuf *buf, const char *branch_name)
168{
Tanay Abhra540b0f42014-08-07 23:26:42 +0530169 char *v = NULL;
Junio C Hamano6f9a3322011-09-21 20:19:38 -0700170 struct strbuf name = STRBUF_INIT;
171 strbuf_addf(&name, "branch.%s.description", branch_name);
Tanay Abhra540b0f42014-08-07 23:26:42 +0530172 if (git_config_get_string(name.buf, &v)) {
173 strbuf_release(&name);
174 return -1;
175 }
176 strbuf_addstr(buf, v);
177 free(v);
Junio C Hamano6f9a3322011-09-21 20:19:38 -0700178 strbuf_release(&name);
179 return 0;
180}
181
Junio C Hamanobc1c9c02017-10-13 13:45:40 +0900182/*
183 * Check if 'name' can be a valid name for a branch; die otherwise.
184 * Return 1 if the named branch already exists; return 0 otherwise.
185 * Fill ref with the full refname for the branch.
186 */
187int validate_branchname(const char *name, struct strbuf *ref)
Conrad Irwin55c4a672011-08-20 14:49:48 -0700188{
Conrad Irwin55c4a672011-08-20 14:49:48 -0700189 if (strbuf_check_branch_ref(ref, name))
Jiang Xinbc554df2013-04-16 11:37:50 +0800190 die(_("'%s' is not a valid branch name."), name);
Conrad Irwin55c4a672011-08-20 14:49:48 -0700191
Junio C Hamanobc1c9c02017-10-13 13:45:40 +0900192 return ref_exists(ref->buf);
193}
Conrad Irwin55c4a672011-08-20 14:49:48 -0700194
Junio C Hamanobc1c9c02017-10-13 13:45:40 +0900195/*
196 * Check if a branch 'name' can be created as a new branch; die otherwise.
197 * 'force' can be used when it is OK for the named branch already exists.
198 * Return 1 if the named branch already exists; return 0 otherwise.
199 * Fill ref with the full refname for the branch.
200 */
201int validate_new_branchname(const char *name, struct strbuf *ref, int force)
202{
203 const char *head;
204
205 if (!validate_branchname(name, ref))
Conrad Irwin55c4a672011-08-20 14:49:48 -0700206 return 0;
Conrad Irwin55c4a672011-08-20 14:49:48 -0700207
Junio C Hamano8280c4c2017-10-13 12:57:02 +0900208 if (!force)
209 die(_("A branch named '%s' already exists."),
210 ref->buf + strlen("refs/heads/"));
Conrad Irwin55c4a672011-08-20 14:49:48 -0700211
Junio C Hamano8280c4c2017-10-13 12:57:02 +0900212 head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
213 if (!is_bare_repository() && head && !strcmp(head, ref->buf))
214 die(_("Cannot force update the current branch."));
215
Conrad Irwin55c4a672011-08-20 14:49:48 -0700216 return 1;
217}
218
Johan Herland41c21f22013-04-21 23:52:05 +0200219static int check_tracking_branch(struct remote *remote, void *cb_data)
220{
221 char *tracking_branch = cb_data;
Brandon Williams0ad4a5f2018-05-16 15:57:49 -0700222 struct refspec_item query;
223 memset(&query, 0, sizeof(struct refspec_item));
Johan Herland41c21f22013-04-21 23:52:05 +0200224 query.dst = tracking_branch;
Per Cederqvist1d7358c2013-09-08 22:58:15 +0200225 return !remote_find_tracking(remote, &query);
Johan Herland41c21f22013-04-21 23:52:05 +0200226}
227
228static int validate_remote_tracking_branch(char *ref)
229{
230 return !for_each_remote(check_tracking_branch, ref);
231}
232
Jeff Kinge2b6aa52013-04-02 15:03:55 -0400233static const char upstream_not_branch[] =
Jeff King1a15d002013-04-02 15:04:51 -0400234N_("Cannot setup tracking information; starting point '%s' is not a branch.");
Jeff Kinga5e91c72013-04-02 15:04:27 -0400235static const char upstream_missing[] =
Jeff Kingcaa20362013-04-02 15:05:12 -0400236N_("the requested upstream branch '%s' does not exist");
237static const char upstream_advice[] =
238N_("\n"
239"If you are planning on basing your work on an upstream\n"
240"branch that already exists at the remote, you may need to\n"
241"run \"git fetch\" to retrieve it.\n"
242"\n"
243"If you are planning to push out a new local branch that\n"
244"will track its remote counterpart, you may want to use\n"
245"\"git push -u\" to set the upstream config as you push.");
Jeff Kinge2b6aa52013-04-02 15:03:55 -0400246
Jeff King4bd488e2016-11-04 12:30:12 -0400247void create_branch(const char *name, const char *start_name,
Kaartic Sivaraame2bbd0c2017-11-18 22:56:46 +0530248 int force, int clobber_head_ok, int reflog,
Jeff Kingf9a482e2012-03-26 19:51:01 -0400249 int quiet, enum branch_track track)
Daniel Barkalowe496c002008-02-07 11:40:08 -0500250{
Daniel Barkalowe496c002008-02-07 11:40:08 -0500251 struct commit *commit;
brian m. carlson48713bf2017-05-01 02:29:00 +0000252 struct object_id oid;
Jeff King3818b252017-03-28 15:46:36 -0400253 char *real_ref;
Junio C Hamano8415d5c2009-02-13 23:08:05 -0800254 struct strbuf ref = STRBUF_INIT;
Daniel Barkalowe496c002008-02-07 11:40:08 -0500255 int forcing = 0;
Ilari Liusvaara4fc50062010-01-18 22:44:11 +0200256 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;
Daniel Barkalowe496c002008-02-07 11:40:08 -0500261
Junio C Hamano0faff982017-12-27 11:16:25 -0800262 if ((track == BRANCH_TRACK_OVERRIDE || clobber_head_ok)
Junio C Hamanobc1c9c02017-10-13 13:45:40 +0900263 ? validate_branchname(name, &ref)
264 : validate_new_branchname(name, &ref, force)) {
Conrad Irwin55c4a672011-08-20 14:49:48 -0700265 if (!force)
Ilari Liusvaara4fc50062010-01-18 22:44:11 +0200266 dont_change_ref = 1;
Conrad Irwin55c4a672011-08-20 14:49:48 -0700267 else
268 forcing = 1;
Daniel Barkalowe496c002008-02-07 11:40:08 -0500269 }
270
271 real_ref = NULL;
brian m. carlson48713bf2017-05-01 02:29:00 +0000272 if (get_oid(start_name, &oid)) {
Jeff Kingcaa20362013-04-02 15:05:12 -0400273 if (explicit_tracking) {
274 if (advice_set_upstream_failure) {
275 error(_(upstream_missing), start_name);
276 advise(_(upstream_advice));
277 exit(1);
278 }
Jeff King1a15d002013-04-02 15:04:51 -0400279 die(_(upstream_missing), start_name);
Jeff Kingcaa20362013-04-02 15:05:12 -0400280 }
Jiang Xinbc554df2013-04-16 11:37:50 +0800281 die(_("Not a valid object name: '%s'."), start_name);
Jeff Kinga5e91c72013-04-02 15:04:27 -0400282 }
Daniel Barkalowe496c002008-02-07 11:40:08 -0500283
brian m. carlsoncca5fa62017-10-15 22:06:57 +0000284 switch (dwim_ref(start_name, strlen(start_name), &oid, &real_ref)) {
Daniel Barkalowe496c002008-02-07 11:40:08 -0500285 case 0:
286 /* Not branching from any existing branch */
Ilari Liusvaara4fc50062010-01-18 22:44:11 +0200287 if (explicit_tracking)
Jeff King1a15d002013-04-02 15:04:51 -0400288 die(_(upstream_not_branch), start_name);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500289 break;
290 case 1:
Johan Herland21b5b1e2011-02-17 00:12:20 +0100291 /* Unique completion -- good, only if it is a real branch */
Christian Couder59556542013-11-30 21:55:40 +0100292 if (!starts_with(real_ref, "refs/heads/") &&
Johan Herland41c21f22013-04-21 23:52:05 +0200293 validate_remote_tracking_branch(real_ref)) {
Johan Herland21b5b1e2011-02-17 00:12:20 +0100294 if (explicit_tracking)
Jeff King1a15d002013-04-02 15:04:51 -0400295 die(_(upstream_not_branch), start_name);
Johan Herland21b5b1e2011-02-17 00:12:20 +0100296 else
297 real_ref = NULL;
298 }
Daniel Barkalowe496c002008-02-07 11:40:08 -0500299 break;
300 default:
Jiang Xinbc554df2013-04-16 11:37:50 +0800301 die(_("Ambiguous object name: '%s'."), start_name);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500302 break;
303 }
304
Stefan Beller2122f672018-06-28 18:21:58 -0700305 if ((commit = lookup_commit_reference(the_repository, &oid)) == NULL)
Jiang Xinbc554df2013-04-16 11:37:50 +0800306 die(_("Not a valid branch point: '%s'."), start_name);
brian m. carlson48713bf2017-05-01 02:29:00 +0000307 oidcpy(&oid, &commit->object.oid);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500308
Ronnie Sahlbergd43f9902014-04-16 16:21:53 -0700309 if (reflog)
Cornelius Weig341fb282017-01-27 11:09:47 +0100310 log_all_ref_updates = LOG_REFS_NORMAL;
Ronnie Sahlbergd43f9902014-04-16 16:21:53 -0700311
312 if (!dont_change_ref) {
313 struct ref_transaction *transaction;
314 struct strbuf err = STRBUF_INIT;
Jeff Kingcddac452017-03-28 15:46:40 -0400315 char *msg;
Jeff King3818b252017-03-28 15:46:36 -0400316
317 if (forcing)
Jeff Kingcddac452017-03-28 15:46:40 -0400318 msg = xstrfmt("branch: Reset to %s", start_name);
Jeff King3818b252017-03-28 15:46:36 -0400319 else
Jeff Kingcddac452017-03-28 15:46:40 -0400320 msg = xstrfmt("branch: Created from %s", start_name);
Ronnie Sahlbergd43f9902014-04-16 16:21:53 -0700321
322 transaction = ref_transaction_begin(&err);
323 if (!transaction ||
Michael Haggerty1d147bd2015-02-17 18:00:15 +0100324 ref_transaction_update(transaction, ref.buf,
brian m. carlson89f3bbd2017-10-15 22:06:53 +0000325 &oid, forcing ? NULL : &null_oid,
Michael Haggerty1d147bd2015-02-17 18:00:15 +0100326 0, msg, &err) ||
Ronnie Sahlbergdb7516a2014-04-30 12:22:42 -0700327 ref_transaction_commit(transaction, &err))
Ronnie Sahlbergd43f9902014-04-16 16:21:53 -0700328 die("%s", err.buf);
329 ref_transaction_free(transaction);
330 strbuf_release(&err);
Jeff Kingcddac452017-03-28 15:46:40 -0400331 free(msg);
Ronnie Sahlbergd43f9902014-04-16 16:21:53 -0700332 }
333
Daniel Barkalowe496c002008-02-07 11:40:08 -0500334 if (real_ref && track)
Felipe Contreras82a06722013-08-30 16:56:46 -0500335 setup_tracking(ref.buf + 11, real_ref, track, quiet);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500336
Junio C Hamano8415d5c2009-02-13 23:08:05 -0800337 strbuf_release(&ref);
Jay Soffian9ed36cf2008-02-19 11:24:37 -0500338 free(real_ref);
Daniel Barkalowe496c002008-02-07 11:40:08 -0500339}
Daniel Barkalowc369e7b2008-02-07 11:40:16 -0500340
341void remove_branch_state(void)
342{
Stefan Beller102de882018-05-17 15:51:51 -0700343 unlink(git_path_cherry_pick_head(the_repository));
344 unlink(git_path_revert_head(the_repository));
345 unlink(git_path_merge_head(the_repository));
346 unlink(git_path_merge_rr(the_repository));
347 unlink(git_path_merge_msg(the_repository));
348 unlink(git_path_merge_mode(the_repository));
349 unlink(git_path_squash_msg(the_repository));
Daniel Barkalowc369e7b2008-02-07 11:40:16 -0500350}
Eric Sunshineed89f842015-07-17 19:00:04 -0400351
Nguyễn Thái Ngọc Duy8d9fdd72016-04-22 20:01:33 +0700352void die_if_checked_out(const char *branch, int ignore_current_worktree)
David Turner41af6562015-08-10 13:52:44 -0400353{
Nguyễn Thái Ngọc Duyd3b9ac02016-04-22 20:01:27 +0700354 const struct worktree *wt;
David Turner41af6562015-08-10 13:52:44 -0400355
Nguyễn Thái Ngọc Duyd3b9ac02016-04-22 20:01:27 +0700356 wt = find_shared_symref("HEAD", branch);
Nguyễn Thái Ngọc Duy8d9fdd72016-04-22 20:01:33 +0700357 if (!wt || (ignore_current_worktree && wt->is_current))
Nguyễn Thái Ngọc Duyd3b9ac02016-04-22 20:01:27 +0700358 return;
359 skip_prefix(branch, "refs/heads/", &branch);
360 die(_("'%s' is already checked out at '%s'"),
361 branch, wt->path);
Eric Sunshineed89f842015-07-17 19:00:04 -0400362}
Kazuki Yamaguchi70999e92016-03-27 23:37:14 +0900363
Kyle Meyer39ee4c62017-02-20 20:10:35 -0500364int replace_each_worktree_head_symref(const char *oldref, const char *newref,
365 const char *logmsg)
Kazuki Yamaguchi70999e92016-03-27 23:37:14 +0900366{
367 int ret = 0;
Nguyễn Thái Ngọc Duy4fff1ef2016-11-28 16:36:55 +0700368 struct worktree **worktrees = get_worktrees(0);
Kazuki Yamaguchi70999e92016-03-27 23:37:14 +0900369 int i;
370
371 for (i = 0; worktrees[i]; i++) {
Nguyễn Thái Ngọc Duyd026a252017-04-24 17:01:24 +0700372 struct ref_store *refs;
373
Kazuki Yamaguchi70999e92016-03-27 23:37:14 +0900374 if (worktrees[i]->is_detached)
375 continue;
Nguyễn Thái Ngọc Duy31824d12017-08-24 17:41:24 +0700376 if (!worktrees[i]->head_ref)
377 continue;
378 if (strcmp(oldref, worktrees[i]->head_ref))
Kazuki Yamaguchi70999e92016-03-27 23:37:14 +0900379 continue;
380
Nguyễn Thái Ngọc Duyd026a252017-04-24 17:01:24 +0700381 refs = get_worktree_ref_store(worktrees[i]);
382 if (refs_create_symref(refs, "HEAD", newref, logmsg))
383 ret = error(_("HEAD of working tree %s is not updated"),
384 worktrees[i]->path);
Kazuki Yamaguchi70999e92016-03-27 23:37:14 +0900385 }
386
387 free_worktrees(worktrees);
388 return ret;
389}