worktree: teach 'add' to respect --force for registered but missing path
[git] / builtin / worktree.c
1 #include "cache.h"
2 #include "checkout.h"
3 #include "config.h"
4 #include "builtin.h"
5 #include "dir.h"
6 #include "parse-options.h"
7 #include "argv-array.h"
8 #include "branch.h"
9 #include "refs.h"
10 #include "run-command.h"
11 #include "sigchain.h"
12 #include "refs.h"
13 #include "utf8.h"
14 #include "worktree.h"
15
16 static const char * const worktree_usage[] = {
17         N_("git worktree add [<options>] <path> [<commit-ish>]"),
18         N_("git worktree list [<options>]"),
19         N_("git worktree lock [<options>] <path>"),
20         N_("git worktree move <worktree> <new-path>"),
21         N_("git worktree prune [<options>]"),
22         N_("git worktree remove [<options>] <worktree>"),
23         N_("git worktree unlock <path>"),
24         NULL
25 };
26
27 struct add_opts {
28         int force;
29         int detach;
30         int quiet;
31         int checkout;
32         int keep_locked;
33 };
34
35 static int show_only;
36 static int verbose;
37 static int guess_remote;
38 static timestamp_t expire;
39
40 static int git_worktree_config(const char *var, const char *value, void *cb)
41 {
42         if (!strcmp(var, "worktree.guessremote")) {
43                 guess_remote = git_config_bool(var, value);
44                 return 0;
45         }
46
47         return git_default_config(var, value, cb);
48 }
49
50 static int delete_git_dir(const char *id)
51 {
52         struct strbuf sb = STRBUF_INIT;
53         int ret;
54
55         strbuf_addstr(&sb, git_common_path("worktrees/%s", id));
56         ret = remove_dir_recursively(&sb, 0);
57         if (ret < 0 && errno == ENOTDIR)
58                 ret = unlink(sb.buf);
59         if (ret)
60                 error_errno(_("failed to delete '%s'"), sb.buf);
61         strbuf_release(&sb);
62         return ret;
63 }
64
65 static int prune_worktree(const char *id, struct strbuf *reason)
66 {
67         struct stat st;
68         char *path;
69         int fd;
70         size_t len;
71         ssize_t read_result;
72
73         if (!is_directory(git_path("worktrees/%s", id))) {
74                 strbuf_addf(reason, _("Removing worktrees/%s: not a valid directory"), id);
75                 return 1;
76         }
77         if (file_exists(git_path("worktrees/%s/locked", id)))
78                 return 0;
79         if (stat(git_path("worktrees/%s/gitdir", id), &st)) {
80                 strbuf_addf(reason, _("Removing worktrees/%s: gitdir file does not exist"), id);
81                 return 1;
82         }
83         fd = open(git_path("worktrees/%s/gitdir", id), O_RDONLY);
84         if (fd < 0) {
85                 strbuf_addf(reason, _("Removing worktrees/%s: unable to read gitdir file (%s)"),
86                             id, strerror(errno));
87                 return 1;
88         }
89         len = xsize_t(st.st_size);
90         path = xmallocz(len);
91
92         read_result = read_in_full(fd, path, len);
93         if (read_result < 0) {
94                 strbuf_addf(reason, _("Removing worktrees/%s: unable to read gitdir file (%s)"),
95                             id, strerror(errno));
96                 close(fd);
97                 free(path);
98                 return 1;
99         }
100         close(fd);
101
102         if (read_result != len) {
103                 strbuf_addf(reason,
104                             _("Removing worktrees/%s: short read (expected %"PRIuMAX" bytes, read %"PRIuMAX")"),
105                             id, (uintmax_t)len, (uintmax_t)read_result);
106                 free(path);
107                 return 1;
108         }
109         while (len && (path[len - 1] == '\n' || path[len - 1] == '\r'))
110                 len--;
111         if (!len) {
112                 strbuf_addf(reason, _("Removing worktrees/%s: invalid gitdir file"), id);
113                 free(path);
114                 return 1;
115         }
116         path[len] = '\0';
117         if (!file_exists(path)) {
118                 free(path);
119                 if (stat(git_path("worktrees/%s/index", id), &st) ||
120                     st.st_mtime <= expire) {
121                         strbuf_addf(reason, _("Removing worktrees/%s: gitdir file points to non-existent location"), id);
122                         return 1;
123                 } else {
124                         return 0;
125                 }
126         }
127         free(path);
128         return 0;
129 }
130
131 static void prune_worktrees(void)
132 {
133         struct strbuf reason = STRBUF_INIT;
134         DIR *dir = opendir(git_path("worktrees"));
135         struct dirent *d;
136         if (!dir)
137                 return;
138         while ((d = readdir(dir)) != NULL) {
139                 if (is_dot_or_dotdot(d->d_name))
140                         continue;
141                 strbuf_reset(&reason);
142                 if (!prune_worktree(d->d_name, &reason))
143                         continue;
144                 if (show_only || verbose)
145                         printf("%s\n", reason.buf);
146                 if (show_only)
147                         continue;
148                 delete_git_dir(d->d_name);
149         }
150         closedir(dir);
151         if (!show_only)
152                 rmdir(git_path("worktrees"));
153         strbuf_release(&reason);
154 }
155
156 static int prune(int ac, const char **av, const char *prefix)
157 {
158         struct option options[] = {
159                 OPT__DRY_RUN(&show_only, N_("do not remove, show only")),
160                 OPT__VERBOSE(&verbose, N_("report pruned working trees")),
161                 OPT_EXPIRY_DATE(0, "expire", &expire,
162                                 N_("expire working trees older than <time>")),
163                 OPT_END()
164         };
165
166         expire = TIME_MAX;
167         ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
168         if (ac)
169                 usage_with_options(worktree_usage, options);
170         prune_worktrees();
171         return 0;
172 }
173
174 static char *junk_work_tree;
175 static char *junk_git_dir;
176 static int is_junk;
177 static pid_t junk_pid;
178
179 static void remove_junk(void)
180 {
181         struct strbuf sb = STRBUF_INIT;
182         if (!is_junk || getpid() != junk_pid)
183                 return;
184         if (junk_git_dir) {
185                 strbuf_addstr(&sb, junk_git_dir);
186                 remove_dir_recursively(&sb, 0);
187                 strbuf_reset(&sb);
188         }
189         if (junk_work_tree) {
190                 strbuf_addstr(&sb, junk_work_tree);
191                 remove_dir_recursively(&sb, 0);
192         }
193         strbuf_release(&sb);
194 }
195
196 static void remove_junk_on_signal(int signo)
197 {
198         remove_junk();
199         sigchain_pop(signo);
200         raise(signo);
201 }
202
203 static const char *worktree_basename(const char *path, int *olen)
204 {
205         const char *name;
206         int len;
207
208         len = strlen(path);
209         while (len && is_dir_sep(path[len - 1]))
210                 len--;
211
212         for (name = path + len - 1; name > path; name--)
213                 if (is_dir_sep(*name)) {
214                         name++;
215                         break;
216                 }
217
218         *olen = len;
219         return name;
220 }
221
222 static void validate_worktree_add(const char *path, const struct add_opts *opts)
223 {
224         struct worktree **worktrees;
225         struct worktree *wt;
226         int locked;
227
228         if (file_exists(path) && !is_empty_dir(path))
229                 die(_("'%s' already exists"), path);
230
231         worktrees = get_worktrees(0);
232         /*
233          * find_worktree()'s suffix matching may undesirably find the main
234          * rather than a linked worktree (for instance, when the basenames
235          * of the main worktree and the one being created are the same).
236          * We're only interested in linked worktrees, so skip the main
237          * worktree with +1.
238          */
239         wt = find_worktree(worktrees + 1, NULL, path);
240         if (!wt)
241                 goto done;
242
243         locked = !!is_worktree_locked(wt);
244         if ((!locked && opts->force) || (locked && opts->force > 1)) {
245                 if (delete_git_dir(wt->id))
246                     die(_("unable to re-add worktree '%s'"), path);
247                 goto done;
248         }
249
250         if (locked)
251                 die(_("'%s' is a missing but locked worktree;\nuse 'add -f -f' to override, or 'unlock' and 'prune' or 'remove' to clear"), path);
252         else
253                 die(_("'%s' is a missing but already registered worktree;\nuse 'add -f' to override, or 'prune' or 'remove' to clear"), path);
254
255 done:
256         free_worktrees(worktrees);
257 }
258
259 static int add_worktree(const char *path, const char *refname,
260                         const struct add_opts *opts)
261 {
262         struct strbuf sb_git = STRBUF_INIT, sb_repo = STRBUF_INIT;
263         struct strbuf sb = STRBUF_INIT;
264         const char *name;
265         struct stat st;
266         struct child_process cp = CHILD_PROCESS_INIT;
267         struct argv_array child_env = ARGV_ARRAY_INIT;
268         int counter = 0, len, ret;
269         struct strbuf symref = STRBUF_INIT;
270         struct commit *commit = NULL;
271         int is_branch = 0;
272
273         validate_worktree_add(path, opts);
274
275         /* is 'refname' a branch or commit? */
276         if (!opts->detach && !strbuf_check_branch_ref(&symref, refname) &&
277             ref_exists(symref.buf)) {
278                 is_branch = 1;
279                 if (!opts->force)
280                         die_if_checked_out(symref.buf, 0);
281         }
282         commit = lookup_commit_reference_by_name(refname);
283         if (!commit)
284                 die(_("invalid reference: %s"), refname);
285
286         name = worktree_basename(path, &len);
287         git_path_buf(&sb_repo, "worktrees/%.*s", (int)(path + len - name), name);
288         len = sb_repo.len;
289         if (safe_create_leading_directories_const(sb_repo.buf))
290                 die_errno(_("could not create leading directories of '%s'"),
291                           sb_repo.buf);
292         while (!stat(sb_repo.buf, &st)) {
293                 counter++;
294                 strbuf_setlen(&sb_repo, len);
295                 strbuf_addf(&sb_repo, "%d", counter);
296         }
297         name = strrchr(sb_repo.buf, '/') + 1;
298
299         junk_pid = getpid();
300         atexit(remove_junk);
301         sigchain_push_common(remove_junk_on_signal);
302
303         if (mkdir(sb_repo.buf, 0777))
304                 die_errno(_("could not create directory of '%s'"), sb_repo.buf);
305         junk_git_dir = xstrdup(sb_repo.buf);
306         is_junk = 1;
307
308         /*
309          * lock the incomplete repo so prune won't delete it, unlock
310          * after the preparation is over.
311          */
312         strbuf_addf(&sb, "%s/locked", sb_repo.buf);
313         if (!opts->keep_locked)
314                 write_file(sb.buf, "initializing");
315         else
316                 write_file(sb.buf, "added with --lock");
317
318         strbuf_addf(&sb_git, "%s/.git", path);
319         if (safe_create_leading_directories_const(sb_git.buf))
320                 die_errno(_("could not create leading directories of '%s'"),
321                           sb_git.buf);
322         junk_work_tree = xstrdup(path);
323
324         strbuf_reset(&sb);
325         strbuf_addf(&sb, "%s/gitdir", sb_repo.buf);
326         write_file(sb.buf, "%s", real_path(sb_git.buf));
327         write_file(sb_git.buf, "gitdir: %s/worktrees/%s",
328                    real_path(get_git_common_dir()), name);
329         /*
330          * This is to keep resolve_ref() happy. We need a valid HEAD
331          * or is_git_directory() will reject the directory. Any value which
332          * looks like an object ID will do since it will be immediately
333          * replaced by the symbolic-ref or update-ref invocation in the new
334          * worktree.
335          */
336         strbuf_reset(&sb);
337         strbuf_addf(&sb, "%s/HEAD", sb_repo.buf);
338         write_file(sb.buf, "%s", sha1_to_hex(null_sha1));
339         strbuf_reset(&sb);
340         strbuf_addf(&sb, "%s/commondir", sb_repo.buf);
341         write_file(sb.buf, "../..");
342
343         argv_array_pushf(&child_env, "%s=%s", GIT_DIR_ENVIRONMENT, sb_git.buf);
344         argv_array_pushf(&child_env, "%s=%s", GIT_WORK_TREE_ENVIRONMENT, path);
345         cp.git_cmd = 1;
346
347         if (!is_branch)
348                 argv_array_pushl(&cp.args, "update-ref", "HEAD",
349                                  oid_to_hex(&commit->object.oid), NULL);
350         else {
351                 argv_array_pushl(&cp.args, "symbolic-ref", "HEAD",
352                                  symref.buf, NULL);
353                 if (opts->quiet)
354                         argv_array_push(&cp.args, "--quiet");
355         }
356
357         cp.env = child_env.argv;
358         ret = run_command(&cp);
359         if (ret)
360                 goto done;
361
362         if (opts->checkout) {
363                 cp.argv = NULL;
364                 argv_array_clear(&cp.args);
365                 argv_array_pushl(&cp.args, "reset", "--hard", NULL);
366                 if (opts->quiet)
367                         argv_array_push(&cp.args, "--quiet");
368                 cp.env = child_env.argv;
369                 ret = run_command(&cp);
370                 if (ret)
371                         goto done;
372         }
373
374         is_junk = 0;
375         FREE_AND_NULL(junk_work_tree);
376         FREE_AND_NULL(junk_git_dir);
377
378 done:
379         if (ret || !opts->keep_locked) {
380                 strbuf_reset(&sb);
381                 strbuf_addf(&sb, "%s/locked", sb_repo.buf);
382                 unlink_or_warn(sb.buf);
383         }
384
385         /*
386          * Hook failure does not warrant worktree deletion, so run hook after
387          * is_junk is cleared, but do return appropriate code when hook fails.
388          */
389         if (!ret && opts->checkout) {
390                 const char *hook = find_hook("post-checkout");
391                 if (hook) {
392                         const char *env[] = { "GIT_DIR", "GIT_WORK_TREE", NULL };
393                         cp.git_cmd = 0;
394                         cp.no_stdin = 1;
395                         cp.stdout_to_stderr = 1;
396                         cp.dir = path;
397                         cp.env = env;
398                         cp.argv = NULL;
399                         argv_array_pushl(&cp.args, absolute_path(hook),
400                                          oid_to_hex(&null_oid),
401                                          oid_to_hex(&commit->object.oid),
402                                          "1", NULL);
403                         ret = run_command(&cp);
404                 }
405         }
406
407         argv_array_clear(&child_env);
408         strbuf_release(&sb);
409         strbuf_release(&symref);
410         strbuf_release(&sb_repo);
411         strbuf_release(&sb_git);
412         return ret;
413 }
414
415 static void print_preparing_worktree_line(int detach,
416                                           const char *branch,
417                                           const char *new_branch,
418                                           int force_new_branch)
419 {
420         if (force_new_branch) {
421                 struct commit *commit = lookup_commit_reference_by_name(new_branch);
422                 if (!commit)
423                         printf_ln(_("Preparing worktree (new branch '%s')"), new_branch);
424                 else
425                         printf_ln(_("Preparing worktree (resetting branch '%s'; was at %s)"),
426                                   new_branch,
427                                   find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV));
428         } else if (new_branch) {
429                 printf_ln(_("Preparing worktree (new branch '%s')"), new_branch);
430         } else {
431                 struct strbuf s = STRBUF_INIT;
432                 if (!detach && !strbuf_check_branch_ref(&s, branch) &&
433                     ref_exists(s.buf))
434                         printf_ln(_("Preparing worktree (checking out '%s')"),
435                                   branch);
436                 else {
437                         struct commit *commit = lookup_commit_reference_by_name(branch);
438                         if (!commit)
439                                 die(_("invalid reference: %s"), branch);
440                         printf_ln(_("Preparing worktree (detached HEAD %s)"),
441                                   find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV));
442                 }
443                 strbuf_release(&s);
444         }
445 }
446
447 static const char *dwim_branch(const char *path, const char **new_branch)
448 {
449         int n;
450         const char *s = worktree_basename(path, &n);
451         const char *branchname = xstrndup(s, n);
452         struct strbuf ref = STRBUF_INIT;
453
454         UNLEAK(branchname);
455         if (!strbuf_check_branch_ref(&ref, branchname) &&
456             ref_exists(ref.buf)) {
457                 strbuf_release(&ref);
458                 return branchname;
459         }
460
461         *new_branch = branchname;
462         if (guess_remote) {
463                 struct object_id oid;
464                 const char *remote =
465                         unique_tracking_name(*new_branch, &oid, NULL);
466                 return remote;
467         }
468         return NULL;
469 }
470
471 static int add(int ac, const char **av, const char *prefix)
472 {
473         struct add_opts opts;
474         const char *new_branch_force = NULL;
475         char *path;
476         const char *branch;
477         const char *new_branch = NULL;
478         const char *opt_track = NULL;
479         struct option options[] = {
480                 OPT__FORCE(&opts.force,
481                            N_("checkout <branch> even if already checked out in other worktree"),
482                            PARSE_OPT_NOCOMPLETE),
483                 OPT_STRING('b', NULL, &new_branch, N_("branch"),
484                            N_("create a new branch")),
485                 OPT_STRING('B', NULL, &new_branch_force, N_("branch"),
486                            N_("create or reset a branch")),
487                 OPT_BOOL(0, "detach", &opts.detach, N_("detach HEAD at named commit")),
488                 OPT_BOOL(0, "checkout", &opts.checkout, N_("populate the new working tree")),
489                 OPT_BOOL(0, "lock", &opts.keep_locked, N_("keep the new working tree locked")),
490                 OPT__QUIET(&opts.quiet, N_("suppress progress reporting")),
491                 OPT_PASSTHRU(0, "track", &opt_track, NULL,
492                              N_("set up tracking mode (see git-branch(1))"),
493                              PARSE_OPT_NOARG | PARSE_OPT_OPTARG),
494                 OPT_BOOL(0, "guess-remote", &guess_remote,
495                          N_("try to match the new branch name with a remote-tracking branch")),
496                 OPT_END()
497         };
498
499         memset(&opts, 0, sizeof(opts));
500         opts.checkout = 1;
501         ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
502         if (!!opts.detach + !!new_branch + !!new_branch_force > 1)
503                 die(_("-b, -B, and --detach are mutually exclusive"));
504         if (ac < 1 || ac > 2)
505                 usage_with_options(worktree_usage, options);
506
507         path = prefix_filename(prefix, av[0]);
508         branch = ac < 2 ? "HEAD" : av[1];
509
510         if (!strcmp(branch, "-"))
511                 branch = "@{-1}";
512
513         if (new_branch_force) {
514                 struct strbuf symref = STRBUF_INIT;
515
516                 new_branch = new_branch_force;
517
518                 if (!opts.force &&
519                     !strbuf_check_branch_ref(&symref, new_branch) &&
520                     ref_exists(symref.buf))
521                         die_if_checked_out(symref.buf, 0);
522                 strbuf_release(&symref);
523         }
524
525         if (ac < 2 && !new_branch && !opts.detach) {
526                 const char *s = dwim_branch(path, &new_branch);
527                 if (s)
528                         branch = s;
529         }
530
531         if (ac == 2 && !new_branch && !opts.detach) {
532                 struct object_id oid;
533                 struct commit *commit;
534                 const char *remote;
535
536                 commit = lookup_commit_reference_by_name(branch);
537                 if (!commit) {
538                         remote = unique_tracking_name(branch, &oid, NULL);
539                         if (remote) {
540                                 new_branch = branch;
541                                 branch = remote;
542                         }
543                 }
544         }
545         if (!opts.quiet)
546                 print_preparing_worktree_line(opts.detach, branch, new_branch, !!new_branch_force);
547
548         if (new_branch) {
549                 struct child_process cp = CHILD_PROCESS_INIT;
550                 cp.git_cmd = 1;
551                 argv_array_push(&cp.args, "branch");
552                 if (new_branch_force)
553                         argv_array_push(&cp.args, "--force");
554                 if (opts.quiet)
555                         argv_array_push(&cp.args, "--quiet");
556                 argv_array_push(&cp.args, new_branch);
557                 argv_array_push(&cp.args, branch);
558                 if (opt_track)
559                         argv_array_push(&cp.args, opt_track);
560                 if (run_command(&cp))
561                         return -1;
562                 branch = new_branch;
563         } else if (opt_track) {
564                 die(_("--[no-]track can only be used if a new branch is created"));
565         }
566
567         UNLEAK(path);
568         UNLEAK(opts);
569         return add_worktree(path, branch, &opts);
570 }
571
572 static void show_worktree_porcelain(struct worktree *wt)
573 {
574         printf("worktree %s\n", wt->path);
575         if (wt->is_bare)
576                 printf("bare\n");
577         else {
578                 printf("HEAD %s\n", oid_to_hex(&wt->head_oid));
579                 if (wt->is_detached)
580                         printf("detached\n");
581                 else if (wt->head_ref)
582                         printf("branch %s\n", wt->head_ref);
583         }
584         printf("\n");
585 }
586
587 static void show_worktree(struct worktree *wt, int path_maxlen, int abbrev_len)
588 {
589         struct strbuf sb = STRBUF_INIT;
590         int cur_path_len = strlen(wt->path);
591         int path_adj = cur_path_len - utf8_strwidth(wt->path);
592
593         strbuf_addf(&sb, "%-*s ", 1 + path_maxlen + path_adj, wt->path);
594         if (wt->is_bare)
595                 strbuf_addstr(&sb, "(bare)");
596         else {
597                 strbuf_addf(&sb, "%-*s ", abbrev_len,
598                                 find_unique_abbrev(&wt->head_oid, DEFAULT_ABBREV));
599                 if (wt->is_detached)
600                         strbuf_addstr(&sb, "(detached HEAD)");
601                 else if (wt->head_ref) {
602                         char *ref = shorten_unambiguous_ref(wt->head_ref, 0);
603                         strbuf_addf(&sb, "[%s]", ref);
604                         free(ref);
605                 } else
606                         strbuf_addstr(&sb, "(error)");
607         }
608         printf("%s\n", sb.buf);
609
610         strbuf_release(&sb);
611 }
612
613 static void measure_widths(struct worktree **wt, int *abbrev, int *maxlen)
614 {
615         int i;
616
617         for (i = 0; wt[i]; i++) {
618                 int sha1_len;
619                 int path_len = strlen(wt[i]->path);
620
621                 if (path_len > *maxlen)
622                         *maxlen = path_len;
623                 sha1_len = strlen(find_unique_abbrev(&wt[i]->head_oid, *abbrev));
624                 if (sha1_len > *abbrev)
625                         *abbrev = sha1_len;
626         }
627 }
628
629 static int list(int ac, const char **av, const char *prefix)
630 {
631         int porcelain = 0;
632
633         struct option options[] = {
634                 OPT_BOOL(0, "porcelain", &porcelain, N_("machine-readable output")),
635                 OPT_END()
636         };
637
638         ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
639         if (ac)
640                 usage_with_options(worktree_usage, options);
641         else {
642                 struct worktree **worktrees = get_worktrees(GWT_SORT_LINKED);
643                 int path_maxlen = 0, abbrev = DEFAULT_ABBREV, i;
644
645                 if (!porcelain)
646                         measure_widths(worktrees, &abbrev, &path_maxlen);
647
648                 for (i = 0; worktrees[i]; i++) {
649                         if (porcelain)
650                                 show_worktree_porcelain(worktrees[i]);
651                         else
652                                 show_worktree(worktrees[i], path_maxlen, abbrev);
653                 }
654                 free_worktrees(worktrees);
655         }
656         return 0;
657 }
658
659 static int lock_worktree(int ac, const char **av, const char *prefix)
660 {
661         const char *reason = "", *old_reason;
662         struct option options[] = {
663                 OPT_STRING(0, "reason", &reason, N_("string"),
664                            N_("reason for locking")),
665                 OPT_END()
666         };
667         struct worktree **worktrees, *wt;
668
669         ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
670         if (ac != 1)
671                 usage_with_options(worktree_usage, options);
672
673         worktrees = get_worktrees(0);
674         wt = find_worktree(worktrees, prefix, av[0]);
675         if (!wt)
676                 die(_("'%s' is not a working tree"), av[0]);
677         if (is_main_worktree(wt))
678                 die(_("The main working tree cannot be locked or unlocked"));
679
680         old_reason = is_worktree_locked(wt);
681         if (old_reason) {
682                 if (*old_reason)
683                         die(_("'%s' is already locked, reason: %s"),
684                             av[0], old_reason);
685                 die(_("'%s' is already locked"), av[0]);
686         }
687
688         write_file(git_common_path("worktrees/%s/locked", wt->id),
689                    "%s", reason);
690         free_worktrees(worktrees);
691         return 0;
692 }
693
694 static int unlock_worktree(int ac, const char **av, const char *prefix)
695 {
696         struct option options[] = {
697                 OPT_END()
698         };
699         struct worktree **worktrees, *wt;
700         int ret;
701
702         ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
703         if (ac != 1)
704                 usage_with_options(worktree_usage, options);
705
706         worktrees = get_worktrees(0);
707         wt = find_worktree(worktrees, prefix, av[0]);
708         if (!wt)
709                 die(_("'%s' is not a working tree"), av[0]);
710         if (is_main_worktree(wt))
711                 die(_("The main working tree cannot be locked or unlocked"));
712         if (!is_worktree_locked(wt))
713                 die(_("'%s' is not locked"), av[0]);
714         ret = unlink_or_warn(git_common_path("worktrees/%s/locked", wt->id));
715         free_worktrees(worktrees);
716         return ret;
717 }
718
719 static void validate_no_submodules(const struct worktree *wt)
720 {
721         struct index_state istate = { NULL };
722         int i, found_submodules = 0;
723
724         if (read_index_from(&istate, worktree_git_path(wt, "index"),
725                             get_worktree_git_dir(wt)) > 0) {
726                 for (i = 0; i < istate.cache_nr; i++) {
727                         struct cache_entry *ce = istate.cache[i];
728
729                         if (S_ISGITLINK(ce->ce_mode)) {
730                                 found_submodules = 1;
731                                 break;
732                         }
733                 }
734         }
735         discard_index(&istate);
736
737         if (found_submodules)
738                 die(_("working trees containing submodules cannot be moved or removed"));
739 }
740
741 static int move_worktree(int ac, const char **av, const char *prefix)
742 {
743         struct option options[] = {
744                 OPT_END()
745         };
746         struct worktree **worktrees, *wt;
747         struct strbuf dst = STRBUF_INIT;
748         struct strbuf errmsg = STRBUF_INIT;
749         const char *reason;
750         char *path;
751
752         ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
753         if (ac != 2)
754                 usage_with_options(worktree_usage, options);
755
756         path = prefix_filename(prefix, av[1]);
757         strbuf_addstr(&dst, path);
758         free(path);
759
760         worktrees = get_worktrees(0);
761         wt = find_worktree(worktrees, prefix, av[0]);
762         if (!wt)
763                 die(_("'%s' is not a working tree"), av[0]);
764         if (is_main_worktree(wt))
765                 die(_("'%s' is a main working tree"), av[0]);
766         if (is_directory(dst.buf)) {
767                 const char *sep = find_last_dir_sep(wt->path);
768
769                 if (!sep)
770                         die(_("could not figure out destination name from '%s'"),
771                             wt->path);
772                 strbuf_trim_trailing_dir_sep(&dst);
773                 strbuf_addstr(&dst, sep);
774         }
775         if (file_exists(dst.buf))
776                 die(_("target '%s' already exists"), dst.buf);
777
778         validate_no_submodules(wt);
779
780         reason = is_worktree_locked(wt);
781         if (reason) {
782                 if (*reason)
783                         die(_("cannot move a locked working tree, lock reason: %s"),
784                             reason);
785                 die(_("cannot move a locked working tree"));
786         }
787         if (validate_worktree(wt, &errmsg, 0))
788                 die(_("validation failed, cannot move working tree: %s"),
789                     errmsg.buf);
790         strbuf_release(&errmsg);
791
792         if (rename(wt->path, dst.buf) == -1)
793                 die_errno(_("failed to move '%s' to '%s'"), wt->path, dst.buf);
794
795         update_worktree_location(wt, dst.buf);
796
797         strbuf_release(&dst);
798         free_worktrees(worktrees);
799         return 0;
800 }
801
802 /*
803  * Note, "git status --porcelain" is used to determine if it's safe to
804  * delete a whole worktree. "git status" does not ignore user
805  * configuration, so if a normal "git status" shows "clean" for the
806  * user, then it's ok to remove it.
807  *
808  * This assumption may be a bad one. We may want to ignore
809  * (potentially bad) user settings and only delete a worktree when
810  * it's absolutely safe to do so from _our_ point of view because we
811  * know better.
812  */
813 static void check_clean_worktree(struct worktree *wt,
814                                  const char *original_path)
815 {
816         struct argv_array child_env = ARGV_ARRAY_INIT;
817         struct child_process cp;
818         char buf[1];
819         int ret;
820
821         /*
822          * Until we sort this out, all submodules are "dirty" and
823          * will abort this function.
824          */
825         validate_no_submodules(wt);
826
827         argv_array_pushf(&child_env, "%s=%s/.git",
828                          GIT_DIR_ENVIRONMENT, wt->path);
829         argv_array_pushf(&child_env, "%s=%s",
830                          GIT_WORK_TREE_ENVIRONMENT, wt->path);
831         memset(&cp, 0, sizeof(cp));
832         argv_array_pushl(&cp.args, "status",
833                          "--porcelain", "--ignore-submodules=none",
834                          NULL);
835         cp.env = child_env.argv;
836         cp.git_cmd = 1;
837         cp.dir = wt->path;
838         cp.out = -1;
839         ret = start_command(&cp);
840         if (ret)
841                 die_errno(_("failed to run 'git status' on '%s'"),
842                           original_path);
843         ret = xread(cp.out, buf, sizeof(buf));
844         if (ret)
845                 die(_("'%s' is dirty, use --force to delete it"),
846                     original_path);
847         close(cp.out);
848         ret = finish_command(&cp);
849         if (ret)
850                 die_errno(_("failed to run 'git status' on '%s', code %d"),
851                           original_path, ret);
852 }
853
854 static int delete_git_work_tree(struct worktree *wt)
855 {
856         struct strbuf sb = STRBUF_INIT;
857         int ret = 0;
858
859         strbuf_addstr(&sb, wt->path);
860         if (remove_dir_recursively(&sb, 0)) {
861                 error_errno(_("failed to delete '%s'"), sb.buf);
862                 ret = -1;
863         }
864         strbuf_release(&sb);
865         return ret;
866 }
867
868 static int remove_worktree(int ac, const char **av, const char *prefix)
869 {
870         int force = 0;
871         struct option options[] = {
872                 OPT__FORCE(&force,
873                          N_("force removing even if the worktree is dirty"),
874                          PARSE_OPT_NOCOMPLETE),
875                 OPT_END()
876         };
877         struct worktree **worktrees, *wt;
878         struct strbuf errmsg = STRBUF_INIT;
879         const char *reason;
880         int ret = 0;
881
882         ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
883         if (ac != 1)
884                 usage_with_options(worktree_usage, options);
885
886         worktrees = get_worktrees(0);
887         wt = find_worktree(worktrees, prefix, av[0]);
888         if (!wt)
889                 die(_("'%s' is not a working tree"), av[0]);
890         if (is_main_worktree(wt))
891                 die(_("'%s' is a main working tree"), av[0]);
892         reason = is_worktree_locked(wt);
893         if (reason) {
894                 if (*reason)
895                         die(_("cannot remove a locked working tree, lock reason: %s"),
896                             reason);
897                 die(_("cannot remove a locked working tree"));
898         }
899         if (validate_worktree(wt, &errmsg, WT_VALIDATE_WORKTREE_MISSING_OK))
900                 die(_("validation failed, cannot remove working tree: %s"),
901                     errmsg.buf);
902         strbuf_release(&errmsg);
903
904         if (file_exists(wt->path)) {
905                 if (!force)
906                         check_clean_worktree(wt, av[0]);
907
908                 ret |= delete_git_work_tree(wt);
909         }
910         /*
911          * continue on even if ret is non-zero, there's no going back
912          * from here.
913          */
914         ret |= delete_git_dir(wt->id);
915
916         free_worktrees(worktrees);
917         return ret;
918 }
919
920 int cmd_worktree(int ac, const char **av, const char *prefix)
921 {
922         struct option options[] = {
923                 OPT_END()
924         };
925
926         git_config(git_worktree_config, NULL);
927
928         if (ac < 2)
929                 usage_with_options(worktree_usage, options);
930         if (!prefix)
931                 prefix = "";
932         if (!strcmp(av[1], "add"))
933                 return add(ac - 1, av + 1, prefix);
934         if (!strcmp(av[1], "prune"))
935                 return prune(ac - 1, av + 1, prefix);
936         if (!strcmp(av[1], "list"))
937                 return list(ac - 1, av + 1, prefix);
938         if (!strcmp(av[1], "lock"))
939                 return lock_worktree(ac - 1, av + 1, prefix);
940         if (!strcmp(av[1], "unlock"))
941                 return unlock_worktree(ac - 1, av + 1, prefix);
942         if (!strcmp(av[1], "move"))
943                 return move_worktree(ac - 1, av + 1, prefix);
944         if (!strcmp(av[1], "remove"))
945                 return remove_worktree(ac - 1, av + 1, prefix);
946         usage_with_options(worktree_usage, options);
947 }