Skip to content

Commit

Permalink
commit: Fix stripping of patch in verbose mode.
Browse files Browse the repository at this point in the history
When the "-v" option is given, we put diff of what is to be committed into
the commit template, and then strip it back out again after the user has
edited it.

We used to look for the diff by searching for the "diff --git a/"
header. With diff.mnemonicprefix set in the configuration, however, this
pattern does not match.  The pattern is loosened to cover this case.

Also, if the user puts their own diff in the message (e.g., as a sample
output), then we will accidentally trigger the pattern, removing part of
their output.

We can avoid doing this stripping altogether if the user didn't use "-v"
in the first place, so we know that any match we find will be a false
positive.

[jc: this fix was split out of a series originally meant for master.]

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Nov 12, 2008
1 parent 9db56f7 commit 0b38227
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 3 deletions.
8 changes: 5 additions & 3 deletions builtin-commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -1004,9 +1004,11 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
}

/* Truncate the message just before the diff, if any. */
p = strstr(sb.buf, "\ndiff --git a/");
if (p != NULL)
strbuf_setlen(&sb, p - sb.buf + 1);
if (verbose) {
p = strstr(sb.buf, "\ndiff --git ");
if (p != NULL)
strbuf_setlen(&sb, p - sb.buf + 1);
}

if (cleanup_mode != CLEANUP_NONE)
stripspace(&sb, cleanup_mode == CLEANUP_ALL);
Expand Down
73 changes: 73 additions & 0 deletions t/t7507-commit-verbose.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#!/bin/sh

test_description='verbose commit template'
. ./test-lib.sh

cat >check-for-diff <<EOF
#!$SHELL_PATH
exec grep '^diff --git' "\$1"
EOF
chmod +x check-for-diff
test_set_editor "$PWD/check-for-diff"

cat >message <<'EOF'
subject
body
EOF

test_expect_success 'setup' '
echo content >file &&
git add file &&
git commit -F message
'

test_expect_failure 'initial commit shows verbose diff' '
git commit --amend -v
'

test_expect_success 'second commit' '
echo content modified >file &&
git add file &&
git commit -F message
'

check_message() {
git log -1 --pretty=format:%s%n%n%b >actual &&
test_cmp "$1" actual
}

test_expect_success 'verbose diff is stripped out' '
git commit --amend -v &&
check_message message
'

test_expect_success 'verbose diff is stripped out (mnemonicprefix)' '
git config diff.mnemonicprefix true &&
git commit --amend -v &&
check_message message
'

cat >diff <<'EOF'
This is an example commit message that contains a diff.
diff --git c/file i/file
new file mode 100644
index 0000000..f95c11d
--- /dev/null
+++ i/file
@@ -0,0 +1 @@
+this is some content
EOF

test_expect_success 'diff in message is retained without -v' '
git commit --amend -F diff &&
check_message diff
'

test_expect_failure 'diff in message is retained with -v' '
git commit --amend -F diff -v &&
check_message diff
'

test_done

0 comments on commit 0b38227

Please sign in to comment.