Merge branch 'pw/sequencer-compare-with-right-parent-to-check-empty-commits'

The sequencer machinery compared the HEAD and the state it is
attempting to commit to decide if the result would be a no-op
commit, even when amending a commit, which was incorrect, and
has been corrected.

* pw/sequencer-compare-with-right-parent-to-check-empty-commits:
  sequencer: fix empty commit check when amending
This commit is contained in:
Junio C Hamano 2019-12-05 12:52:46 -08:00
commit c9208597a9
2 changed files with 53 additions and 5 deletions

View File

@ -1350,11 +1350,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")) {

View File

@ -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