git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] completion: fix __git_complete_worktree_paths
@ 2024-02-25  8:16 Rubén Justo
  2024-02-25 23:53 ` [PATCH v2] " Rubén Justo
  0 siblings, 1 reply; 5+ messages in thread
From: Rubén Justo @ 2024-02-25  8:16 UTC (permalink / raw)
  To: Git List

Use __git to invoke "worktree list" in __git_complete_worktree_paths, to
respect any "-C" and "--git-dir" options present on the command line.

Signed-off-by: Rubén Justo <rjusto@gmail.com>
---

I stumbled upon this in a situation like:

   $ git init /tmp/foo && cd /tmp/foo
   $ git worktree add --orphan foo_wt

   $ git init /tmp/bar && cd /tmp/bar
   $ git worktree add --orphan bar_wt

   $ cd /tmp/foo
   $ git -C /tmp/bar worktree remove <TAB>
   ... expecting /tmp/bar/wt, but ...
   $ git -C /tmp/bar worktree remove /tmp/foo_wt

 contrib/completion/git-completion.bash | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 444b3efa63..86e55dc67f 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -3571,7 +3571,7 @@ __git_complete_worktree_paths ()
 	# Generate completion reply from worktree list skipping the first
 	# entry: it's the path of the main worktree, which can't be moved,
 	# removed, locked, etc.
-	__gitcomp_nl "$(git worktree list --porcelain |
+	__gitcomp_nl "$(__git worktree list --porcelain |
 		sed -n -e '2,$ s/^worktree //p')"
 }
 
-- 
2.44.0

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2] completion: fix __git_complete_worktree_paths
  2024-02-25  8:16 [PATCH] completion: fix __git_complete_worktree_paths Rubén Justo
@ 2024-02-25 23:53 ` Rubén Justo
  2024-02-27  8:21   ` Patrick Steinhardt
  2024-02-27 21:06   ` [PATCH v3] " Rubén Justo
  0 siblings, 2 replies; 5+ messages in thread
From: Rubén Justo @ 2024-02-25 23:53 UTC (permalink / raw)
  To: Git List

Use __git to invoke "worktree list" in __git_complete_worktree_paths, to
respect any "-C" and "--git-dir" options present on the command line.

Signed-off-by: Rubén Justo <rjusto@gmail.com>
---

I stumbled upon this in a situation like:

   $ git init /tmp/foo && cd /tmp/foo
   $ git worktree add --orphan foo_wt

   $ git init /tmp/bar && cd /tmp/bar
   $ git worktree add --orphan bar_wt

   $ cd /tmp/foo
   $ git -C /tmp/bar worktree remove <TAB>
   ... expecting /tmp/bar/wt, but ...
   $ git -C /tmp/bar worktree remove /tmp/foo_wt

In this iteration, v2, some tests are included.

The function __git was introduced in 1cd23e9e05 (completion: don't use
__gitdir() for git commands, 2017-02-03).  It is a small function, so
I'll include here to ease the review of this patch:

	# Runs git with all the options given as argument, respecting any
	# '--git-dir=<path>' and '-C <path>' options present on the command line
	__git ()
	{
		git ${__git_C_args:+"${__git_C_args[@]}"} \
			${__git_dir:+--git-dir="$__git_dir"} "$@" 2>/dev/null
	}


 contrib/completion/git-completion.bash |  2 +-
 t/t9902-completion.sh                  | 24 ++++++++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 444b3efa63..86e55dc67f 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -3571,7 +3571,7 @@ __git_complete_worktree_paths ()
 	# Generate completion reply from worktree list skipping the first
 	# entry: it's the path of the main worktree, which can't be moved,
 	# removed, locked, etc.
-	__gitcomp_nl "$(git worktree list --porcelain |
+	__gitcomp_nl "$(__git worktree list --porcelain |
 		sed -n -e '2,$ s/^worktree //p')"
 }
 
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index b16c284181..7c0f82f31a 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -1263,6 +1263,30 @@ test_expect_success '__git_complete_fetch_refspecs - fully qualified & prefix' '
 	test_cmp expected out
 '
 
