completion: improve doc for complex aliases
PATCH 1/1 completion: improve doc for complex aliases
From: Philippe Blain <[email protected]>
The completion code can be told to use a particular completion for aliases that shell out by using ': git <cmd> ;' as the first command of the alias. This only works if <cmd> and the semicolon are separated by a space. The examples have that space but it's not clear if it's just for style or if it's mandatory.
Explicitely mention it.
---
completion: improve doc for complex aliases
The completion code can be told to use a particular completion for aliases that shell out by using ': git ;' as the first command of the alias. This only works if and the semicolon are separated by a space. The examples have that space but it's not clear if it's just for style or if it's mandatory.
Explicitely mention it.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1585%2Fphil-blain%2Fcompletion-shell-aliases-doc-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1585/phil-blain/completion-shell-aliases-doc-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1585
contrib/completion/git-completion.bash | 1 + 1 file changed, 1 insertion(+)
contrib/completion/git-completion.bash +1 -0
@@ -28,6 +28,7 @@ # completion style. For example '!f() { : git commit ; ... }; f' will # tell the completion to use commit completion. This also works with aliases # of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '". +# Be sure to add a space between the command name and the ';'. # # If you have a command that is not part of git, but you would still # like completion, you can use __git_complete:
base-commit: 23c56f7bd5f1667f8b793d796bf30e39545920f6
Signature · 1 line
gitgitgadget
Quoted 7 lines · Philippe Blain via GitGitGadget
The completion code can be told to use a particular completion for aliases that shell out by using ': git <cmd> ;' as the first command of the alias. This only works if <cmd> and the semicolon are separated by a space. The examples have that space but it's not clear if it's just for style or if it's mandatory.
Explicitely mention it.
s/Explicitely/Explicitly/
Quoted 1 line
Signed-off-by Philippe Blain <[email protected]>
Hi Philippe,
Quoted 9 lines · Philippe Blain via GitGitGadget
From: Philippe Blain <[email protected]>
The completion code can be told to use a particular completion for aliases that shell out by using ': git <cmd> ;' as the first command of the alias. This only works if <cmd> and the semicolon are separated by a space. The examples have that space but it's not clear if it's just for style or if it's mandatory.
Explicitely mention it.
It would be even more helpful if you explain _why_ it is mandatory in the commit message. Is there some Bash-specific behavior or something else going on here?
If you are unable to explain why, then as an alternative you could explain the error or buggy behavior (any error messages encountered, for example) you observe on your system when you do not use the space (which is corrected by applying the suggestion you are adding in this patch).
Thanks!
Hi Linus,
Le 2023-09-11 à 21:04, Linus Arver a écrit :
Quoted 14 lines
Hi Philippe,
Quoted 9 lines · Philippe Blain via GitGitGadget
From: Philippe Blain <[email protected]>
The completion code can be told to use a particular completion for aliases that shell out by using ': git <cmd> ;' as the first command of the alias. This only works if <cmd> and the semicolon are separated by a space. The examples have that space but it's not clear if it's just for style or if it's mandatory.
Explicitely mention it.
Quoted 8 lines
It would be even more helpful if you explain _why_ it is mandatory in the commit message. Is there some Bash-specific behavior or something else going on here?
If you are unable to explain why, then as an alternative you could explain the error or buggy behavior (any error messages encountered, for example) you observe on your system when you do not use the space (which is corrected by applying the suggestion you are adding in this patch).
Yeah, I guess I did not investigate why it did not work without the space, it would be more complete if I did.
There's no error message though, it just does not work without the space (as I wrote in the commit message) in the sense that it won't suggest completion for the git command '<cmd>'.
I'll investigate and update the commit message.
Thanks,
Philippe.
PATCH v2 1/1 completion: improve doc for complex aliases
In reply to Philippe Blain via GitGitGadgetFrom: Philippe Blain <[email protected]>
The completion code can be told to use a particular completion for aliases that shell out by using ': git <cmd> ;' as the first command of the alias. This only works if <cmd> and the semicolon are separated by a space, since if the space is missing __git_aliased_command returns (for example) 'checkout;' instead of just 'checkout', and then __git_complete_command fails to find a completion for 'checkout;'.
The examples have that space but it's not clear if it's just for style or if it's mandatory. Explicitly mention it.
---
completion: improve doc for complex aliases
Changes since v1:
* fixed the typo pointed out by Eric
* added an explanation of why the space is mandatory, as suggested by Linus
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1585%2Fphil-blain%2Fcompletion-shell-aliases-doc-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1585/phil-blain/completion-shell-aliases-doc-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1585
Range-diff vs v1:
1: b3621ed25f0 ! 1: 96a0867c5ad completion: improve doc for complex aliases
@@ Commit message
The completion code can be told to use a particular completion for aliases that shell out by using ': git <cmd> ;' as the first command of the alias. This only works if <cmd> and the semicolon are separated by a
- space. The examples have that space but it's not clear if it's just for
- style or if it's mandatory.
+ space, since if the space is missing __git_aliased_command returns (for
+ example) 'checkout;' instead of just 'checkout', and then
+ __git_complete_command fails to find a completion for 'checkout;'.
- Explicitely mention it.
+ The examples have that space but it's not clear if it's just for
+ style or if it's mandatory. Explicitly mention it.
contrib/completion/git-completion.bash | 1 + 1 file changed, 1 insertion(+)
contrib/completion/git-completion.bash +1 -0
@@ -28,6 +28,7 @@ # completion style. For example '!f() { : git commit ; ... }; f' will # tell the completion to use commit completion. This also works with aliases # of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '". +# Be sure to add a space between the command name and the ';'. # # If you have a command that is not part of git, but you would still # like completion, you can use __git_complete:
base-commit: 23c56f7bd5f1667f8b793d796bf30e39545920f6
Signature · 1 line
gitgitgadget
Quoted 9 lines · Philippe Blain via GitGitGadget
From: Philippe Blain <[email protected]>
The completion code can be told to use a particular completion for aliases that shell out by using ': git <cmd> ;' as the first command of the alias. This only works if <cmd> and the semicolon are separated by a space, since if the space is missing
__git_aliased_commandreturns (for example) 'checkout;' instead of just 'checkout', and then__git_complete_commandfails to find a completion for 'checkout;'.
Quoted 5 lines
The examples have that space but it's not clear if it's just for style or if it's mandatory. Explicitly mention it.
Signed-off-by Philippe Blain <[email protected]>---
Thanks. I scanned the case statement in the loop in the function and thought "hmph, everybody says ': git <cmd> ;' but is 'git' really needed?"
I had "git l3" alias that invokes "$HOM#/bin/git-l" command, like so:
[alias]
l3 = "!sh -c ': git log ; git l \"$@\"' -"but if I did 's/: git log/: log/' it still completes just fine.
I wonder if this hack is worth adding, instead of (or in addition to) requiring the user to insert $IFS to please the "parser", we can honor the rather obvious wish of the user in a more direct way.
contrib/completion/git-completion.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
contrib/completion/git-completion.bash +1 -1
@@ -1183,7 +1183,7 @@ __git_aliased_command () :) : skip null command ;; \'*) : skip opening quote after sh -c ;; *) - cur="$word" + cur="${word%;}" break esac done
Quoted 21 lines · Junio C Hamano
Quoted 9 lines · Philippe Blain via GitGitGadget
From: Philippe Blain <[email protected]>
The completion code can be told to use a particular completion for aliases that shell out by using ': git <cmd> ;' as the first command of the alias. This only works if <cmd> and the semicolon are separated by a space, since if the space is missing
__git_aliased_commandreturns (for example) 'checkout;' instead of just 'checkout', and then__git_complete_commandfails to find a completion for 'checkout;'.Quoted 5 lines
The examples have that space but it's not clear if it's just for style or if it's mandatory. Explicitly mention it.
Signed-off-by Philippe Blain <[email protected]>---
Thanks. I scanned the case statement in the loop in the function and thought "hmph, everybody says ': git <cmd> ;' but is 'git' really needed?"
Quoted 6 lines
I had "git l3" alias that invokes "$HOM#/bin/git-l" command, like so:
[alias] l3 = "!sh -c ': git log ; git l \"$@\"' -"but if I did 's/: git log/: log/' it still completes just fine.
Interesting! I searched for the 'git <cmd>' and got some hits in "t9902-completion.sh" when running "git grep -nE 'git <cmd>'":
t/t9902-completion.sh:2432:test_expect_success "completion uses <cmd> completion for alias: !sh -c 'git <cmd> ...'" '
t/t9902-completion.sh:2441:test_expect_success 'completion uses <cmd> completion for alias: !f () { VAR=val git <cmd> ... }' '
t/t9902-completion.sh:2450:test_expect_success 'completion used <cmd> completion for alias: !f() { : git <cmd> ; ... }' 'When I did 's/: git log/: log/' in the test at line 2450, the test still passed. Perhaps we should add this "git"-less version as another test case?
Quoted 14 lines
I wonder if this hack is worth adding, instead of (or in addition to) requiring the user to insert $IFS to please the "parser", we can honor the rather obvious wish of the user in a more direct way.
contrib/completion/git-completion.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)contrib/completion/git-completion.bash +0
-0
contrib/completion/git-completion.bash __git_aliased_command () · line 1189
Quoted 8 lines
contrib/completion/git-completion.bash +1
-1@@ -1183,7 +1183,7 @@ __git_aliased_command () :) : skip null command ;; \'*) : skip opening quote after sh -c ;; *) - cur="$word" + cur="${word%;}" break esac done
I think this is a good defensive technique. This obviously changes the guidance that Phillipe gave in their patch (we no longer have to worry about adding a space or not between "word" and ";", so there's no need to mention this explicitly any more), but to me this seems like a better experience for our users because it's one less thing they have to worry about.
Quoted 13 lines · Philippe Blain via GitGitGadget
From: Philippe Blain <[email protected]>
The completion code can be told to use a particular completion for aliases that shell out by using ': git <cmd> ;' as the first command of the alias. This only works if <cmd> and the semicolon are separated by a space, since if the space is missing
__git_aliased_commandreturns (for example) 'checkout;' instead of just 'checkout', and then__git_complete_commandfails to find a completion for 'checkout;'.The examples have that space but it's not clear if it's just for style or if it's mandatory. Explicitly mention it.
Signed-off-by Philippe Blain <[email protected]>
Quoted 9 lines
---
completion: improve doc for complex aliasesChanges since v1:
* fixed the typo pointed out by Eric
* added an explanation of why the space is mandatory, as suggested by Linus
Thanks for the investigation. The commit message reads much better now.
This LGTM, but I think Junio's review comments [1] are worth considering. I'll respond there also.
PATCH 1/1 completion: loosen and document the requirement around completing alias
In reply to Philippe Blain via GitGitGadgetRecently we started to tell users to spell ": git foo ;" with space(s) around 'foo' for an alias to be completed similarly to the 'git foo' command. It however is easy to also allow users to spell it in a more natural way with the semicolon attached to 'foo', i.e. ": git foo;". Also, add a comment to note that 'git' is optional and writing ": foo;" would complete the alias just fine.
---
* We've discussed this when we reviewed the topic that just hit 'master'. Before we forget...
contrib/completion/git-completion.bash | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
contrib/completion/git-completion.bash +3 -2
@@ -28,7 +28,8 @@ # completion style. For example '!f() { : git commit ; ... }; f' will # tell the completion to use commit completion. This also works with aliases # of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '". -# Be sure to add a space between the command name and the ';'. +# Note that "git" is optional --- '!f() { : commit; ...}; f' would complete +# just like the 'git commit' command. # # If you have a command that is not part of git, but you would still # like completion, you can use __git_complete:
@@ -1183,7 +1184,7 @@ __git_aliased_command () :) : skip null command ;; \'*) : skip opening quote after sh -c ;; *) - cur="$word" + cur="${word%;}" break esac done
Re: [PATCH] completion: loosen and document the requirement around completing alias
Quoted 5 lines · Junio C Hamano
* We've discussed this when we reviewed the topic that just hit 'master'. Before we forget...
contrib/completion/git-completion.bash | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
And here is an obligatory "test" update I will squash into the main patch. The new ones copy a canonical ": git <cmd> ; ..." test and remove 'git' and also the space before the semicolon.
t/t9902-completion.sh +18 -0
@@ -2464,6 +2464,24 @@ test_expect_success 'completion used <cmd> completion for alias: !f() { : git <c EOF ' +test_expect_success 'completion used <cmd> completion for alias: !f() { : <cmd> ; ... }' ' + test_config alias.co "!f() { : checkout ; if ... } f" && + test_completion "git co m" <<-\EOF + main Z + mybranch Z + mytag Z + EOF +' + +test_expect_success 'completion used <cmd> completion for alias: !f() { : <cmd>; ... }' ' + test_config alias.co "!f() { : checkout; if ... } f" && + test_completion "git co m" <<-\EOF + main Z + mybranch Z + mytag Z + EOF +' + test_expect_success 'completion without explicit _git_xxx function' ' test_completion "git version --" <<-\EOF --build-options Z
Re: [PATCH] completion: loosen and document the requirement around completing alias
Quoted 31 lines · Junio C Hamano
Quoted 5 lines · Junio C Hamano
* We've discussed this when we reviewed the topic that just hit 'master'. Before we forget...
contrib/completion/git-completion.bash | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)And here is an obligatory "test" update I will squash into the main patch. The new ones copy a canonical ": git <cmd> ; ..." test and remove 'git' and also the space before the semicolon.
t/t9902-completion.sh +11
-0@@ -2464,6 +2464,24 @@ test_expect_success 'completion used <cmd> completion for alias: !f() { : git <c EOF ' +test_expect_success 'completion used <cmd> completion for alias: !f() { : <cmd> ; ... }' ' + test_config alias.co "!f() { : checkout ; if ... } f" && + test_completion "git co m" <<-\EOF + main Z + mybranch Z + mytag Z + EOF +' + +test_expect_success 'completion used <cmd> completion for alias: !f() { : <cmd>; ... }' ' + test_config alias.co "!f() { : checkout; if ... } f" &&
t/t9902-completion.sh test_expect_success 'completion used <cmd> completion for alias: !f() { : git <c · line 2487
Quoted 10 lines
t/t9902-completion.sh +7
-0+ test_completion "git co m" <<-\EOF + main Z + mybranch Z + mytag Z + EOF +' + test_expect_success 'completion without explicit _git_xxx function' ' test_completion "git version --" <<-\EOF --build-options Z
LGTM, thanks!
Re: [PATCH] completion: loosen and document the requirement around completing alias
Quoted 8 lines · Linus Arver
Quoted 4 lines · Junio C Hamano
Quoted 2 lines · Junio C Hamano
* We've discussed this when we reviewed the topic that just hit 'master'. Before we forget...
...
LGTM, thanks!
Thanks for reading.