]> git.ipfire.org Git - thirdparty/git.git/commitdiff
am: allow passing --no-verify flag
authorThierry Reding <treding@nvidia.com>
Wed, 30 Nov 2022 17:28:33 +0000 (18:28 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Jan 2023 05:52:25 +0000 (14:52 +0900)
The git-am --no-verify flag is analogous to the same flag passed to
git-commit. It bypasses the pre-applypatch and applypatch-msg hooks
if they are enabled.

Signed-off-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-am.txt
builtin/am.c
t/t4150-am.sh

index 326276e51ce5734675f842771d41290057c53f90..0c1dfb3c98b440f87e561a0d44c240a41d80dc14 100644 (file)
@@ -9,7 +9,7 @@ git-am - Apply a series of patches from a mailbox
 SYNOPSIS
 --------
 [verse]
-'git am' [--signoff] [--keep] [--[no-]keep-cr] [--[no-]utf8]
+'git am' [--signoff] [--keep] [--[no-]keep-cr] [--[no-]utf8] [--no-verify]
         [--[no-]3way] [--interactive] [--committer-date-is-author-date]
         [--ignore-date] [--ignore-space-change | --ignore-whitespace]
         [--whitespace=<option>] [-C<n>] [-p<n>] [--directory=<dir>]
@@ -138,6 +138,12 @@ include::rerere-options.txt[]
 --interactive::
        Run interactively.
 
+-n::
+--no-verify::
+       By default, the pre-applypatch and applypatch-msg hooks are run.
+       When any of `--no-verify` or `-n` is given, these are bypassed.
+       See also linkgit:githooks[5].
+
 --committer-date-is-author-date::
        By default the command records the date from the e-mail
        message as the commit author date, and uses the time of
index 20aea0d2487b2dfe851d44f753e7de7439698223..26ad8a468dc4e3523bc1b1202bf7b8b1e4bea660 100644 (file)
@@ -117,6 +117,7 @@ struct am_state {
 
        /* various operating modes and command line options */
        int interactive;
+       int no_verify;
        int threeway;
        int quiet;
        int signoff; /* enum signoff_type */
@@ -472,10 +473,12 @@ static void am_destroy(const struct am_state *state)
  */
 static int run_applypatch_msg_hook(struct am_state *state)
 {
-       int ret;
+       int ret = 0;
 
        assert(state->msg);
-       ret = run_hooks_l("applypatch-msg", am_path(state, "final-commit"), NULL);
+
+       if (!state->no_verify)
+               ret = run_hooks_l("applypatch-msg", am_path(state, "final-commit"), NULL);
 
        if (!ret) {
                FREE_AND_NULL(state->msg);
@@ -1640,7 +1643,7 @@ static void do_commit(const struct am_state *state)
        const char *reflog_msg, *author, *committer = NULL;
        struct strbuf sb = STRBUF_INIT;
 
-       if (run_hooks("pre-applypatch"))
+       if (!state->no_verify && run_hooks("pre-applypatch"))
                exit(1);
 
        if (write_cache_as_tree(&tree, 0, NULL))
@@ -2329,6 +2332,8 @@ int cmd_am(int argc, const char **argv, const char *prefix)
        struct option options[] = {
                OPT_BOOL('i', "interactive", &state.interactive,
                        N_("run interactively")),
+               OPT_BOOL('n', "no-verify", &state.no_verify,
+                       N_("bypass pre-applypatch and applypatch-msg hooks")),
                OPT_HIDDEN_BOOL('b', "binary", &binary,
                        N_("historical option -- no-op")),
                OPT_BOOL('3', "3way", &state.threeway,
index cdad4b688078adc24da922bce14e130982f4484e..50b257e43fadb1f456d83d3d42a1ad91074188d2 100755 (executable)
@@ -345,6 +345,21 @@ test_expect_success 'am with failing applypatch-msg hook' '
        test_cmp_rev first HEAD
 '
 
+test_expect_success 'am with failing applypatch-msg hook (no verify)' '
+       rm -fr .git/rebase-apply &&
+       git reset --hard &&
+       git checkout first &&
+       test_hook applypatch-msg <<-\EOF &&
+       echo hook-message >"$1"
+       exit 1
+       EOF
+       git am --no-verify patch1 &&
+       test_path_is_missing .git/rebase-apply &&
+       git diff --exit-code second &&
+       git log -1 --format=format:%B >actual &&
+       test_cmp msg actual
+'
+
 test_expect_success 'am with pre-applypatch hook' '
        rm -fr .git/rebase-apply &&
        git reset --hard &&
@@ -374,6 +389,23 @@ test_expect_success 'am with failing pre-applypatch hook' '
        test_cmp_rev first HEAD
 '
 
+test_expect_success 'am with failing pre-applypatch hook (no verify)' '
+       rm -fr .git/rebase-apply &&
+       git reset --hard &&
+       git checkout first &&
+       touch empty-file &&
+       test_hook pre-applypatch <<-\EOF &&
+       rm empty-file
+       exit 1
+       EOF
+       git am --no-verify patch1 &&
+       test_path_is_missing .git/rebase-apply &&
+       test_path_is_file empty-file &&
+       git diff --exit-code second &&
+       git log -1 --format=format:%B >actual &&
+       test_cmp msg actual
+'
+
 test_expect_success 'am with post-applypatch hook' '
        rm -fr .git/rebase-apply &&
        git reset --hard &&