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. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- 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(-) diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt index 3888c3ff85..cd4342844f 100644 --- a/Documentation/merge-options.txt +++ b/Documentation/merge-options.txt @@ -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>:: diff --git a/builtin/merge.c b/builtin/merge.c index 30264cfd7c..a09d04302c 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -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:")); diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 3683c772c5..6d947be858 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -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= -- 2.16.0.47.g3d9b0fac3a