]> git.ipfire.org Git - thirdparty/git.git/commitdiff
worktree: teach `list` to annotate locked worktree
authorRafael Silva <rafaeloliveira.cs@gmail.com>
Sun, 11 Oct 2020 10:11:52 +0000 (10:11 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 12 Oct 2020 19:24:29 +0000 (12:24 -0700)
The "git worktree list" shows the absolute path to the working tree,
the commit that is checked out and the name of the branch. It is not
immediately obvious which of the worktrees, if any, are locked.

"git worktree remove" refuses to remove a locked worktree with
an error message. If "git worktree list" told which worktrees
are locked in its output, the user would not even attempt to
remove such a worktree, or would realize that
"git worktree remove -f -f <path>" is required.

Teach "git worktree list" to append "locked" to its output.
The output from the command becomes like so:

    $ git worktree list
    /path/to/main             abc123 [master]
    /path/to/worktree         456def (detached HEAD)
    /path/to/locked-worktree  123abc (detached HEAD) locked

Helped-by: Junio C Hamano <gitster@pobox.com>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Rafael Silva <rafaeloliveira.cs@gmail.com>
Reviewed-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-worktree.txt
builtin/worktree.c
t/t2402-worktree-list.sh

index 32e8440cdea5751e6f699fff62ba2d7675057cae..af06128cc9e656de17a3f2b9180ca14135f0418c 100644 (file)
@@ -96,8 +96,9 @@ list::
 
 List details of each working tree.  The main working tree is listed first,
 followed by each of the linked working trees.  The output details include
-whether the working tree is bare, the revision currently checked out, and the
-branch currently checked out (or "detached HEAD" if none).
+whether the working tree is bare, the revision currently checked out, the
+branch currently checked out (or "detached HEAD" if none), and "locked" if
+the worktree is locked.
 
 lock::
 
index 99abaeec6c6edcb5a16e0d5e7439981f81561319..ce56fdaaa9c26d938bbb1891d322f02bcfde5ca4 100644 (file)
@@ -676,8 +676,11 @@ static void show_worktree(struct worktree *wt, int path_maxlen, int abbrev_len)
                } else
                        strbuf_addstr(&sb, "(error)");
        }
-       printf("%s\n", sb.buf);
 
+       if (!is_main_worktree(wt) && worktree_lock_reason(wt))
+               strbuf_addstr(&sb, " locked");
+
+       printf("%s\n", sb.buf);
        strbuf_release(&sb);
 }
 
index 52585ec2aa8ba6d9104060361523c1b307bebfda..b85bd2655d8c6bc850062c8719585c4d954ed0a8 100755 (executable)
@@ -61,6 +61,16 @@ test_expect_success '"list" all worktrees --porcelain' '
        test_cmp expect actual
 '
 
+test_expect_success '"list" all worktress with locked annotation' '
+       test_when_finished "rm -rf locked unlocked out && git worktree prune" &&
+       git worktree add --detach locked master &&
+       git worktree add --detach unlocked master &&
+       git worktree lock locked &&
+       git worktree list >out &&
+       grep "/locked  *[0-9a-f].* locked$" out &&
+       ! grep "/unlocked  *[0-9a-f].* locked$" out
+'
+
 test_expect_success 'bare repo setup' '
        git init --bare bare1 &&
        echo "data" >file1 &&