All of lore.kernel.org
 help / color / mirror / Atom feed
* Quit git difftool on error code
@ 2014-10-25 10:40 Adri Farr
  2014-10-26  1:24 ` [PATCH] difftool: add support for --trust-exit-code David Aguilar
  0 siblings, 1 reply; 4+ messages in thread
From: Adri Farr @ 2014-10-25 10:40 UTC (permalink / raw)
  To: git

Hello!,

Pardon my ignorance, but I haven't found the solution anywhere. Is
there a way to make git difftool quit when it receives an error code?
I have vim as my difftool, and if I quit with an error (:cq) when
there are pending files to be diffed, git difftool doesn't quit and
keeps pushing me files to be diffed until there are no more pending
files. What is the best way to get out of it?

Thank you

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] difftool: add support for --trust-exit-code
  2014-10-25 10:40 Quit git difftool on error code Adri Farr
@ 2014-10-26  1:24 ` David Aguilar
  2014-10-26  1:38   ` [PATCH v2] " David Aguilar
  0 siblings, 1 reply; 4+ messages in thread
From: David Aguilar @ 2014-10-26  1:24 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Adri Farr

Teach difftool to exit when a diff tool returns a non-zero exit
code when either --trust-exit-code is specified or
difftool.trustExitCode is true.

Forward exit codes from invoked diff tools to the caller when
--trust-exit-code is used.

Suggested-by: Adri Farr <14farresa@gmail.com>
Signed-off-by: David Aguilar <davvid@gmail.com>
---
 Documentation/git-difftool.txt | 14 ++++++++++++++
 git-difftool--helper.sh        |  7 +++++++
 git-difftool.perl              | 12 ++++++++++++
 t/t7800-difftool.sh            | 43 ++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 76 insertions(+)

diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt
index 11887e6..dc843d3 100644
--- a/Documentation/git-difftool.txt
+++ b/Documentation/git-difftool.txt
@@ -91,6 +91,15 @@ instead.  `--no-symlinks` is the default on Windows.
 	the default diff tool will be read from the configured
 	`diff.guitool` variable instead of `diff.tool`.
 
+--[no-]trust-exit-code::
+	'git-difftool' invokes a diff tool individually on each file.
+	Errors reported by the diff tool are ignored by default.
+	Use `--trust-exit-code` to make 'git-difftool' exit when an an
+	invoked diff tool returns a non-zero exit code.
++
+'git-difftool' will forward the exit code of the invoked tool when
+'--trust-exit-code' is used.
+
 See linkgit:git-diff[1] for the full list of supported options.
 
 CONFIG VARIABLES
@@ -116,6 +125,11 @@ See the `--tool=<tool>` option above for more details.
 difftool.prompt::
 	Prompt before each invocation of the diff tool.
 
+difftool.trustExitCode::
+	Exit difftool if the invoked diff tool returns a non-zero exit status.
++
+See the `--trust-exit-code` option above for more details.
+
 SEE ALSO
 --------
 linkgit:git-diff[1]::
diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh
index 7ef36b9..fdbd768 100755
--- a/git-difftool--helper.sh
+++ b/git-difftool--helper.sh
@@ -62,6 +62,8 @@ launch_merge_tool () {
 	else
 		run_merge_tool "$merge_tool"
 	fi
+	status=$?
+	return $status
 }
 
 if ! use_ext_cmd
@@ -85,5 +87,10 @@ else
 	do
 		launch_merge_tool "$1" "$2" "$5"
 		shift 7
+		if test "$status" != 0 &&
+			test "$GIT_DIFFTOOL_TRUST_EXIT_CODE" = true
+		then
+			exit $status
+		fi
 	done
 fi
diff --git a/git-difftool.perl b/git-difftool.perl
index 598fcc2..7df7c8a 100755
--- a/git-difftool.perl
+++ b/git-difftool.perl
@@ -342,6 +342,7 @@ sub main
 		symlinks => $^O ne 'cygwin' &&
 				$^O ne 'MSWin32' && $^O ne 'msys',
 		tool_help => undef,
+		trust_exit_code => undef,
 	);
 	GetOptions('g|gui!' => \$opts{gui},
 		'd|dir-diff' => \$opts{dirdiff},
@@ -352,6 +353,8 @@ sub main
 		'no-symlinks' => sub { $opts{symlinks} = 0; },
 		't|tool:s' => \$opts{difftool_cmd},
 		'tool-help' => \$opts{tool_help},
+		'trust-exit-code' => \$opts{trust_exit_code},
+		'no-trust-exit-code' => sub { $opts{trust_exit_code} = 0; },
 		'x|extcmd:s' => \$opts{extcmd});
 
 	if (defined($opts{help})) {
@@ -383,6 +386,15 @@ sub main
 		}
 	}
 
+	if (!defined $opts{trust_exit_code}) {
+		$opts{trust_exit_code} = Git::config_bool('difftool.trustExitCode');
+	}
+	if ($opts{trust_exit_code}) {
+		$ENV{GIT_DIFFTOOL_TRUST_EXIT_CODE} = 'true';
+	} else {
+		$ENV{GIT_DIFFTOOL_TRUST_EXIT_CODE} = 'false';
+	}
+
 	# In directory diff mode, 'git-difftool--helper' is called once
 	# to compare the a/b directories.  In file diff mode, 'git diff'
 	# will invoke a separate instance of 'git-difftool--helper' for
diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index dc30a51..2b89b7b 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh
@@ -76,6 +76,49 @@ test_expect_success PERL 'difftool forwards arguments to diff' '
 	rm for-diff
 '
 
+test_expect_success PERL 'difftool ignores exit code' '
+	test_config difftool.error.cmd false &&
+	git difftool -y -t error branch
+'
+
+test_expect_success PERL 'difftool forwards exit code with --trust-exit-code' '
+	test_config difftool.error.cmd false &&
+	test_must_fail git difftool -y --trust-exit-code -t error branch
+'
+
+test_expect_success PERL 'difftool honors difftool.trustExitCode = true' '
+	test_config difftool.error.cmd false &&
+	test_config difftool.trustExitCode true &&
+	test_must_fail git difftool -y -t error branch
+'
+
+test_expect_success PERL 'difftool honors difftool.trustExitCode = false' '
+	test_config difftool.error.cmd false &&
+	test_config difftool.trustExitCode false &&
+	git difftool -y -t error branch
+'
+
+test_expect_success PERL 'difftool ignores exit code with --no-trust-exit-code' '
+	test_config difftool.error.cmd false &&
+	test_config difftool.trustExitCode true &&
+	git difftool -y --no-trust-exit-code -t error branch
+'
+
+write_script fail-right-file <<\EOF
+echo "$2"
+exit 1
+EOF
+
+test_expect_success PERL 'difftool stops on error with --trust-exit-code' '
+	>for-diff &&
+	git add for-diff &&
+	echo branch >actual &&
+	test_must_fail git difftool -y --trust-exit-code \
+		--extcmd "$(pwd)/fail-right-file" branch >actual &&
+	test_cmp expect actual &&
+	rm -f for-diff fail-right-file
+'
+
 test_expect_success PERL 'difftool honors --gui' '
 	difftool_test_setup &&
 	test_config merge.tool bogus-tool &&
-- 
2.1.2.556.g2136b5c

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2] difftool: add support for --trust-exit-code
  2014-10-26  1:24 ` [PATCH] difftool: add support for --trust-exit-code David Aguilar
