about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2016-07-06 13:38:11 -0700
committerJunio C Hamano <gitster@pobox.com>2016-07-06 13:38:11 -0700
commit7a738b40f67fc44c2a2c1abcffe474241af3d30e (patch)
tree38045c933a3d7247599a9d2f5ba0d981ea7a8832
parentf1e80a12a485c1d3092cef96aa4a101405d326f9 (diff)
parent0409e0b6dc169b07c05d02e8b62389b1cc975a45 (diff)
downloadgit-svn-7a738b40f67fc44c2a2c1abcffe474241af3d30e.tar.gz
Further preparatory clean-up for "worktree" feature continues.

* nd/worktree-cleanup-post-head-protection:
  worktree: simplify prefixing paths
  worktree: avoid 0{40}, too many zeroes, hard to read
  worktree.c: use is_dot_or_dotdot()
  git-worktree.txt: keep subcommand listing in alphabetical order
  worktree.c: rewrite mark_current_worktree() to avoid strbuf
  completion: support git-worktree
-rw-r--r--Documentation/git-worktree.txt10
-rw-r--r--builtin/worktree.c10
-rw-r--r--contrib/completion/git-completion.bash23
-rw-r--r--worktree.c18
4 files changed, 42 insertions, 19 deletions
diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
index 23d8d2ace0..7c4cfb0885 100644
--- a/Documentation/git-worktree.txt
+++ b/Documentation/git-worktree.txt
@@ -10,8 +10,8 @@ SYNOPSIS
 --------
 [verse]
 'git worktree add' [-f] [--detach] [--checkout] [-b <new-branch>] <path> [<branch>]
-'git worktree prune' [-n] [-v] [--expire <expire>]
 'git worktree list' [--porcelain]
+'git worktree prune' [-n] [-v] [--expire <expire>]
 
 DESCRIPTION
 -----------
@@ -55,10 +55,6 @@ If `<branch>` is omitted and neither `-b` nor `-B` nor `--detached` used,
 then, as a convenience, a new branch based at HEAD is created automatically,
 as if `-b $(basename <path>)` was specified.
 
-prune::
-
-Prune working tree information in $GIT_DIR/worktrees.
-
 list::
 
 List details of each worktree.  The main worktree is listed first, followed by
@@ -66,6 +62,10 @@ each of the linked worktrees.  The output details include if the worktree is
 bare, the revision currently checked out, and the branch currently checked out
 (or 'detached HEAD' if none).
 
+prune::
+
+Prune working tree information in $GIT_DIR/worktrees.
+
 OPTIONS
 -------
 
diff --git a/builtin/worktree.c b/builtin/worktree.c
index e3199a22e5..e866844685 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -13,8 +13,8 @@
 
 static const char * const worktree_usage[] = {
         N_("git worktree add [<options>] <path> [<branch>]"),
-        N_("git worktree prune [<options>]"),
         N_("git worktree list [<options>]"),
+        N_("git worktree prune [<options>]"),
         NULL
 };
 
@@ -95,7 +95,7 @@ static void prune_worktrees(void)
         if (!dir)
                 return;
         while ((d = readdir(dir)) != NULL) {
-                if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
+                if (is_dot_or_dotdot(d->d_name))
                         continue;
                 strbuf_reset(&reason);
                 if (!prune_worktree(d->d_name, &reason))
@@ -262,7 +262,7 @@ static int add_worktree(const char *path, const char *refname,
          */
         strbuf_reset(&sb);
         strbuf_addf(&sb, "%s/HEAD", sb_repo.buf);
-        write_file(sb.buf, "0000000000000000000000000000000000000000");
+        write_file(sb.buf, sha1_to_hex(null_sha1));
         strbuf_reset(&sb);
         strbuf_addf(&sb, "%s/commondir", sb_repo.buf);
         write_file(sb.buf, "../..");
@@ -337,7 +337,7 @@ static int add(int ac, const char **av, const char *prefix)
         if (ac < 1 || ac > 2)
                 usage_with_options(worktree_usage, options);
 
-        path = prefix ? prefix_filename(prefix, strlen(prefix), av[0]) : av[0];
+        path = prefix_filename(prefix, strlen(prefix), av[0]);
         branch = ac < 2 ? "HEAD" : av[1];
 
         if (!strcmp(branch, "-"))
@@ -470,6 +470,8 @@ int cmd_worktree(int ac, const char **av, const char *prefix)
 
         if (ac < 2)
                 usage_with_options(worktree_usage, options);
+        if (!prefix)
+                prefix = "";
         if (!strcmp(av[1], "add"))
                 return add(ac - 1, av + 1, prefix);
         if (!strcmp(av[1], "prune"))
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index ddda5e5e27..37888f4e57 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -2691,6 +2691,29 @@ _git_whatchanged ()
         _git_log
 }
 
+_git_worktree ()
+{
+        local subcommands="add list prune"
+        local subcommand="$(__git_find_on_cmdline "$subcommands")"
+        if [ -z "$subcommand" ]; then
+                __gitcomp "$subcommands"
+        else
+                case "$subcommand,$cur" in
+                add,--*)
+                        __gitcomp "--detach"
+                        ;;
+                list,--*)
+                        __gitcomp "--porcelain"
+                        ;;
+                prune,--*)
+                        __gitcomp "--dry-run --expire --verbose"
+                        ;;
+                *)
+                        ;;
+                esac
+        fi
+}
+
 __git_main ()
 {
         local i c=1 command __git_dir
diff --git a/worktree.c b/worktree.c
index 199b1ef94b..e2a94e0476 100644
--- a/worktree.c
+++ b/worktree.c
@@ -153,21 +153,19 @@ done:
 
 static void mark_current_worktree(struct worktree **worktrees)
 {
-        struct strbuf git_dir = STRBUF_INIT;
-        struct strbuf path = STRBUF_INIT;
+        char *git_dir = xstrdup(absolute_path(get_git_dir()));
         int i;
 
-        strbuf_addstr(&git_dir, absolute_path(get_git_dir()));
         for (i = 0; worktrees[i]; i++) {
                 struct worktree *wt = worktrees[i];
-                strbuf_addstr(&path, absolute_path(get_worktree_git_dir(wt)));
-                wt->is_current = !fspathcmp(git_dir.buf, path.buf);
-                strbuf_reset(&path);
-                if (wt->is_current)
+                const char *wt_git_dir = get_worktree_git_dir(wt);
+
+                if (!fspathcmp(git_dir, absolute_path(wt_git_dir))) {
+                        wt->is_current = 1;
                         break;
+                }
         }
-        strbuf_release(&git_dir);
-        strbuf_release(&path);
+        free(git_dir);
 }
 
 struct worktree **get_worktrees(void)
@@ -189,7 +187,7 @@ struct worktree **get_worktrees(void)
         if (dir) {
                 while ((d = readdir(dir)) != NULL) {
                         struct worktree *linked = NULL;
-                        if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
+                        if (is_dot_or_dotdot(d->d_name))
                                 continue;
 
                         if ((linked = get_linked_worktree(d->d_name))) {