+test_expect_success '__git_complete_worktree_paths' '
+	test_when_finished "git worktree remove other_wt" &&
+	git worktree add --orphan other_wt &&
+	run_completion "git worktree remove " &&
+	grep other_wt out
+'
+
+test_expect_success '__git_complete_worktree_paths - not a git repository' '
+	(
+		cd non-repo &&
+		GIT_CEILING_DIRECTORIES="$ROOT" &&
+		export GIT_CEILING_DIRECTORIES &&
+		test_completion "git worktree remove " "" 2>err &&
+		test_must_be_empty err
+	)
+'
+
+test_expect_success '__git_complete_worktree_paths with -C' '
+	test_when_finished "rm -rf to_delete" &&
+	git -C otherrepo worktree add --orphan otherrepo_wt &&
+	run_completion "git -C otherrepo worktree remove " &&
+	grep otherrepo_wt out
+'
+
 test_expect_success 'git switch - with no options, complete local branches and unique remote branch names for DWIM logic' '
 	test_completion "git switch " <<-\EOF
 	branch-in-other Z
-- 
2.44.0.1.g0da3aa8f7f

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] completion: fix __git_complete_worktree_paths
  2024-02-25 23:53 ` [PATCH v2] " Rubén Justo
@ 2024-02-27  8:21   ` Patrick Steinhardt
  2024-02-27 18:09     ` Rubén Justo
  2024-02-27 21:06   ` [PATCH v3] " Rubén Justo
  1 sibling, 1 reply; 5+ messages in thread
From: Patrick Steinhardt @ 2024-02-27  8:21 UTC (permalink / raw)
  To: Rubén Justo; +Cc: Git List

[-- Attachment #1: Type: text/plain, Size: 3845 bytes --]

On Mon, Feb 26, 2024 at 12:53:31AM +0100, Rubén Justo wrote:
> Use __git to invoke "worktree list" in __git_complete_worktree_paths, to
> respect any "-C" and "--git-dir" options present on the command line.
> 
> Signed-off-by: Rubén Justo <rjusto@gmail.com>
> ---
> 
> I stumbled upon this in a situation like:
> 
>    $ git init /tmp/foo && cd /tmp/foo
>    $ git worktree add --orphan foo_wt
> 
>    $ git init /tmp/bar && cd /tmp/bar
>    $ git worktree add --orphan bar_wt
> 
>    $ cd /tmp/foo
>    $ git -C /tmp/bar worktree remove <TAB>
>    ... expecting /tmp/bar/wt, but ...
>    $ git -C /tmp/bar worktree remove /tmp/foo_wt
> 
> In this iteration, v2, some tests are included.
> 
> The function __git was introduced in 1cd23e9e05 (completion: don't use
> __gitdir() for git commands, 2017-02-03).  It is a small function, so
> I'll include here to ease the review of this patch:
> 
> 	# Runs git with all the options given as argument, respecting any
> 	# '--git-dir=<path>' and '-C <path>' options present on the command line
> 	__git ()
> 	{
> 		git ${__git_C_args:+"${__git_C_args[@]}"} \
> 			${__git_dir:+--git-dir="$__git_dir"} "$@" 2>/dev/null
> 	}
> 
> 
>  contrib/completion/git-completion.bash |  2 +-
>  t/t9902-completion.sh                  | 24 ++++++++++++++++++++++++
>  2 files changed, 25 insertions(+), 1 deletion(-)
> 
> diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> index 444b3efa63..86e55dc67f 100644
> --- a/contrib/completion/git-completion.bash
> +++ b/contrib/completion/git-completion.bash
> @@ -3571,7 +3571,7 @@ __git_complete_worktree_paths ()
>  	# Generate completion reply from worktree list skipping the first
>  	# entry: it's the path of the main worktree, which can't be moved,
>  	# removed, locked, etc.
> -	__gitcomp_nl "$(git worktree list --porcelain |
> +	__gitcomp_nl "$(__git worktree list --porcelain |
>  		sed -n -e '2,$ s/^worktree //p')"
>  }
>  
> diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
> index b16c284181..7c0f82f31a 100755
> --- a/t/t9902-completion.sh
> +++ b/t/t9902-completion.sh
> @@ -1263,6 +1263,30 @@ test_expect_success '__git_complete_fetch_refspecs - fully qualified & prefix' '
>  	test_cmp expected out
>  '
>  
> +test_expect_success '__git_complete_worktree_paths' '
> +	test_when_finished "git worktree remove other_wt" &&
> +	git worktree add --orphan other_wt &&
> +	run_completion "git worktree remove " &&
> +	grep other_wt out
> +'
> +
> +test_expect_success '__git_complete_worktree_paths - not a git repository' '
> +	(
> +		cd non-repo &&
> +		GIT_CEILING_DIRECTORIES="$ROOT" &&
> +		export GIT_CEILING_DIRECTORIES &&
> +		test_completion "git worktree remove " "" 2>err &&
> +		test_must_be_empty err
> +	)
> +'