@ 2014-10-26  1:38   ` David Aguilar
  2014-10-26  7:31     ` Johannes Sixt
  0 siblings, 1 reply; 4+ messages in thread
From: David Aguilar @ 2014-10-26  1:38 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Adri Farr

Teach difftool to exit when a diff tool returns a non-zero exit
code when either --trust-exit-code is specified or
difftool.trustExitCode is true.

Forward exit codes from invoked diff tools to the caller when
--trust-exit-code is used.

Suggested-by: Adri Farr <14farresa@gmail.com>
Signed-off-by: David Aguilar <davvid@gmail.com>
---
Changes since v1:

This fixes typos in the documentation (s/an an/an/) and tests.

I'll wait until tomorrow before sending follow-ups in case anyone spots
any other issues.

 Documentation/git-difftool.txt | 14 ++++++++++++++
 git-difftool--helper.sh        |  7 +++++++
 git-difftool.perl              | 12 ++++++++++++
 t/t7800-difftool.sh            | 43 ++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 76 insertions(+)

diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt
index 11887e6..333cf6f 100644
--- a/Documentation/git-difftool.txt
+++ b/Documentation/git-difftool.txt
@@ -91,6 +91,15 @@ instead.  `--no-symlinks` is the default on Windows.
 	the default diff tool will be read from the configured
 	`diff.guitool` variable instead of `diff.tool`.
 
