]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sequencer: fix empty commit check when amending
authorPhillip Wood <phillip.wood@dunelm.org.uk>
Fri, 22 Nov 2019 19:43:03 +0000 (19:43 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sat, 23 Nov 2019 01:52:32 +0000 (10:52 +0900)
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>
sequencer.c
t/t3403-rebase-skip.sh

index da2decbd3af47f6320ac64d228e99e4be5204f2a..f4f81cbddc1a160c1611af17d20494c7839558cb 100644 (file)
@@ -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")) {
index 1f5122b632fb9d7829e7b5f28c2a2971e9ea04e7..ee8a8dba528697569a8a3f469bd28200f555d763 100755 (executable)
@@ -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