If I understand correctly, we assume that the repo isn't detected here,
and thus we will fail to complete the command. We don't want an error
message though, which we assert. But do we also want to assert that
there is no output on stdout?

> +
> +test_expect_success '__git_complete_worktree_paths with -C' '
> +	test_when_finished "rm -rf to_delete" &&

What does this delete? I don't see "to_delete" being created as part of
this test.

> +	git -C otherrepo worktree add --orphan otherrepo_wt &&
> +	run_completion "git -C otherrepo worktree remove " &&
> +	grep otherrepo_wt out

And as far as I can see, we don't write to "out" in this test, either.
So I think we're accidentally relying on state by the first test here.

Patrick

> +'
> +
>  test_expect_success 'git switch - with no options, complete local branches and unique remote branch names for DWIM logic' '
>  	test_completion "git switch " <<-\EOF
>  	branch-in-other Z
> -- 
> 2.44.0.1.g0da3aa8f7f
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] completion: fix __git_complete_worktree_paths
  2024-02-27  8:21   ` Patrick Steinhardt
@ 2024-02-27 18:09     ` Rubén Justo
  0 siblings, 0 replies; 5+ messages in thread
From: Rubén Justo @ 2024-02-27 18:09 UTC (permalink / raw)
  To: Patrick Steinhardt; +Cc: Git List

On Tue, Feb 27, 2024 at 09:21:48AM +0100, Patrick Steinhardt wrote:

> > +test_expect_success '__git_complete_worktree_paths - not a git repository' '
> > +	(
> > +		cd non-repo &&
> > +		GIT_CEILING_DIRECTORIES="$ROOT" &&
> > +		export GIT_CEILING_DIRECTORIES &&
> > +		test_completion "git worktree remove " "" 2>err &&
> > +		test_must_be_empty err
> > +	)
> > +'
> 
> If I understand correctly, we assume that the repo isn't detected here,
> and thus we will fail to complete the command. We don't want an error
> message though, which we assert.

Correct.

> But do we also want to assert that
> there is no output on stdout?

To me, the check makes sense;  to notice if we leak a message in such a
circumstance, for instance.  I can drop it if you think it does not add
value.

The test for stderr is my main goal here.

> 
> > +
> > +test_expect_success '__git_complete_worktree_paths with -C' '
> > +	test_when_finished "rm -rf to_delete" &&
> 
> What does this delete? I don't see "to_delete" being created as part of
> this test.

Good eyes.  It's noise.  I'll drop this line.  Thanks.

> 
> > +	git -C otherrepo worktree add --orphan otherrepo_wt &&
> > +	run_completion "git -C otherrepo worktree remove " &&
> > +	grep otherrepo_wt out
> 
> And as far as I can see, we don't write to "out" in this test, either.
> So I think we're accidentally relying on state by the first test here.

The function run_completion leaves the result of the completion in the
file "out".  So we're checking here if "otherrepo_wt" is present in what
"git -C otherrepo worktree remove <TAB>" returns.

Maybe a new function: grep_completion, similar to test_completion, could
make this clearer?

> 
> Patrick

Thanks.

> 
> > +'
> > +
> >  test_expect_success 'git switch - with no options, complete local branches and unique remote branch names for DWIM logic' ' ow
> >  	test_completion "git switch " <<-\EOF
> >  	branch-in-other Z
> > -- 
> > 2.44.0.1.g0da3aa8f7f
> > 



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v3] completion: fix __git_complete_worktree_paths
  2024-02-25 23:53 ` [PATCH v2] " Rubén Justo
  2024-02-27  8:21   ` Patrick Steinhardt
