From: Junio C Hamano <gitster@pobox.com>
To: Denton Liu <liu.denton@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>,
David Aguilar <davvid@gmail.com>,
Jeff Hostetler <git@jeffhostetler.com>,
Eric Sunshine <sunshine@sunshineco.com>
Subject: Re: [PATCH v3 4/6] mergetool: fallback to tool when guitool unavailable
Date: Thu, 25 Apr 2019 12:02:23 +0900 [thread overview]
Message-ID: <xmqq7ebizt1c.fsf@gitster-ct.c.googlers.com> (raw)
In-Reply-To: <e975fe4a8b206d8e40f9c4d7cd278fdb5c7358f0.1556142510.git.liu.denton@gmail.com> (Denton Liu's message of "Wed, 24 Apr 2019 15:47:01 -0700")
Denton Liu <liu.denton@gmail.com> writes:
> In git-difftool, if the tool is called with --gui but `diff.guitool` is
> not set, it falls back to `diff.tool`. Make git-mergetool also fallback
> from `merge.guitool` to `merge.tool` if the former is undefined.
>
> If git-difftool were to use `get_configured_mergetool`, it would also
I agree that the precedence order below makes sense, but I am a bit
confused by "were to use" here. Do you mean you'll make the change
to make difftool to look at mergetool configuraiton in a later step
in the series? Or is there a way for the user to say "I want my
difftool to also pay attention to the mergetool configurations" (and
another "I do not want that" option)? I'll come back to this later.
> get the fallback behaviour in the following precedence:
>
> 1. diff.guitool
> 2. merge.guitool
> 3. diff.tool
> 4. merge.tool
>
> Signed-off-by: Denton Liu <liu.denton@gmail.com>
> ---
> Documentation/git-mergetool.txt | 4 +++-
> git-mergetool--lib.sh | 27 ++++++++++++++++++---------
> t/t7610-mergetool.sh | 19 +++++++++++++++++++
> 3 files changed, 40 insertions(+), 10 deletions(-)
>
> diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.txt
> index 0c7975a050..6b14702e78 100644
> --- a/Documentation/git-mergetool.txt
> +++ b/Documentation/git-mergetool.txt
> @@ -83,7 +83,9 @@ success of the resolution after the custom tool has exited.
> --gui::
> When 'git-mergetool' is invoked with the `-g` or `--gui` option
> the default merge tool will be read from the configured
> - `merge.guitool` variable instead of `merge.tool`.
> + `merge.guitool` variable instead of `merge.tool`. If
> + `merge.guitool` is not set, we will fallback to the tool
> + configured under `merge.tool`.
Makes sense. So "mergetool --gui" from the command line would look
at guitool and then tool in the merge section.
> diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
> index 68ff26a0f7..ada16acffc 100644
> --- a/git-mergetool--lib.sh
> +++ b/git-mergetool--lib.sh
> @@ -350,20 +350,29 @@ guess_merge_tool () {
> }
>
> get_configured_merge_tool () {
> - # If first argument is true, find the guitool instead
> - if test "$1" = true
> + is_gui="$1"
> + sections="merge"
> + keys="tool"
> +
> + if diff_mode
> then
> - gui_prefix=gui
> + sections="diff $sections"
> fi
>
> - # Diff mode first tries diff.(gui)tool and falls back to merge.(gui)tool.
> - # Merge mode only checks merge.(gui)tool
> - if diff_mode
> + if "$is_gui" = true
> then
> - merge_tool=$(git config diff.${gui_prefix}tool || git config merge.${gui_prefix}tool)
> - else
> - merge_tool=$(git config merge.${gui_prefix}tool)
> + keys="guitool $keys"
> fi
OK, so $sections is "diff merge" for difftool and just "merge" for mergetool.
$tool is "guitool tool" under "--gui", and just "tool" otherwise.
> + IFS=' '
> + for key in $keys
> + do
> + for section in $sections
> + do
> + merge_tool=$(git config $section.$key) && break 2
> + done
> + done
And you do up to four iterations to cover the combination in the
precedence order. Which makes sense.
I am not sure about the wisdom of setting IFS here, though.
As far as I can see, both $keys and $sections do not take any
arbitrary values, but just the two (for each) values you know that
do not have any funny characters, so I am not sure what you are
trying to achieve by that (i.e. benefit is unclear).
As long as the get_configured_merge_tool function is called always
for string_emitted_to_stdout=$(that function), the updated setting
will not leak to the outside world so there is no risk to break its
callers, but it is not immediately obvious if helper functions
called in the remainder of this function are OK with the modified
value of IFS (i.e. safety is not obvious).
Now for the promised "come back to this later", I think you meant
"the get_configured_merge_tool function is already prepared to be
used from difftool in this step and when difftool starts to call it
here is what happens". But I wonder if it makes the evolution of
the topic easier to follow if you defer it to a later step when you
actually make difftool to start calling it? In other words, in this
step, your get_configured_merge_tool would look like
sections=merge
case "$1" in
true)
keys="guitool tool" ;;
*)
keys="tool" ;;
esac
for key in $keys
do
for section in $sections
do
merge_tool=$(git config ...) && break 2
done
done
...
and then in a later step (6/6?), the unconditional setting of
sections to 'merge' would be updated so that in diff_mode, you'll
iterate over two sections.
I dunno.
next prev parent reply other threads:[~2019-04-25 3:02 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-22 5:07 [PATCH 0/5] difftool and mergetool improvements Denton Liu
2019-04-22 5:07 ` [PATCH 1/5] t7610: add mergetool --gui tests Denton Liu
2019-04-22 5:07 ` [PATCH 2/5] mergetool: use get_merge_tool function Denton Liu
2019-04-22 7:07 ` Eric Sunshine
2019-04-22 8:35 ` Denton Liu
2019-04-22 5:07 ` [PATCH 3/5] mergetool: fallback to tool when guitool unavailable Denton Liu
2019-04-22 5:07 ` [PATCH 4/5] difftool: make --gui, --tool and --extcmd exclusive Denton Liu
2019-04-22 7:03 ` Eric Sunshine
2019-04-22 5:07 ` [PATCH 5/5] difftool: fallback on merge.guitool Denton Liu
2019-04-22 18:18 ` Jeff Hostetler
2019-04-22 18:33 ` Denton Liu
2019-04-23 8:53 ` [PATCH v2 0/5] difftool and mergetool improvements Denton Liu
2019-04-23 8:53 ` [PATCH v2 1/5] t7610: add mergetool --gui tests Denton Liu
2019-04-24 7:07 ` Junio C Hamano
2019-04-23 8:54 ` [PATCH v2 2/5] mergetool: use get_merge_tool_guessed function Denton Liu
2019-04-24 7:27 ` Junio C Hamano
2019-04-23 8:54 ` [PATCH v2 3/5] mergetool: fallback to tool when guitool unavailable Denton Liu
2019-04-23 8:54 ` [PATCH v2 4/5] difftool: make --gui, --tool and --extcmd mutually exclusive Denton Liu
2019-04-23 8:54 ` [PATCH v2 5/5] difftool: fallback on merge.guitool Denton Liu
2019-04-24 22:46 ` [PATCH v3 0/6] difftool and mergetool improvements Denton Liu
2019-04-24 22:46 ` [PATCH v3 1/6] t7610: unsuppress output Denton Liu
2019-04-25 2:31 ` Junio C Hamano
2019-04-24 22:46 ` [PATCH v3 2/6] t7610: add mergetool --gui tests Denton Liu
2019-04-24 22:47 ` [PATCH v3 3/6] mergetool: use get_merge_tool function Denton Liu
2019-04-25 2:36 ` Junio C Hamano
2019-04-24 22:47 ` [PATCH v3 4/6] mergetool: fallback to tool when guitool unavailable Denton Liu
2019-04-25 3:02 ` Junio C Hamano [this message]
2019-04-25 5:16 ` Denton Liu
2019-04-24 22:47 ` [PATCH v3 5/6] difftool: make --gui, --tool and --extcmd mutually exclusive Denton Liu
2019-04-24 22:47 ` [PATCH v3 6/6] difftool: fallback on merge.guitool Denton Liu
2019-04-25 3:10 ` Junio C Hamano
2019-04-25 9:54 ` [PATCH v4 0/6] difftool and mergetool improvements Denton Liu
2019-04-25 9:54 ` [PATCH v4 1/6] t7610: unsuppress output Denton Liu
2019-04-25 9:54 ` [PATCH v4 2/6] t7610: add mergetool --gui tests Denton Liu
2019-04-25 9:54 ` [PATCH v4 3/6] mergetool: use get_merge_tool function Denton Liu
2019-04-28 23:52 ` David Aguilar
2019-04-25 9:54 ` [PATCH v4 4/6] mergetool: fallback to tool when guitool unavailable Denton Liu
2019-04-28 23:56 ` David Aguilar
2019-04-25 9:54 ` [PATCH v4 5/6] difftool: make --gui, --tool and --extcmd mutually exclusive Denton Liu
2019-04-25 9:54 ` [PATCH v4 6/6] difftool: fallback on merge.guitool Denton Liu
2019-04-29 6:20 ` [PATCH v5 0/7] difftool and mergetool improvements Denton Liu
2019-04-29 6:21 ` [PATCH v5 1/7] t7610: unsuppress output Denton Liu
2019-04-29 6:21 ` [PATCH v5 2/7] t7610: add mergetool --gui tests Denton Liu
2019-04-29 6:21 ` [PATCH v5 3/7] mergetool: use get_merge_tool function Denton Liu
2019-04-29 6:21 ` [PATCH v5 4/7] mergetool--lib: create gui_mode function Denton Liu
2019-04-29 6:21 ` [PATCH v5 5/7] mergetool: fallback to tool when guitool unavailable Denton Liu
2019-04-29 6:21 ` [PATCH v5 6/7] difftool: make --gui, --tool and --extcmd mutually exclusive Denton Liu
2019-04-29 6:21 ` [PATCH v5 7/7] difftool: fallback on merge.guitool Denton Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqq7ebizt1c.fsf@gitster-ct.c.googlers.com \
--to=gitster@pobox.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=davvid@gmail.com \
--cc=git@jeffhostetler.com \
--cc=git@vger.kernel.org \
--cc=liu.denton@gmail.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).