From: David Aguilar <davvid@gmail.com>
To: Jeff King <peff@peff.net>
Cc: Dun Peal <dunpealer@gmail.com>, Git ML <git@vger.kernel.org>
Subject: Re: trustExitCode doesn't apply to vimdiff mergetool
Date: Sun, 27 Nov 2016 18:15:54 -0800 [thread overview]
Message-ID: <20161128021554.GA30863@gmail.com> (raw)
In-Reply-To: <20161128014538.GA18691@gmail.com>
On Sun, Nov 27, 2016 at 05:45:38PM -0800, David Aguilar wrote:
> On Sun, Nov 27, 2016 at 11:55:59AM -0500, Jeff King wrote:
> > On Sun, Nov 27, 2016 at 08:46:40AM -0500, Dun Peal wrote:
> >
> > > Ignoring a non-zero exit code from the merge tool, and assuming a
> > > successful merge in that case, seems like the wrong default behavior
> > > to me.
> >
> > Yeah, I'm inclined to agree. But like I said, I'm not too familiar with
> > this area, so maybe there are subtle things I'm missing.
>
> I think this may have been an oversight in how the
> trust-exit-code feature is implemented across builtins.
>
> Right now, specific builtin tools could in theory opt-in to the
> feature, but I think it should be handled in a central place.
> For vimdiff, the exit code is not considered because the
> scriptlet calls check_unchanged(), which only cares about
> modifciation time.
>
> I have a patch that makes it so that none of the tools do the
> check_unchanged logic themselves and instead rely on the
> library code to handle it for them. This makes the
> implementation uniform across all tools, and allows tools to
> opt-in to trustExitCode=true.
>
> This means that all of the builtin tools will default to
> trustExitCode=false, and they can opt-in by setting the
> configuration variable.
>
> For tkdiff and kdiff3, this is a subtle change in behavior, but
> not one that should be problematic, and the upside is that we'll
> have consistency across all tools.
>
> In this scenario specifically, what happens is that the
> scriptlet is calling check_unchanged(), which checks the
> modification time of the file, and if the file is new then it
> assumes that the merge succeeded. check_unchanged() is clearing
> the exit code.
>
> Try the patch below. I tested it with vimdiff and it seems to
> provide the desired behavior:
> - the modificaiton time behavior is the default
> - setting mergetool.vimdiff.trustExitCode = true will make it
> honor vim's exit code via :cq
>
> One possible idea that could avoid the subtle tkdiff/kdiff3
> change in behavior would be to allow the scriptlets to advertise
> their preference for the default trustExitCode setting. These
> tools could say, "default to true", and the rest can assume
> false.
>
> If others feel that this is worth the extra machinery, and the
> mental burden of tools having different defaults, then that
> could be implemented as a follow-up patch. IMO I'd be okay with
> not needing it and only adding it if someone notices, but if
> others feel otherwise we can do it sooner rather than later.
>
> Thoughts?
For the curious, here is what that patch might look like.
This allows scriptlets to redefine trust_exit_code() so that
they can advertise that they prefer default=true.
The main benefit of this is that we're preserving the original
behavior before these patches. I'll let this sit out here for
comments for a few days to see what others think.
--- >8 ---
Date: Sun, 27 Nov 2016 18:08:08 -0800
Subject: [PATCH] mergetool: restore trustExitCode behavior for builtins tools
deltawalker, diffmerge, emerge, kdiff3, kompare, and tkdiff originally
provided behavior that matched trustExitCode=true.
The default for all tools is trustExitCode=false, which conflicts with
these tools' defaults. Allow tools to advertise their own default value
for trustExitCode so that users do not need to opt-in to the original
behavior.
While this makes the default inconsistent between tools, it can still be
overridden, and it makes it consistent with the current Git behavior.
Signed-off-by: David Aguilar <davvid@gmail.com>
---
git-mergetool--lib.sh | 15 +++++++++++++--
mergetools/deltawalker | 6 ++++++
mergetools/diffmerge | 6 ++++++
mergetools/emerge | 6 ++++++
mergetools/kdiff3 | 6 ++++++
mergetools/kompare | 6 ++++++
mergetools/tkdiff | 6 ++++++
7 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
index 3d8a873ab..be079723a 100644
--- a/git-mergetool--lib.sh
+++ b/git-mergetool--lib.sh
@@ -120,6 +120,12 @@ setup_user_tool () {
merge_tool_cmd=$(get_merge_tool_cmd "$tool")
test -n "$merge_tool_cmd" || return 1
+ trust_exit_code () {
+ # user-defined tools default to trustExitCode = false
+ git config --bool "mergetool.$1.trustExitCode" ||
+ echo false
+ }
+
diff_cmd () {
( eval $merge_tool_cmd )
}
@@ -153,6 +159,12 @@ setup_tool () {
echo "$1"
}
+ trust_exit_code () {
+ # built-in tools default to trustExitCode = false
+ git config --bool "mergetool.$1.trustExitCode" ||
+ echo false
+ }
+
if ! test -f "$MERGE_TOOLS_DIR/$tool"
then
setup_user_tool
@@ -221,8 +233,7 @@ run_merge_cmd () {
merge_cmd "$1"
status=$?
- trust_exit_code=$(git config --bool \
- "mergetool.$1.trustExitCode" || echo false)
+ trust_exit_code=$(trust_exit_code "$1")
if test "$trust_exit_code" = "false"
then
check_unchanged
diff --git a/mergetools/deltawalker b/mergetools/deltawalker
index b3c71b623..ad978f83d 100644
--- a/mergetools/deltawalker
+++ b/mergetools/deltawalker
@@ -19,3 +19,9 @@ merge_cmd () {
translate_merge_tool_path() {
echo DeltaWalker
}
+
+trust_exit_code () {
+ # Default to trustExitCode = true
+ git config --bool "mergetool.$1.trustExitCode" ||
+ echo true
+}
diff --git a/mergetools/diffmerge b/mergetools/diffmerge
index f138cb4e7..437b34996 100644
--- a/mergetools/diffmerge
+++ b/mergetools/diffmerge
@@ -12,3 +12,9 @@ merge_cmd () {
--result="$MERGED" "$LOCAL" "$REMOTE"
fi
}
+
+trust_exit_code () {
+ # Default to trustExitCode = true
+ git config --bool "mergetool.$1.trustExitCode" ||
+ echo true
+}
diff --git a/mergetools/emerge b/mergetools/emerge
index 7b895fdb1..8c950d678 100644
--- a/mergetools/emerge
+++ b/mergetools/emerge
@@ -20,3 +20,9 @@ merge_cmd () {
translate_merge_tool_path() {
echo emacs
}
+
+trust_exit_code () {
+ # Default to trustExitCode = true
+ git config --bool "mergetool.$1.trustExitCode" ||
+ echo true
+}
diff --git a/mergetools/kdiff3 b/mergetools/kdiff3
index 793d1293b..9d94876b9 100644
--- a/mergetools/kdiff3
+++ b/mergetools/kdiff3
@@ -21,3 +21,9 @@ merge_cmd () {
>/dev/null 2>&1
fi
}
+
+trust_exit_code () {
+ # Default to trustExitCode = true
+ git config --bool "mergetool.$1.trustExitCode" ||
+ echo true
+}
diff --git a/mergetools/kompare b/mergetools/kompare
index 433686c12..0ae0bdc02 100644
--- a/mergetools/kompare
+++ b/mergetools/kompare
@@ -5,3 +5,9 @@ can_merge () {
diff_cmd () {
"$merge_tool_path" "$LOCAL" "$REMOTE"
}
+
+trust_exit_code () {
+ # Default to trustExitCode = true
+ git config --bool "mergetool.$1.trustExitCode" ||
+ echo true
+}
diff --git a/mergetools/tkdiff b/mergetools/tkdiff
index 618c438e8..d73792a21 100644
--- a/mergetools/tkdiff
+++ b/mergetools/tkdiff
@@ -10,3 +10,9 @@ merge_cmd () {
"$merge_tool_path" -o "$MERGED" "$LOCAL" "$REMOTE"
fi
}
+
+trust_exit_code () {
+ # Default to trustExitCode = true
+ git config --bool "mergetool.$1.trustExitCode" ||
+ echo true
+}
--
2.11.0.rc3.1.g2633b1d.dirty
next prev parent reply other threads:[~2016-11-28 2:16 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-27 2:44 trustExitCode doesn't apply to vimdiff mergetool Dun Peal
2016-11-27 5:08 ` Jeff King
2016-11-27 13:46 ` Dun Peal
2016-11-27 16:55 ` Jeff King
2016-11-28 1:45 ` David Aguilar
2016-11-28 2:01 ` Jeff King
2016-11-28 2:15 ` David Aguilar [this message]
2016-11-28 17:17 ` Junio C Hamano
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161128021554.GA30863@gmail.com \
--to=davvid@gmail.com \
--cc=dunpealer@gmail.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
/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.
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.