@ 2024-02-27 21:06   ` Rubén Justo
  1 sibling, 0 replies; 5+ messages in thread
From: Rubén Justo @ 2024-02-27 21:06 UTC (permalink / raw)
  To: Git List; +Cc: Patrick Steinhardt

Use __git to invoke "worktree list" in __git_complete_worktree_paths, to
respect any "-C" and "--git-dir" options present on the command line.

Signed-off-by: Rubén Justo <rjusto@gmail.com>
---

I stumbled upon this in a situation like:

   $ git init /tmp/foo && cd /tmp/foo
   $ git worktree add --orphan foo_wt

   $ git init /tmp/bar && cd /tmp/bar
   $ git worktree add --orphan bar_wt

   $ cd /tmp/foo
   $ git -C /tmp/bar worktree remove <TAB>
   ... expecting /tmp/bar/wt, but ...
   $ git -C /tmp/bar worktree remove /tmp/foo_wt

The function __git was introduced in 1cd23e9e05 (completion: don't use
__gitdir() for git commands, 2017-02-03).  It is a small function, so
I'll include here to ease the review of this patch:

        # Runs git with all the options given as argument, respecting any
        # '--git-dir=<path>' and '-C <path>' options present on the command line
        __git ()
        {
                git ${__git_C_args:+"${__git_C_args[@]}"} \
                        ${__git_dir:+--git-dir="$__git_dir"} "$@" 2>/dev/null
        }

Here are the changes since v2:

"test_completion" already asserts if something is printed on stderr.
Therefore "test_must_be_empty err" does not make sense.  Removed.  This
makes the test_completion with an empty response, more valuable, IMO.
But I'm open to change it.

The second test_when_finished has been fixed.

Thanks in advance for your review.

Range-diff against v2:
1:  4cc071fb8e ! 1:  de5d2ca1d3 completion: fix __git_complete_worktree_paths
    @@ t/t9902-completion.sh: test_expect_success '__git_complete_fetch_refspecs - full
     +		cd non-repo &&
     +		GIT_CEILING_DIRECTORIES="$ROOT" &&
     +		export GIT_CEILING_DIRECTORIES &&
    -+		test_completion "git worktree remove " "" 2>err &&
    -+		test_must_be_empty err
    ++		test_completion "git worktree remove " ""
     +	)
     +'
     +
     +test_expect_success '__git_complete_worktree_paths with -C' '
    -+	test_when_finished "rm -rf to_delete" &&
    ++	test_when_finished "git -C otherrepo worktree remove otherrepo_wt" &&
     +	git -C otherrepo worktree add --orphan otherrepo_wt &&
     +	run_completion "git -C otherrepo worktree remove " &&
     +	grep otherrepo_wt out

 contrib/completion/git-completion.bash |  2 +-
 t/t9902-completion.sh                  | 23 +++++++++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 444b3efa63..86e55dc67f 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -3571,7 +3571,7 @@ __git_complete_worktree_paths ()
 	# Generate completion reply from worktree list skipping the first
 	# entry: it's the path of the main worktree, which can't be moved,
 	# removed, locked, etc.
-	__gitcomp_nl "$(git worktree list --porcelain |
+	__gitcomp_nl "$(__git worktree list --porcelain |
 		sed -n -e '2,$ s/^worktree //p')"
 }
 
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index b16c284181..aae2cbeeea 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -1263,6 +1263,29 @@ test_expect_success '__git_complete_fetch_refspecs - fully qualified & prefix' '
 	test_cmp expected out
 '
 
+test_expect_success '__git_complete_worktree_paths' '
+	test_when_finished "git worktree remove other_wt" &&
+	git worktree add --orphan other_wt &&
+	run_completion "git worktree remove " &&
+	grep other_wt out
+'
+
+test_expect_success '__git_complete_worktree_paths - not a git repository' '
+	(
+		cd non-repo &&
+		GIT_CEILING_DIRECTORIES="$ROOT" &&
+		export GIT_CEILING_DIRECTORIES &&
+		test_completion "git worktree remove " ""
+	)
+'
+
+test_expect_success '__git_complete_worktree_paths with -C' '
+	test_when_finished "git -C otherrepo worktree remove otherrepo_wt" &&
+	git -C otherrepo worktree add --orphan otherrepo_wt &&
+	run_completion "git -C otherrepo worktree remove " &&
+	grep otherrepo_wt out
+'
+
 test_expect_success 'git switch - with no options, complete local branches and unique remote branch names for DWIM logic' '
 	test_completion "git switch " <<-\EOF
 	branch-in-other Z
-- 
2.44.0.1.g0da3aa8f7f


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-02-27 21:06 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-25  8:16 [PATCH] completion: fix __git_complete_worktree_paths Rubén Justo
2024-02-25 23:53 ` [PATCH v2] " Rubén Justo
2024-02-27  8:21   ` Patrick Steinhardt
2024-02-27 18:09     ` Rubén Justo
2024-02-27 21:06   ` [PATCH v3] " Rubén Justo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).