sequencer: fix empty commit check when amending
This fixes a regression introduced in 356ee4659b
("sequencer: try to
commit without forking 'git commit'", 2017-11-24). When amending a
commit try_to_commit() was using the wrong parent when checking if the
commit would be empty. When amending we need to check against HEAD^ not
HEAD.
t3403 may not seem like the natural home for the new tests but a further
patch series will improve the advice printed by `git commit`. That
series will mutate these tests to check that the advice includes
suggesting `rebase --skip` to skip the fixup that would empty the
commit.
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
4627bc777e
commit
2d05ef2778
26
sequencer.c
26
sequencer.c
@ -1351,11 +1351,27 @@ static int try_to_commit(struct repository *r,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!(flags & ALLOW_EMPTY) && oideq(current_head ?
|
||||
get_commit_tree_oid(current_head) :
|
||||
the_hash_algo->empty_tree, &tree)) {
|
||||
res = 1; /* run 'git commit' to display error message */
|
||||
goto out;
|
||||
if (!(flags & ALLOW_EMPTY)) {
|
||||
struct commit *first_parent = current_head;
|
||||
|
||||
if (flags & AMEND_MSG) {
|
||||
if (current_head->parents) {
|
||||
first_parent = current_head->parents->item;
|
||||
if (repo_parse_commit(r, first_parent)) {
|
||||
res = error(_("could not parse HEAD commit"));
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
first_parent = NULL;
|
||||
}
|
||||
}
|
||||
if (oideq(first_parent
|
||||
? get_commit_tree_oid(first_parent)
|
||||
: the_hash_algo->empty_tree,
|
||||
&tree)) {
|
||||
res = 1; /* run 'git commit' to display error message */
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if (find_hook("prepare-commit-msg")) {
|
||||
|
@ -7,6 +7,8 @@ test_description='git rebase --merge --skip tests'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
. "$TEST_DIRECTORY"/lib-rebase.sh
|
||||
|
||||
# we assume the default git am -3 --skip strategy is tested independently
|
||||
# and always works :)
|
||||
|
||||
@ -20,6 +22,13 @@ test_expect_success setup '
|
||||
git commit -a -m "hello world" &&
|
||||
echo goodbye >> hello &&
|
||||
git commit -a -m "goodbye" &&
|
||||
git tag goodbye &&
|
||||
|
||||
git checkout --detach &&
|
||||
git checkout HEAD^ . &&
|
||||
test_tick &&
|
||||
git commit -m reverted-goodbye &&
|
||||
git tag reverted-goodbye &&
|
||||
|
||||
git checkout -f skip-reference &&
|
||||
echo moo > hello &&
|
||||
@ -76,4 +85,27 @@ test_expect_success 'moved back to branch correctly' '
|
||||
|
||||
test_debug 'gitk --all & sleep 1'
|
||||
|
||||
test_expect_success 'fixup that empties commit fails' '
|
||||
test_when_finished "git rebase --abort" &&
|
||||
(
|
||||
set_fake_editor &&
|
||||
test_must_fail env FAKE_LINES="1 fixup 2" git rebase -i \
|
||||
goodbye^ reverted-goodbye
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'squash that empties commit fails' '
|
||||
test_when_finished "git rebase --abort" &&
|
||||
(
|
||||
set_fake_editor &&
|
||||
test_must_fail env FAKE_LINES="1 squash 2" git rebase -i \
|
||||
goodbye^ reverted-goodbye
|
||||
)
|
||||
'
|
||||
|
||||
# Must be the last test in this file
|
||||
test_expect_success '$EDITOR and friends are unchanged' '
|
||||
test_editor_unchanged
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user