+--[no-]trust-exit-code::
+	'git-difftool' invokes a diff tool individually on each file.
+	Errors reported by the diff tool are ignored by default.
+	Use `--trust-exit-code` to make 'git-difftool' exit when an
+	invoked diff tool returns a non-zero exit code.
++
+'git-difftool' will forward the exit code of the invoked tool when
+'--trust-exit-code' is used.
+
 See linkgit:git-diff[1] for the full list of supported options.
 
 CONFIG VARIABLES
@@ -116,6 +125,11 @@ See the `--tool=<tool>` option above for more details.
 difftool.prompt::
 	Prompt before each invocation of the diff tool.
 
+difftool.trustExitCode::
+	Exit difftool if the invoked diff tool returns a non-zero exit status.
++
+See the `--trust-exit-code` option above for more details.
+
 SEE ALSO
 --------
 linkgit:git-diff[1]::
diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh
index 7ef36b9..fdbd768 100755
--- a/git-difftool--helper.sh
+++ b/git-difftool--helper.sh
@@ -62,6 +62,8 @@ launch_merge_tool () {
 	else
 		run_merge_tool "$merge_tool"
 	fi
+	status=$?
+	return $status
 }
 
 if ! use_ext_cmd
@@ -85,5 +87,10 @@ else
 	do
 		launch_merge_tool "$1" "$2" "$5"
 		shift 7
+		if test "$status" != 0 &&
+			test "$GIT_DIFFTOOL_TRUST_EXIT_CODE" = true
+		then
+			exit $status
+		fi
 	done
 fi
diff --git a/git-difftool.perl b/git-difftool.perl
index 598fcc2..7df7c8a 100755
--- a/git-difftool.perl
+++ b/git-difftool.perl
@@ -342,6 +342,7 @@ sub main
 		symlinks => $^O ne 'cygwin' &&
 				$^O ne 'MSWin32' && $^O ne 'msys',
 		tool_help => undef,
+		trust_exit_code => undef,
 	);
 	GetOptions('g|gui!' => \$opts{gui},
 		'd|dir-diff' => \$opts{dirdiff},
@@ -352,6 +353,8 @@ sub main
 		'no-symlinks' => sub { $opts{symlinks} = 0; },
 		't|tool:s' => \$opts{difftool_cmd},
 		'tool-help' => \$opts{tool_help},
+		'trust-exit-code' => \$opts{trust_exit_code},
+		'no-trust-exit-code' => sub { $opts{trust_exit_code} = 0; },
 		'x|extcmd:s' => \$opts{extcmd});
 
 	if (defined($opts{help})) {
@@ -383,6 +386,15 @@ sub main
 		}
 	}
 
