Skip to content

Commit

Permalink
commit: add --cleanup=scissors
Browse files Browse the repository at this point in the history
Since 1a72cfd (commit -v: strip diffs and submodule shortlogs from the
commit message - 2013-12-05) we have a less fragile way to cut out
"git status" at the end of a commit message but it's only enabled for
stripping submodule shortlogs.

Add new cleanup option that reuses the same mechanism for the entire
"git status" without accidentally removing lines starting with '#'.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Nguyễn Thái Ngọc Duy authored and Junio C Hamano committed Feb 25, 2014
1 parent fcef931 commit 75df1f4
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 4 deletions.
8 changes: 7 additions & 1 deletion Documentation/git-commit.txt
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ OPTIONS
--cleanup=<mode>::
This option determines how the supplied commit message should be
cleaned up before committing. The '<mode>' can be `strip`,
`whitespace`, `verbatim`, or `default`.
`whitespace`, `verbatim`, `scissors` or `default`.
+
--
strip::
Expand All @@ -186,6 +186,12 @@ whitespace::
Same as `strip` except #commentary is not removed.
verbatim::
Do not change the message at all.
scissors::
Same as `whitespace`, except that everything from (and
including) the line
"`# ------------------------ >8 ------------------------`"
is truncated if the message is to be edited. "`#`" can be
customized with core.commentChar.
default::
Same as `strip` if the message is to be edited.
Otherwise `whitespace`.
Expand Down
14 changes: 11 additions & 3 deletions builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ static char *sign_commit;
static enum {
CLEANUP_SPACE,
CLEANUP_NONE,
CLEANUP_SCISSORS,
CLEANUP_ALL
} cleanup_mode;
static const char *cleanup_arg;
Expand Down Expand Up @@ -754,7 +755,9 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
if (use_editor && include_status) {
char *ai_tmp, *ci_tmp;
if (whence != FROM_COMMIT)
if (whence != FROM_COMMIT) {
if (cleanup_mode == CLEANUP_SCISSORS)
wt_status_add_cut_line(s->fp);
status_printf_ln(s, GIT_COLOR_NORMAL,
whence == FROM_MERGE
? _("\n"
Expand All @@ -770,13 +773,16 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
git_path(whence == FROM_MERGE
? "MERGE_HEAD"
: "CHERRY_PICK_HEAD"));
}

fprintf(s->fp, "\n");
if (cleanup_mode == CLEANUP_ALL)
status_printf(s, GIT_COLOR_NORMAL,
_("Please enter the commit message for your changes."
" Lines starting\nwith '%c' will be ignored, and an empty"
" message aborts the commit.\n"), comment_line_char);
else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
wt_status_add_cut_line(s->fp);
else /* CLEANUP_SPACE, that is. */
status_printf(s, GIT_COLOR_NORMAL,
_("Please enter the commit message for your changes."
Expand Down Expand Up @@ -1132,6 +1138,8 @@ static int parse_and_validate_options(int argc, const char *argv[],
cleanup_mode = CLEANUP_SPACE;
else if (!strcmp(cleanup_arg, "strip"))
cleanup_mode = CLEANUP_ALL;
else if (!strcmp(cleanup_arg, "scissors"))
cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
else
die(_("Invalid cleanup mode %s"), cleanup_arg);

Expand Down Expand Up @@ -1600,8 +1608,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
die(_("could not read commit message: %s"), strerror(saved_errno));
}

/* Truncate the message just before the diff, if any. */
if (verbose)
if (verbose || /* Truncate the message just before the diff, if any. */
cleanup_mode == CLEANUP_SCISSORS)
wt_status_truncate_message_at_cut_line(&sb);

if (cleanup_mode != CLEANUP_NONE)
Expand Down
16 changes: 16 additions & 0 deletions t/t7502-commit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,22 @@ test_expect_success 'cleanup commit messages (whitespace option,-F)' '
'

test_expect_success 'cleanup commit messages (scissors option,-F,-e)' '
echo >>negative &&
cat >text <<EOF &&
# to be kept
# ------------------------ >8 ------------------------
to be removed
EOF
echo "# to be kept" >expect &&
git commit --cleanup=scissors -e -F text -a &&
git cat-file -p HEAD |sed -e "1,/^\$/d">actual &&
test_cmp expect actual
'

test_expect_success 'cleanup commit messages (strip option,-F)' '
echo >>negative &&
Expand Down

0 comments on commit 75df1f4

Please sign in to comment.