From: Aleen <aleen42@xxxxxxxxxx> Signed-off-by: Aleen <aleen42@xxxxxxxxxx> --- Documentation/git-am.txt | 5 +++++ builtin/am.c | 18 ++++++++++++++++-- t/t4150-am.sh | 25 +++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt index 0a4a984dfde..de5d11e404c 100644 --- a/Documentation/git-am.txt +++ b/Documentation/git-am.txt @@ -16,6 +16,7 @@ SYNOPSIS [--exclude=<path>] [--include=<path>] [--reject] [-q | --quiet] [--[no-]scissors] [-S[<keyid>]] [--patch-format=<format>] [--quoted-cr=<action>] + [--always] [(<mbox> | <Maildir>)...] 'git am' (--continue | --skip | --abort | --quit | --show-current-patch[=(diff|raw)]) @@ -159,6 +160,10 @@ default. You can use `--no-utf8` to override this. countermand both `commit.gpgSign` configuration variable, and earlier `--gpg-sign`. +--always:: + Apply patches of commits with detailed commit messages, + even if they emit no changes. (see linkgit:git-format-patch[1]) + --continue:: -r:: --resolved:: diff --git a/builtin/am.c b/builtin/am.c index 8677ea2348a..d11efc16f92 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -124,6 +124,8 @@ struct am_state { int ignore_date; int allow_rerere_autoupdate; const char *sign_commit; + int always; + int empty_commit; int rebasing; }; @@ -1249,8 +1251,12 @@ static int parse_mail(struct am_state *state, const char *mail) } if (is_empty_or_missing_file(am_path(state, "patch"))) { - printf_ln(_("Patch is empty.")); - die_user_resolve(state); + if (state->always) { + state->empty_commit = 1; + } else { + printf_ln(_("Patch is empty.")); + die_user_resolve(state); + } } strbuf_addstr(&msg, "\n\n"); @@ -1792,6 +1798,9 @@ static void am_run(struct am_state *state, int resume) if (state->interactive && do_interactive(state)) goto next; + if (state->empty_commit) + goto commit; + if (run_applypatch_msg_hook(state)) exit(1); @@ -1827,6 +1836,7 @@ static void am_run(struct am_state *state, int resume) die_user_resolve(state); } +commit: do_commit(state); next: @@ -2357,6 +2367,10 @@ int cmd_am(int argc, const char **argv, const char *prefix) { OPTION_STRING, 'S', "gpg-sign", &state.sign_commit, N_("key-id"), N_("GPG-sign commits"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, + OPT_BOOL(0, "always", &state.always, + N_("always apply patch event if the patch is empty")), + OPT_HIDDEN_BOOL(0, "empty-commit", &state.empty_commit, + N_("(internal use for skipping git-apply to empty commits)")), OPT_HIDDEN_BOOL(0, "rebasing", &state.rebasing, N_("(internal use for git-rebase)")), OPT_END() diff --git a/t/t4150-am.sh b/t/t4150-am.sh index 2aaaa0d7ded..5b3617857a8 100755 --- a/t/t4150-am.sh +++ b/t/t4150-am.sh @@ -196,6 +196,12 @@ test_expect_success setup ' git format-patch -M --stdout lorem^ >rename-add.patch && + git checkout -b empty-commit && + git commit -m "empty commit" --allow-empty && + + git format-patch --stdout empty-commit^ >empty.patch && + git format-patch --always --stdout empty-commit^ >empty-commit.patch && + # reset time sane_unset test_tick && test_tick @@ -1152,4 +1158,23 @@ test_expect_success 'apply binary blob in partial clone' ' git -C client am ../patch ' +test_expect_success 'am a real empty patch with the --always option' ' + rm -fr .git/rebase-apply && + git reset --hard && + test_must_fail git am --always empty.patch 2>actual && + echo Patch format detection failed. >expected && + test_cmp expected actual +' + +test_expect_success 'am a patch with empty commits' ' + grep "empty commit" empty-commit.patch && + rm -fr .git/rebase-apply && + git reset --hard && + git checkout empty-commit^ && + git am --always empty-commit.patch && + test_path_is_missing .git/rebase-apply && + git cat-file commit HEAD >actual && + test_i18ngrep "empty commit" actual +' + test_done -- gitgitgadget