merge: --no-verify to bypass pre-merge-commit hook

Analogous to commit, introduce a '--no-verify' option which bypasses the
pre-merge-commit hook. The shorthand '-n' is taken by '--no-stat'
already.

[js: * reworded commit message to reflect current state of --no-stat flag
       and new hook name
     * fixed flag documentation to reflect new hook name
     * cleaned up trailing whitespace
     * squashed test changes from the original series' patch 4/4
     * modified tests to follow pattern from this series' patch 1/4
     * added a test case for --no-verify with non-executable hook
     * when testing that the merge hook did not run, make sure we
       actually have a merge to perform (by resetting the "side" branch
       to its original state).

]

Improved-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Michael J Gruber <git@grubix.eu>
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Josh Steadmon <steadmon@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Michael J Gruber 2019-08-07 11:57:08 -07:00 committed by Junio C Hamano
parent 6098817fd7
commit bc40ce4de6
3 changed files with 43 additions and 3 deletions

View file

@ -106,7 +106,8 @@ the use of non-ASCII filenames.
pre-merge-commit pre-merge-commit
~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
This hook is invoked by linkgit:git-merge[1]. It takes no parameters, and is This hook is invoked by linkgit:git-merge[1], and can be bypassed
with the `--no-verify` option. It takes no parameters, and is
invoked after the merge has been carried out successfully and before invoked after the merge has been carried out successfully and before
obtaining the proposed commit log message to obtaining the proposed commit log message to
make a commit. Exiting with a non-zero status from this script make a commit. Exiting with a non-zero status from this script

View file

@ -287,7 +287,7 @@ static struct option builtin_merge_options[] = {
N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
OPT_BOOL(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")), OPT_BOOL(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")),
OPT_BOOL(0, "signoff", &signoff, N_("add Signed-off-by:")), OPT_BOOL(0, "signoff", &signoff, N_("add Signed-off-by:")),
OPT_BOOL(0, "no-verify", &no_verify, N_("bypass commit-msg hook")), OPT_BOOL(0, "no-verify", &no_verify, N_("bypass pre-merge-commit and commit-msg hooks")),
OPT_END() OPT_END()
}; };
@ -818,7 +818,7 @@ static void prepare_to_commit(struct commit_list *remoteheads)
struct strbuf msg = STRBUF_INIT; struct strbuf msg = STRBUF_INIT;
const char *index_file = get_index_file(); const char *index_file = get_index_file();
if (run_commit_hook(0 < option_edit, index_file, "pre-merge-commit", NULL)) if (!no_verify && run_commit_hook(0 < option_edit, index_file, "pre-merge-commit", NULL))
abort_commit(remoteheads, NULL); abort_commit(remoteheads, NULL);
/* /*
* Re-read the index as pre-merge-commit hook could have updated it, * Re-read the index as pre-merge-commit hook could have updated it,

View file

@ -84,6 +84,15 @@ test_expect_success '--no-verify with no hook' '
test_path_is_missing actual_hooks test_path_is_missing actual_hooks
' '
test_expect_success '--no-verify with no hook (merge)' '
test_when_finished "rm -f actual_hooks" &&
git branch -f side side-orig &&
git checkout side &&
git merge --no-verify -m "merge master" master &&
git checkout master &&
test_path_is_missing actual_hooks
'
test_expect_success 'with succeeding hook' ' test_expect_success 'with succeeding hook' '
test_when_finished "rm -f \"$PRECOMMIT\" expected_hooks actual_hooks" && test_when_finished "rm -f \"$PRECOMMIT\" expected_hooks actual_hooks" &&
cp "$HOOKDIR/success.sample" "$PRECOMMIT" && cp "$HOOKDIR/success.sample" "$PRECOMMIT" &&
@ -131,6 +140,16 @@ test_expect_success '--no-verify with succeeding hook' '
test_path_is_missing actual_hooks test_path_is_missing actual_hooks
' '
test_expect_success '--no-verify with succeeding hook (merge)' '
test_when_finished "rm -f \"$PREMERGE\" actual_hooks" &&
cp "$HOOKDIR/success.sample" "$PREMERGE" &&
git branch -f side side-orig &&
git checkout side &&
git merge --no-verify -m "merge master" master &&
git checkout master &&
test_path_is_missing actual_hooks
'
test_expect_success 'with failing hook' ' test_expect_success 'with failing hook' '
test_when_finished "rm -f \"$PRECOMMIT\" expected_hooks actual_hooks" && test_when_finished "rm -f \"$PRECOMMIT\" expected_hooks actual_hooks" &&
cp "$HOOKDIR/fail.sample" "$PRECOMMIT" && cp "$HOOKDIR/fail.sample" "$PRECOMMIT" &&
@ -160,6 +179,16 @@ test_expect_success 'with failing hook (merge)' '
test_cmp expected_hooks actual_hooks test_cmp expected_hooks actual_hooks
' '
test_expect_success '--no-verify with failing hook (merge)' '
test_when_finished "rm -f \"$PREMERGE\" actual_hooks" &&
cp "$HOOKDIR/fail.sample" "$PREMERGE" &&
git branch -f side side-orig &&
git checkout side &&
git merge --no-verify -m "merge master" master &&
git checkout master &&
test_path_is_missing actual_hooks
'
test_expect_success POSIXPERM 'with non-executable hook' ' test_expect_success POSIXPERM 'with non-executable hook' '
test_when_finished "rm -f \"$PRECOMMIT\" actual_hooks" && test_when_finished "rm -f \"$PRECOMMIT\" actual_hooks" &&
cp "$HOOKDIR/non-exec.sample" "$PRECOMMIT" && cp "$HOOKDIR/non-exec.sample" "$PRECOMMIT" &&
@ -188,6 +217,16 @@ test_expect_success POSIXPERM 'with non-executable hook (merge)' '
test_path_is_missing actual_hooks test_path_is_missing actual_hooks
' '
test_expect_success POSIXPERM '--no-verify with non-executable hook (merge)' '
test_when_finished "rm -f \"$PREMERGE\" actual_hooks" &&
cp "$HOOKDIR/non-exec.sample" "$PREMERGE" &&
git branch -f side side-orig &&
git checkout side &&
git merge --no-verify -m "merge master" master &&
git checkout master &&
test_path_is_missing actual_hooks
'
test_expect_success 'with hook requiring GIT_PREFIX' ' test_expect_success 'with hook requiring GIT_PREFIX' '
test_when_finished "rm -rf \"$PRECOMMIT\" expected_hooks actual_hooks success" && test_when_finished "rm -rf \"$PRECOMMIT\" expected_hooks actual_hooks success" &&
cp "$HOOKDIR/require-prefix.sample" "$PRECOMMIT" && cp "$HOOKDIR/require-prefix.sample" "$PRECOMMIT" &&