Re: [PATCH] mergetool: support --tool-help option like difftool does
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jul 23, 2012, 19:52 UTC
- Message-ID
- <7vhasyl0gc.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <500D9EDB.90603@gmail.com>
Sebastian Schuberth <sschuberth@gmail.com> writes:
Show 25 quoted lines
> This way we do not have to risk the list of tools go out of sync > between the implementation and the documentation. Adjust the documentation > accordingly to not explicitly list the tools but refer to --tool-help. > > Signed-off-by: Junio C Hamano <gitster@pobox.com> > Signed-off-by: Sebastian Schuberth <sschuberth@gmail.com> > --- > Documentation/git-difftool.txt | 7 ++++--- > Documentation/git-mergetool.txt | 8 ++++---- > git-mergetool--lib.sh | 11 ++++++++++- > git-mergetool.sh | 42 ++++++++++++++++++++++++++++++++++++++++- > 4 files changed, 59 insertions(+), 9 deletions(-) > > diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt > index 31fc2e3..0bdfe35 100644 > --- a/Documentation/git-difftool.txt > +++ b/Documentation/git-difftool.txt > @@ -36,9 +36,10 @@ OPTIONS > > -t <tool>:: > --tool=<tool>:: > - Use the diff tool specified by <tool>. Valid values include > - emerge, kompare, meld, and vimdiff. Run `git difftool --tool-help` > - for the list of valid <tool> settings. > + Use the diff tool specified by <tool>.
I do not see how it is an improvement to drop the most common ones. People sometimes read documentation without having an access to shell to run "cmd --tool-help", and a list of handful of well known ones would serve as a good hint to let the reader know the kind of commands the front-end is capable of spawning, which in turn help such a reader to imagine how the command is used to judge if it is something the reader wants to use.
Show 19 quoted lines
> + > +--tool-help:: > + List all supported values for <tool>. > + > If a diff tool is not specified, 'git difftool' > will use the configuration variable `diff.tool`. If the > diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.txt > index 2a49de7..99e53b1 100644 > --- a/Documentation/git-mergetool.txt > +++ b/Documentation/git-mergetool.txt > @@ -26,10 +26,10 @@ OPTIONS > ------- > -t <tool>:: > --tool=<tool>:: > - Use the merge resolution program specified by <tool>. > - Valid merge tools are: > - araxis, bc3, diffuse, ecmerge, emerge, gvimdiff, kdiff3, > - meld, opendiff, p4merge, tkdiff, tortoisemerge, vimdiff and xxdiff. > + Use the merge tool specified by <tool>.
Likewise. Dropping araxis, bc3, etc. to trim the list to 4-5 items that people would know what they are would make sense, though. The purpose of the list is not to tell if the reader's favorite tool is supported or not---it is to hint the flavor of what kind of things the command spawned would be capable of.
Show 115 quoted lines
> +
> +--tool-help::
> + List all supported values for <tool>.
> +
> If a merge resolution program is not specified, 'git mergetool'
> will use the configuration variable `merge.tool`. If the
> diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
> index ed630b2..f0865d4 100644
> --- a/git-mergetool--lib.sh
> +++ b/git-mergetool--lib.sh
> @@ -111,15 +111,18 @@ run_merge_tool () {
> return $status
> }
>
> -guess_merge_tool () {
> +list_merge_tool_candidates () {
> + # Add tools that can either do merging or diffing, but not both.
> if merge_mode
> then
> tools="tortoisemerge"
> else
> tools="kompare"
> fi
> +
> if test -n "$DISPLAY"
> then
> + # Prefer GTK-based tools under Gnome.
> if test -n "$GNOME_DESKTOP_SESSION_ID"
> then
> tools="meld opendiff kdiff3 tkdiff xxdiff $tools"
> @@ -128,6 +131,8 @@ guess_merge_tool () {
> fi
> tools="$tools gvimdiff diffuse ecmerge p4merge araxis bc3"
> fi
> +
> + # Prefer vimdiff if vim is the default editor.
> case "${VISUAL:-$EDITOR}" in
> *vim*)
> tools="$tools vimdiff emerge"
> @@ -136,6 +141,10 @@ guess_merge_tool () {
> tools="$tools emerge vimdiff"
> ;;
> esac
> +}
> +
> +guess_merge_tool () {
> + list_merge_tool_candidates
> echo >&2 "merge tool candidates: $tools"
>
> # Loop over each candidate and stop when a valid merge tool is found.
> diff --git a/git-mergetool.sh b/git-mergetool.sh
> index a9f23f7..0db0c44 100755
> --- a/git-mergetool.sh
> +++ b/git-mergetool.sh
> @@ -8,7 +8,7 @@
> # at the discretion of Junio C Hamano.
> #
>
> -USAGE='[--tool=tool] [-y|--no-prompt|--prompt] [file to merge] ...'
> +USAGE='[--tool=tool] [--tool-help] [-y|--no-prompt|--prompt] [file to merge] ...'
> SUBDIRECTORY_OK=Yes
> OPTIONS_SPEC=
> TOOL_MODE=merge
> @@ -284,11 +284,51 @@ merge_file () {
> return 0
> }
>
> +show_tool_help () {
> + TOOL_MODE=merge
> + list_merge_tool_candidates
> + unavailable= available= LF='
> +'
> + for i in $tools
> + do
> + merge_tool_path=$(translate_merge_tool_path "$i")
> + if type "$merge_tool_path" >/dev/null 2>&1
> + then
> + available="$available$i$LF"
> + else
> + unavailable="$unavailable$i$LF"
> + fi
> + done
> + if test -n "$available"
> + then
> + echo "'git mergetool --tool=<tool>' may be set to one of the following:"
> + echo "$available" | sort | sed -e 's/^/ /'
> + else
> + echo "No suitable tool for 'git mergetool --tool=<tool>' found."
> + fi
> + if test -n "$unavailable"
> + then
> + echo
> + echo 'The following tools are valid, but not currently available:'
> + echo "$unavailable" | sort | sed -e 's/^/ /'
> + fi
> + if test -n "$unavailable$available"
> + then
> + echo
> + echo "Some of the tools listed above only work in a windowed"
> + echo "environment. If run in a terminal-only session, they will fail."
> + fi
> + exit 0
> +}
> +
> prompt=$(git config --bool mergetool.prompt || echo true)
>
> while test $# != 0
> do
> case "$1" in
> + --tool-help)
> + show_tool_help
> + ;;
> -t|--tool*)
> case "$#,$1" in
> *,*=*)