Skip to content

Commit

Permalink
Merge branch 'jl/commit-v-strip-marker'
Browse files Browse the repository at this point in the history
"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
  • Loading branch information
Junio C Hamano committed Dec 17, 2013
2 parents 433a30d + 1a72cfd commit 14a9c5f
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 9 deletions.
9 changes: 3 additions & 6 deletions builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
28 changes: 27 additions & 1 deletion t/t7507-commit-verbose.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
29 changes: 27 additions & 2 deletions wt-status.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -793,6 +796,18 @@ static void wt_status_print_other(struct wt_status *s,
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;
Expand All @@ -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);
}

Expand Down
1 change: 1 addition & 0 deletions wt-status.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 14a9c5f

Please sign in to comment.