rebase -i: fix rewording with --committer-date-is-author-date

baf8ec8d3a (rebase -r: don't write .git/MERGE_MSG when
fast-forwarding, 2021-08-20) stopped reading the author script in
run_git_commit() when rewording a commit. This is normally safe
because "git commit --amend" preserves the authorship. However if the
user passes "--committer-date-is-author-date" then we need to read the
author date from the author script when rewording. Fix this regression
by tightening the check for when it is safe to skip reading the author
script.

Reported-by: Jonas Kittner <jonas.kittner@ruhr-uni-bochum.de>
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Phillip Wood 2021-11-02 21:30:51 +00:00 коммит произвёл Junio C Hamano
Родитель f2563c9ef3
Коммит 9d6b9df128
2 изменённых файлов: 32 добавлений и 1 удалений

Просмотреть файл

@ -983,7 +983,9 @@ static int run_git_commit(const char *defmsg,
cmd.git_cmd = 1; cmd.git_cmd = 1;
if (is_rebase_i(opts) && !(!defmsg && (flags & AMEND_MSG)) && if (is_rebase_i(opts) &&
((opts->committer_date_is_author_date && !opts->ignore_date) ||
!(!defmsg && (flags & AMEND_MSG))) &&
read_env_script(&cmd.env_array)) { read_env_script(&cmd.env_array)) {
const char *gpg_opt = gpg_sign_opt_quoted(opts); const char *gpg_opt = gpg_sign_opt_quoted(opts);

Просмотреть файл

@ -82,6 +82,20 @@ test_expect_success '--committer-date-is-author-date works with merge backend' '
test_ctime_is_atime -1 test_ctime_is_atime -1
' '
test_expect_success '--committer-date-is-author-date works when rewording' '
GIT_AUTHOR_DATE="@1234 +0300" git commit --amend --reset-author &&
(
set_fake_editor &&
FAKE_COMMIT_MESSAGE=edited \
FAKE_LINES="reword 1" \
git rebase -i --committer-date-is-author-date HEAD^
) &&
test_write_lines edited "" >expect &&
git log --format="%B" -1 >actual &&
test_cmp expect actual &&
test_ctime_is_atime -1
'
test_expect_success '--committer-date-is-author-date works with rebase -r' ' test_expect_success '--committer-date-is-author-date works with rebase -r' '
git checkout side && git checkout side &&
GIT_AUTHOR_DATE="@1234 +0300" git merge --no-ff commit3 && GIT_AUTHOR_DATE="@1234 +0300" git merge --no-ff commit3 &&
@ -155,6 +169,21 @@ test_expect_success '--reset-author-date with --committer-date-is-author-date wo
test_atime_is_ignored -2 test_atime_is_ignored -2
' '
test_expect_success 'reset-author-date with --committer-date-is-author-date works when rewording' '
GIT_AUTHOR_DATE="@1234 +0300" git commit --amend --reset-author &&
(
set_fake_editor &&
FAKE_COMMIT_MESSAGE=edited \
FAKE_LINES="reword 1" \
git rebase -i --committer-date-is-author-date \
--reset-author-date HEAD^
) &&
test_write_lines edited "" >expect &&
git log --format="%B" -1 >actual &&
test_cmp expect actual &&
test_atime_is_ignored -1
'
test_expect_success '--reset-author-date --committer-date-is-author-date works when forking merge' ' test_expect_success '--reset-author-date --committer-date-is-author-date works when forking merge' '
GIT_SEQUENCE_EDITOR="echo \"merge -C $(git rev-parse HEAD) commit3\">" \ GIT_SEQUENCE_EDITOR="echo \"merge -C $(git rev-parse HEAD) commit3\">" \
PATH="./test-bin:$PATH" git rebase -i --strategy=test \ PATH="./test-bin:$PATH" git rebase -i --strategy=test \