summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2013-12-17 19:47:18 (GMT)
committerJunio C Hamano <gitster@pobox.com>2013-12-17 19:47:18 (GMT)
commit14a9c5f261bcc436b80700076257f02af0beec68 (patch)
tree43f071ef531aaecba55cf73753711f89565aeb05
parent433a30d0ba6e6d258be099859fa98d0205b25634 (diff)
parent1a72cfd7fa88e5a6c2b94568ac2fe69dfbd87f87 (diff)
downloadgit-14a9c5f261bcc436b80700076257f02af0beec68.zip
git-14a9c5f261bcc436b80700076257f02af0beec68.tar.gz
git-14a9c5f261bcc436b80700076257f02af0beec68.tar.bz2
Merge branch 'jl/commit-v-strip-marker'
"git commit -v" appends the patch to the log message before editing, and then removes the patch when the editor returned control. However, the patch was not stripped correctly when the first modified path was a submodule. * jl/commit-v-strip-marker: commit -v: strip diffs and submodule shortlogs from the commit message
-rw-r--r--builtin/commit.c9
-rwxr-xr-xt/t7507-commit-verbose.sh28
-rw-r--r--wt-status.c29
-rw-r--r--wt-status.h1
4 files changed, 58 insertions, 9 deletions
diff --git a/builtin/commit.c b/builtin/commit.c
index e89c519..f4ff75d 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -1505,7 +1505,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
struct strbuf sb = STRBUF_INIT;
struct strbuf author_ident = STRBUF_INIT;
const char *index_file, *reflog_msg;
- char *nl, *p;
+ char *nl;
unsigned char sha1[20];
struct ref_lock *ref_lock;
struct commit_list *parents = NULL, **pptr = &parents;
@@ -1601,11 +1601,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
}
/* Truncate the message just before the diff, if any. */
- if (verbose) {
- p = strstr(sb.buf, "\ndiff --git ");
- if (p != NULL)
- strbuf_setlen(&sb, p - sb.buf + 1);
- }
+ if (verbose)
+ wt_status_truncate_message_at_cut_line(&sb);
if (cleanup_mode != CLEANUP_NONE)
stripspace(&sb, cleanup_mode == CLEANUP_ALL);
diff --git a/t/t7507-commit-verbose.sh b/t/t7507-commit-verbose.sh
index da5bd3b..2ddf28c 100755
--- a/t/t7507-commit-verbose.sh
+++ b/t/t7507-commit-verbose.sh
@@ -65,9 +65,35 @@ test_expect_success 'diff in message is retained without -v' '
check_message diff
'
-test_expect_failure 'diff in message is retained with -v' '
+test_expect_success 'diff in message is retained with -v' '
git commit --amend -F diff -v &&
check_message diff
'
+test_expect_success 'submodule log is stripped out too with -v' '
+ git config diff.submodule log &&
+ git submodule add ./. sub &&
+ git commit -m "sub added" &&
+ (
+ cd sub &&
+ echo "more" >>file &&
+ git commit -a -m "submodule commit"
+ ) &&
+ (
+ GIT_EDITOR=cat &&
+ export GIT_EDITOR &&
+ test_must_fail git commit -a -v 2>err
+ ) &&
+ test_i18ngrep "Aborting commit due to empty commit message." err
+'
+
+test_expect_success 'verbose diff is stripped out with set core.commentChar' '
+ (
+ GIT_EDITOR=cat &&
+ export GIT_EDITOR &&
+ test_must_fail git -c core.commentchar=";" commit -a -v 2>err
+ ) &&
+ test_i18ngrep "Aborting commit due to empty commit message." err
+'
+
test_done
diff --git a/wt-status.c b/wt-status.c
index 4625cdb..cd7d706 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -17,6 +17,9 @@
#include "strbuf.h"
#include "utf8.h"
+static char cut_line[] =
+"------------------------ >8 ------------------------\n";
+
static char default_wt_status_colors[][COLOR_MAXLEN] = {
GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */
GIT_COLOR_GREEN, /* WT_STATUS_UPDATED */
@@ -793,6 +796,18 @@ conclude:
status_printf_ln(s, GIT_COLOR_NORMAL, "");
}
+void wt_status_truncate_message_at_cut_line(struct strbuf *buf)
+{
+ const char *p;
+ struct strbuf pattern = STRBUF_INIT;
+
+ strbuf_addf(&pattern, "%c %s", comment_line_char, cut_line);
+ p = strstr(buf->buf, pattern.buf);
+ if (p && (p == buf->buf || p[-1] == '\n'))
+ strbuf_setlen(buf, p - buf->buf);
+ strbuf_release(&pattern);
+}
+
static void wt_status_print_verbose(struct wt_status *s)
{
struct rev_info rev;
@@ -813,10 +828,20 @@ static void wt_status_print_verbose(struct wt_status *s)
* If we're not going to stdout, then we definitely don't
* want color, since we are going to the commit message
* file (and even the "auto" setting won't work, since it
- * will have checked isatty on stdout).
+ * will have checked isatty on stdout). But we then do want
+ * to insert the scissor line here to reliably remove the
+ * diff before committing.
*/
- if (s->fp != stdout)
+ if (s->fp != stdout) {
+ const char *explanation = _("Do not touch the line above.\nEverything below will be removed.");
+ struct strbuf buf = STRBUF_INIT;
+
rev.diffopt.use_color = 0;
+ fprintf(s->fp, "%c %s", comment_line_char, cut_line);
+ strbuf_add_commented_lines(&buf, explanation, strlen(explanation));
+ fputs(buf.buf, s->fp);
+ strbuf_release(&buf);
+ }
run_diff_index(&rev, 1);
}
diff --git a/wt-status.h b/wt-status.h
index 6c29e6f..30a4812 100644
--- a/wt-status.h
+++ b/wt-status.h
@@ -91,6 +91,7 @@ struct wt_status_state {
unsigned char cherry_pick_head_sha1[20];
};
+void wt_status_truncate_message_at_cut_line(struct strbuf *);
void wt_status_prepare(struct wt_status *s);
void wt_status_print(struct wt_status *s);
void wt_status_collect(struct wt_status *s);