Skip to content

Commit c57b336

Browse files
raffsgitster
authored andcommitted
worktree: teach list to annotate locked worktree
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 <[email protected]> Helped-by: Eric Sunshine <[email protected]> Signed-off-by: Rafael Silva <[email protected]> Reviewed-by: Eric Sunshine <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent d4a3924 commit c57b336

File tree

3 files changed

+17
-3
lines changed

3 files changed

+17
-3
lines changed

Documentation/git-worktree.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@ list::
9696

9797
List details of each working tree. The main working tree is listed first,
9898
followed by each of the linked working trees. The output details include
99-
whether the working tree is bare, the revision currently checked out, and the
100-
branch currently checked out (or "detached HEAD" if none).
99+
whether the working tree is bare, the revision currently checked out, the
100+
branch currently checked out (or "detached HEAD" if none), and "locked" if
101+
the worktree is locked.
101102

102103
lock::
103104

builtin/worktree.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,8 +676,11 @@ static void show_worktree(struct worktree *wt, int path_maxlen, int abbrev_len)
676676
} else
677677
strbuf_addstr(&sb, "(error)");
678678
}
679-
printf("%s\n", sb.buf);
680679

680+
if (!is_main_worktree(wt) && worktree_lock_reason(wt))
681+
strbuf_addstr(&sb, " locked");
682+
683+
printf("%s\n", sb.buf);
681684
strbuf_release(&sb);
682685
}
683686

t/t2402-worktree-list.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ test_expect_success '"list" all worktrees --porcelain' '
6161
test_cmp expect actual
6262
'
6363

64+
test_expect_success '"list" all worktress with locked annotation' '
65+
test_when_finished "rm -rf locked unlocked out && git worktree prune" &&
66+
git worktree add --detach locked master &&
67+
git worktree add --detach unlocked master &&
68+
git worktree lock locked &&
69+
git worktree list >out &&
70+
grep "/locked *[0-9a-f].* locked$" out &&
71+
! grep "/unlocked *[0-9a-f].* locked$" out
72+
'
73+
6474
test_expect_success 'bare repo setup' '
6575
git init --bare bare1 &&
6676
echo "data" >file1 &&

0 commit comments

Comments
 (0)