+	if (!defined $opts{trust_exit_code}) {
+		$opts{trust_exit_code} = Git::config_bool('difftool.trustExitCode');
+	}
+	if ($opts{trust_exit_code}) {
+		$ENV{GIT_DIFFTOOL_TRUST_EXIT_CODE} = 'true';
+	} else {
+		$ENV{GIT_DIFFTOOL_TRUST_EXIT_CODE} = 'false';
+	}
+
 	# In directory diff mode, 'git-difftool--helper' is called once
 	# to compare the a/b directories.  In file diff mode, 'git diff'
 	# will invoke a separate instance of 'git-difftool--helper' for
diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index dc30a51..b273e97 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh
@@ -76,6 +76,49 @@ test_expect_success PERL 'difftool forwards arguments to diff' '
 	rm for-diff
 '
 
+test_expect_success PERL 'difftool ignores exit code' '
+	test_config difftool.error.cmd false &&
+	git difftool -y -t error branch
+'
+
+test_expect_success PERL 'difftool forwards exit code with --trust-exit-code' '
+	test_config difftool.error.cmd false &&
+	test_must_fail git difftool -y --trust-exit-code -t error branch
+'
+
+test_expect_success PERL 'difftool honors difftool.trustExitCode = true' '
+	test_config difftool.error.cmd false &&
+	test_config difftool.trustExitCode true &&
+	test_must_fail git difftool -y -t error branch
+'
+
+test_expect_success PERL 'difftool honors difftool.trustExitCode = false' '
+	test_config difftool.error.cmd false &&
+	test_config difftool.trustExitCode false &&
+	git difftool -y -t error branch
+'
+
+test_expect_success PERL 'difftool ignores exit code with --no-trust-exit-code' '
+	test_config difftool.error.cmd false &&
+	test_config difftool.trustExitCode true &&
+	git difftool -y --no-trust-exit-code -t error branch
+'
+
+write_script .git/fail-right-file <<\EOF
+echo "$2"
+exit 1
+EOF
+
+test_expect_success PERL 'difftool stops on error with --trust-exit-code' '
+	>for-diff &&
+	git add for-diff &&
+	echo file>expect &&
+	test_must_fail git difftool -y --trust-exit-code \
+		--extcmd .git/fail-right-file branch >actual &&
+	test_cmp expect actual &&
+	rm -f for-diff .git/fail-right-file
+'
+
 test_expect_success PERL 'difftool honors --gui' '
 	difftool_test_setup &&
 	test_config merge.tool bogus-tool &&
-- 
2.1.2.556.g2136b5c

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] difftool: add support for --trust-exit-code
  2014-10-26  1:38   ` [PATCH v2] " David Aguilar
@ 2014-10-26  7:31     ` Johannes Sixt
  0 siblings, 0 replies; 4+ messages in thread
From: Johannes Sixt @ 2014-10-26  7:31 UTC (permalink / raw)
  To: David Aguilar, Junio C Hamano; +Cc: git, Adri Farr

Am 26.10.2014 um 02:38 schrieb David Aguilar:
> diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh
> index 7ef36b9..fdbd768 100755
> --- a/git-difftool--helper.sh
> +++ b/git-difftool--helper.sh
> @@ -62,6 +62,8 @@ launch_merge_tool () {
>  	else
>  		run_merge_tool "$merge_tool"
>  	fi
> +	status=$?
> +	return $status
>  }
>  
>  if ! use_ext_cmd
> @@ -85,5 +87,10 @@ else
>  	do
>  		launch_merge_tool "$1" "$2" "$5"
>  		shift 7
> +		if test "$status" != 0 &&
> +			test "$GIT_DIFFTOOL_TRUST_EXIT_CODE" = true
> +		then
> +			exit $status
> +		fi

If you insert this new code block before the 'shift 7', you can set
status here and do not have to hide it in the helper function.

>  	done
>  fi

-- Hannes

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-10-26  7:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-25 10:40 Quit git difftool on error code Adri Farr
2014-10-26  1:24 ` [PATCH] difftool: add support for --trust-exit-code David Aguilar
2014-10-26  1:38   ` [PATCH v2] " David Aguilar
2014-10-26  7:31     ` Johannes Sixt

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.