merge: support --strategy '?' for git-completion.bash
PATCH 1/1 merge: support --strategy '?' for git-completion.bash
Bash completion support gets the list of available strategies with a grep and sed trick which does not work on non-C locale since the anchor string is translated and it does not cover custom strategies either.
Let's do it a better way and make git-merge provide all available strategies in machine-readable form.
---
Another, perhaps better, option is add "git merge --list-strategies". It requires some code movement, so I'll try with a simpler approach first.
Documentation/merge-options.txt | 3 +++ builtin/merge.c | 7 +++++++ contrib/completion/git-completion.bash | 9 +-------- 3 files changed, 11 insertions(+), 8 deletions(-)
Documentation/merge-options.txt +3 -0
@@ -97,6 +97,9 @@ option can be used to override --squash. If there is no `-s` option, a built-in list of strategies is used instead ('git merge-recursive' when merging a single head, 'git merge-octopus' otherwise). ++ +The special strategy '?' lists all available strategies and exits +immediately. No merge operation is done. -X <option>:: --strategy-option=<option>::
builtin/merge.c +7 -0
@@ -140,6 +140,13 @@ static struct strategy *get_strategy(const char *name) }exclude_cmds (&main_cmds, ¬_strategies); } +if (!strcmp (name,"?" )) { +for (i =0 ; i < main_cmds.cnt; i++) +puts (main_cmds.names[i]->name); +for (i =0 ; i < other_cmds.cnt; i++) +puts (other_cmds.names[i]->name); +exit (0 ); + }if (!is_in_cmdlist (&main_cmds, name) && !is_in_cmdlist (&other_cmds, name)) {fprintf (stderr,_ ("Could not find merge strategy '%s'.\n" ), name);fprintf (stderr,_ ("Available strategies are:" ));
contrib/completion/git-completion.bash +1 -8
@@ -594,14 +594,7 @@ __git_is_configured_remote () __git_list_merge_strategies () { - git merge -s help 2>&1 | - sed -n -e '/[Aa]vailable strategies are: /,/^$/{ - s/\.$// - s/.*:// - s/^[ ]*// - s/[ ]*$// - p - }' + git merge --strategy '?' } __git_merge_strategies=
Signature · 1 line
2.16.0.47.g3d9b0fac3a
Quoted 4 lines · Nguyễn Thái Ngọc Duy
Bash completion support gets the list of available strategies with a grep and sed trick which does not work on non-C locale since the anchor string is translated and it does not cover custom strategies either.
Quoted 8 lines
Let's do it a better way and make git-merge provide all available strategies in machine-readable form.
Signed-off-by Nguyễn Thái Ngọc Duy <[email protected]>---
Another, perhaps better, option is add "git merge --list-strategies". It requires some code movement, so I'll try with a simpler approach first.
If you run the probing "merge -s help" under C locale, that would just be a one-liner, no ;-) I.e.
Review
Quoted 2 lines
(quoted diff) +1
-1- git merge -s help 2>&1 | + LANG=C LC_ALL=C git merge -s help 2>&1 |
Not rejecting the patch, but just wondering.
Quoted 9 lines · Junio C Hamano
Quoted 7 lines · Nguyễn Thái Ngọc Duy
Bash completion support gets the list of available strategies with a grep and sed trick which does not work on non-C locale since the anchor string is translated and it does not cover custom strategies either.
Let's do it a better way and make git-merge provide all available strategies in machine-readable form.
Quoted 8 lines
Quoted 5 lines
Signed-off-by Nguyễn Thái Ngọc Duy <[email protected]>---
Another, perhaps better, option is add "git merge --list-strategies". It requires some code movement, so I'll try with a simpler approach first.If you run the probing "merge -s help" under C locale, that would just be a one-liner, no ;-) I.e.
That was my first choice but I was worried that it failed to catch custom strategies which are preceded with a different anchor string "Available custom strategies are:".
I didn't look carefully at those sed magic. But it looks like it correctly handles this case too. So v2 follows below. It still feels dirty to do this kind of text manipulation though. But that can wait.
-- 8< --
Subject: [PATCH] completion: fix completing merge strategies on non-C locales
The anchor string "Available strategies are:" is translatable so __git_list_merge_strategies may fail to collect available strategies from 'git merge' on non-C locales. Force C locale on this command.
--- contrib/completion/git-completion.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
contrib/completion/git-completion.bash +1 -1
@@ -594,7 +594,7 @@ __git_is_configured_remote () __git_list_merge_strategies () { - git merge -s help 2>&1 | + LANG=C LC_ALL=C git merge -s help 2>&1 | sed -n -e '/[Aa]vailable strategies are: /,/^$/{ s/\.$// s/.*://
Signature · 5 lines
2.16.1.196.g4f5118c359 -- 8< --
Quoted 3 lines · Duy Nguyen
I didn't look carefully at those sed magic. But it looks like it correctly handles this case too. So v2 follows below. It still feels dirty to do this kind of text manipulation though. But that can wait.
I do like "introduce and use helper feature to produce machine parseable text" when it is appropriate. But this alternative looks more in line with the current design of completion script and can easily be a maint material as pure bugfix for non C locale folks.
Will queue.
Quoted 27 lines
-- 8< --
Subject: [PATCH] completion: fix completing merge strategies on non-C localesThe anchor string "Available strategies are:" is translatable so
__git_list_merge_strategiesmay fail to collect available strategies from 'git merge' on non-C locales. Force C locale on this command.Signed-off-by Nguyễn Thái Ngọc Duy <[email protected]>---
contrib/completion/git-completion.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)contrib/completion/git-completion.bash +1
-1@@ -594,7 +594,7 @@ __git_is_configured_remote () __git_list_merge_strategies () { - git merge -s help 2>&1 | + LANG=C LC_ALL=C git merge -s help 2>&1 | sed -n -e '/[Aa]vailable strategies are: /,/^$/{ s/\.$// s/.*://