diff mbox series

[RFC,2/2] t2402: add test to locked linked worktree marker

Message ID 20200928154953.30396-3-rafaeloliveira.cs@gmail.com (mailing list archive)
State New, archived
Headers show
Series teach `worktree list` to mark locked worktrees | expand

Commit Message

Rafael Silva Sept. 28, 2020, 3:49 p.m. UTC
Test the output of the `worktree list` command to show when
a linked worktree is locked and test to not mistakenly
mark main or unlocked worktrees.

Signed-off-by: Rafael Silva <rafaeloliveira.cs@gmail.com>
---
 t/t2402-worktree-list.sh | 13 +++++++++++++
 1 file changed, 13 insertions(+)

Comments

Junio C Hamano Sept. 28, 2020, 9:54 p.m. UTC | #1
Rafael Silva <rafaeloliveira.cs@gmail.com> writes:

> Test the output of the `worktree list` command to show when
> a linked worktree is locked and test to not mistakenly
> mark main or unlocked worktrees.
>
> Signed-off-by: Rafael Silva <rafaeloliveira.cs@gmail.com>
> ---
>  t/t2402-worktree-list.sh | 13 +++++++++++++
>  1 file changed, 13 insertions(+)

I think this should be part of [1/2], as the change necessary to
implement the new feature is small enough that there is no reason
to split the test part out.

> diff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh
> index 52585ec2aa..07bd9a3350 100755
> --- a/t/t2402-worktree-list.sh
> +++ b/t/t2402-worktree-list.sh
> @@ -61,6 +61,19 @@ test_expect_success '"list" all worktrees --porcelain' '
>  	test_cmp expect actual
>  '
>  
> +test_expect_success 'show locked worktree with (locked)' '
> +	echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect &&
> +	test_when_finished "rm -rf locked unlocked out actual expect && git worktree prune" &&
> +	git worktree add --detach locked master &&
> +	git worktree add --detach unlocked master &&
> +	git worktree lock locked &&
> +	echo "$(git -C locked rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD) (locked)" >>expect &&
> +	echo "$(git -C unlocked rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >>expect &&
> +	git worktree list >out &&
> +	sed "s/  */ /g" <out >actual &&
> +	test_cmp expect actual
> +'

This seems to prescribe the output from the command too strictly
(you do avoid being overly too strict by removing the indentation
with 's/ */ /g' though).  

If the leading path to the $TRASH_DIRECTORY has two or more
consecutive SPs (and that is not something under our control), the
'expect' file would keep such a double-SP, but such a double-SP in
'out' would have been squashed out in the 'actual' file.

I wonder if

	grep '/locked  *[0-9a-f].* (locked)' out &&
	! grep '/unlocked  *[0-9a-f].* (locked)' out

might be a better way to test?  That is

 - we do not care what the leading directories are called
 - we do not care what branch is checked out or how they are presented
 - we care the one that ends with /locked is (locked)
 - we care the one that ends with /unlocked is not (locked)

After all, this new test piece is not about verifying that the
object name or branch name is correct.
Rafael Silva Sept. 29, 2020, 9:37 p.m. UTC | #2
On Mon, Sep 28, 2020 at 02:54:24PM -0700, Junio C Hamano wrote:
> Rafael Silva <rafaeloliveira.cs@gmail.com> writes:
> 
> > Test the output of the `worktree list` command to show when
> > a linked worktree is locked and test to not mistakenly
> > mark main or unlocked worktrees.
> >
> > Signed-off-by: Rafael Silva <rafaeloliveira.cs@gmail.com>
> > ---
> >  t/t2402-worktree-list.sh | 13 +++++++++++++
> >  1 file changed, 13 insertions(+)
> 
> I think this should be part of [1/2], as the change necessary to
> implement the new feature is small enough that there is no reason
> to split the test part out.

Sounds good

