diff mbox series

[2/5] mergetool: use get_merge_tool function

Message ID 692875cf4baaeee8b47fd7e95d0b787d1a08f64e.1555880168.git.liu.denton@gmail.com (mailing list archive)
State New, archived
Headers show
Series difftool and mergetool improvements | expand

Commit Message

Denton Liu April 22, 2019, 5:07 a.m. UTC
In git-mergetool, the logic for getting which merge tool to use is
duplicated in git-mergetool--lib, except for the fact that it needs to
know whether the tool was guessed or not.

Rewrite `get_merge_tool` to return whether or not the tool was guessed
and make git-mergetool call this function instead of duplicating the
logic. Also, let `$GIT_MERGETOOL_GUI` be set to determine whether or not
the guitool will be selected.

Signed-off-by: Denton Liu <liu.denton@gmail.com>
---
 Documentation/git-mergetool--lib.txt |  5 ++++-
 git-difftool--helper.sh              |  2 +-
 git-mergetool--lib.sh                |  6 ++++--
 git-mergetool.sh                     | 11 +++--------
 4 files changed, 12 insertions(+), 12 deletions(-)

Comments

Eric Sunshine April 22, 2019, 7:07 a.m. UTC | #1
On Mon, Apr 22, 2019 at 1:07 AM Denton Liu <liu.denton@gmail.com> wrote:
> [...]
> Rewrite `get_merge_tool` to return whether or not the tool was guessed
> and make git-mergetool call this function instead of duplicating the
> logic. Also, let `$GIT_MERGETOOL_GUI` be set to determine whether or not
> the guitool will be selected.
>
> Signed-off-by: Denton Liu <liu.denton@gmail.com>
> ---
> diff --git a/Documentation/git-mergetool--lib.txt b/Documentation/git-mergetool--lib.txt
> @@ -28,7 +28,10 @@ to define the operation mode for the functions listed below.
>  get_merge_tool::
> -       returns a merge tool.
> +       returns '$is_guessed:$merge_tool'. '$is_guessed' is 'true' if
> +       the tool was guessed, else 'false'. '$merge_tool' is the merge
> +       tool to use. '$GIT_MERGETOOL_GUI' may be set to 'true' to search
> +       for the appropriate guitool.

What is the likelihood that code outside of our control is using this
function? If there is such code, this backward-incompatible change
will break that code. If the likelihood is excessively small, perhaps
it is not worth worrying about, otherwise, perhaps this warrants a new
function with a distinct name.
Denton Liu April 22, 2019, 8:35 a.m. UTC | #2
Hi Eric,

On Mon, Apr 22, 2019 at 03:07:25AM -0400, Eric Sunshine wrote:
> On Mon, Apr 22, 2019 at 1:07 AM Denton Liu <liu.denton@gmail.com> wrote:
> > [...]
> > Rewrite `get_merge_tool` to return whether or not the tool was guessed
> > and make git-mergetool call this function instead of duplicating the
> > logic. Also, let `$GIT_MERGETOOL_GUI` be set to determine whether or not
> > the guitool will be selected.
> >
> > Signed-off-by: Denton Liu <liu.denton@gmail.com>
> > ---
> > diff --git a/Documentation/git-mergetool--lib.txt b/Documentation/git-mergetool--lib.txt
> > @@ -28,7 +28,10 @@ to define the operation mode for the functions listed below.
> >  get_merge_tool::
> > -       returns a merge tool.
> > +       returns '$is_guessed:$merge_tool'. '$is_guessed' is 'true' if
> > +       the tool was guessed, else 'false'. '$merge_tool' is the merge
> > +       tool to use. '$GIT_MERGETOOL_GUI' may be set to 'true' to search
> > +       for the appropriate guitool.
> 
> What is the likelihood that code outside of our control is using this
> function? If there is such code, this backward-incompatible change
> will break that code. If the likelihood is excessively small, perhaps
> it is not worth worrying about, otherwise, perhaps this warrants a new
> function with a distinct name.

Thanks for considering this, I hadn't thought about it myself. I assumed
this was an internal function but I guess I was wrong.

I did a bit of digging on GitHub and Google and I found that
git-diffall[1] uses it, although it seems quite old and unmaintained.
Aside from this, I can't find any other open-source programs which use
git-mergetool--lib (and in particular, get_merge_tool) so I believe that
it is pretty rare.

That being said, I'm open to writing a new function so that the change
will be backwards compatible. I'll see what the list has to say.

Thanks,

Denton

[1]: https://github.com/thenigan/git-diffall
diff mbox series

Patch

diff --git a/Documentation/git-mergetool--lib.txt b/Documentation/git-mergetool--lib.txt
index 055550b2bc..c4f10209e0 100644
--- a/Documentation/git-mergetool--lib.txt
+++ b/Documentation/git-mergetool--lib.txt
@@ -28,7 +28,10 @@  to define the operation mode for the functions listed below.
 FUNCTIONS
 ---------
 get_merge_tool::
-	returns a merge tool.
+	returns '$is_guessed:$merge_tool'. '$is_guessed' is 'true' if
+	the tool was guessed, else 'false'. '$merge_tool' is the merge
+	tool to use. '$GIT_MERGETOOL_GUI' may be set to 'true' to search
+	for the appropriate guitool.
 
 get_merge_tool_cmd::
 	returns the custom command for a merge tool.
diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh
index 7bfb6737df..78a0446668 100755
--- a/git-difftool--helper.sh
+++ b/git-difftool--helper.sh
@@ -71,7 +71,7 @@  then
 	then
 		merge_tool="$GIT_DIFF_TOOL"
 	else
-		merge_tool="$(get_merge_tool)" || exit
+		merge_tool="$(get_merge_tool | sed -e 's/^[a-z]*://')" || exit
 	fi
 fi
 
diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
index 83bf52494c..d5e2c6c5c6 100644
--- a/git-mergetool--lib.sh
+++ b/git-mergetool--lib.sh
@@ -403,14 +403,16 @@  get_merge_tool_path () {
 }
 
 get_merge_tool () {
+	is_guessed=false
 	# Check if a merge tool has been configured
-	merge_tool=$(get_configured_merge_tool)
+	merge_tool=$(get_configured_merge_tool $GIT_MERGETOOL_GUI)
 	# Try to guess an appropriate merge tool if no tool has been set.
 	if test -z "$merge_tool"
 	then
 		merge_tool=$(guess_merge_tool) || exit
+		is_guessed=true
 	fi
-	echo "$merge_tool"
+	echo "$is_guessed:$merge_tool"
 }
 
 mergetool_find_win32_cmd () {
diff --git a/git-mergetool.sh b/git-mergetool.sh
index 01b9ad59b2..6ad8024e46 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -449,14 +449,9 @@  main () {
 
 	if test -z "$merge_tool"
 	then
-		# Check if a merge tool has been configured
-		merge_tool=$(get_configured_merge_tool $gui_tool)
-		# Try to guess an appropriate merge tool if no tool has been set.
-		if test -z "$merge_tool"
-		then
-			merge_tool=$(guess_merge_tool) || exit
-			guessed_merge_tool=true
-		fi
+		IFS=':' read guessed_merge_tool merge_tool <<-EOF
+		$(GIT_MERGETOOL_GUI=$gui_tool get_merge_tool)
+		EOF
 	fi
 	merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
 	merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"