> 
> > diff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh
> > index 52585ec2aa..07bd9a3350 100755
> > --- a/t/t2402-worktree-list.sh
> > +++ b/t/t2402-worktree-list.sh
> > @@ -61,6 +61,19 @@ test_expect_success '"list" all worktrees --porcelain' '
> >  	test_cmp expect actual
> >  '
> >  
> > +test_expect_success 'show locked worktree with (locked)' '
> > +	echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect &&
> > +	test_when_finished "rm -rf locked unlocked out actual expect && git worktree prune" &&
> > +	git worktree add --detach locked master &&
> > +	git worktree add --detach unlocked master &&
> > +	git worktree lock locked &&
> > +	echo "$(git -C locked rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD) (locked)" >>expect &&
> > +	echo "$(git -C unlocked rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >>expect &&
> > +	git worktree list >out &&
> > +	sed "s/  */ /g" <out >actual &&
> > +	test_cmp expect actual
> > +'
> 
> This seems to prescribe the output from the command too strictly
> (you do avoid being overly too strict by removing the indentation
> with 's/ */ /g' though).  
> 
> If the leading path to the $TRASH_DIRECTORY has two or more
> consecutive SPs (and that is not something under our control), the
> 'expect' file would keep such a double-SP, but such a double-SP in
> 'out' would have been squashed out in the 'actual' file.
> 
> I wonder if
> 
> 	grep '/locked  *[0-9a-f].* (locked)' out &&
> 	! grep '/unlocked  *[0-9a-f].* (locked)' out
> 
> might be a better way to test?  That is
> 
>  - we do not care what the leading directories are called
>  - we do not care what branch is checked out or how they are presented
>  - we care the one that ends with /locked is (locked)
>  - we care the one that ends with /unlocked is not (locked)
> 
> After all, this new test piece is not about verifying that the
> object name or branch name is correct.

Sounds good and I agree with the all, and seems even easier
to understand the test code this way. Will address this change on the next patch,
although I'm not sure whether somebody could run into any issues when
running the `grep` command in other platforms. I'll look into it.
Eric Sunshine Sept. 30, 2020, 8:06 a.m. UTC | #3
On Mon, Sep 28, 2020 at 11:50 AM Rafael Silva
<rafaeloliveira.cs@gmail.com> wrote:
> Test the output of the `worktree list` command to show when
> a linked worktree is locked and test to not mistakenly
> mark main or unlocked worktrees.

In addition to Junio's review comments...

> Signed-off-by: Rafael Silva <rafaeloliveira.cs@gmail.com>
> ---
> diff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh
> @@ -61,6 +61,19 @@ test_expect_success '"list" all worktrees --porcelain' '
> +test_expect_success 'show locked worktree with (locked)' '

Existing test titles in this script seem to follow a particular
pattern (for the most part). Perhaps this could say instead:

    test_expect_success '"list" all worktrees with "locked"' '

> +       echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect &&

I see that this is following existing practice in this script of
piling up $(git ...) invocations which can lose the individual exit
codes, so I can't complain about it, but I'll note that these days
we'd more likely than not try to preserve the exit codes, perhaps like
this:

    path=$(git rev-parse --show-toplevel) &&
    rev=$(git rev-parse --short HEAD) &&
    sym=$(git symbolic-ref --short HEAD) &&
    echo "$path $rev [$sym]" >expect &&

However, that gets verbose since you're doing it for multiple lines (below).

> +       test_when_finished "rm -rf locked unlocked out actual expect && git worktree prune" &&
> +       git worktree add --detach locked master &&
> +       git worktree add --detach unlocked master &&
> +       git worktree lock locked &&
> +       echo "$(git -C locked rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD) (locked)" >>expect &&
> +       echo "$(git -C unlocked rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >>expect &&
> +       git worktree list >out &&
> +       sed "s/  */ /g" <out >actual &&
> +       test_cmp expect actual
> +'

I realize that Junio proposed an alternate simpler approach which
checks specifically the attribute in which you are interested, but
here's yet another (typed-in-email) approach you could use:

    test_when_finished "..." &&
    git worktree add --detach locked master &&
    git worktree add --detach unlocked master &&
    git worktree list >out &&
    sed '/\/locked/s/$/ (locked)/' out >expect &&
    git worktree lock locked &&
    git worktree list >actual &&
    test_cmp expect actual
diff mbox series

Patch

diff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh
index 52585ec2aa..07bd9a3350 100755
--- a/t/t2402-worktree-list.sh
+++ b/t/t2402-worktree-list.sh
@@ -61,6 +61,19 @@  test_expect_success '"list" all worktrees --porcelain' '
 	test_cmp expect actual
 '
 
+test_expect_success 'show locked worktree with (locked)' '
+	echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect &&
+	test_when_finished "rm -rf locked unlocked out actual expect && git worktree prune" &&
+	git worktree add --detach locked master &&
+	git worktree add --detach unlocked master &&
+	git worktree lock locked &&
+	echo "$(git -C locked rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD) (locked)" >>expect &&
+	echo "$(git -C unlocked rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >>expect &&
+	git worktree list >out &&
+	sed "s/  */ /g" <out >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success 'bare repo setup' '
 	git init --bare bare1 &&
 	echo "data" >file1 &&