]> git.ipfire.org Git - thirdparty/git.git/commitdiff
rebase -i: also avoid SHA-1 collisions with missingCommitsCheck
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Thu, 23 Jan 2020 12:28:19 +0000 (12:28 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 23 Jan 2020 20:48:12 +0000 (12:48 -0800)
When `rebase.missingCommitsCheck` is in effect, we use the backup of the
todo list that was copied just before the user was allowed to edit it.

That backup is, of course, just as susceptible to the hash collision as
the todo list itself: a reworded commit could make a previously
unambiguous short commit ID ambiguous all of a sudden.

So let's not just copy the todo list, but let's instead write out the
backup with expanded commit IDs.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
rebase-interactive.c
t/t3404-rebase-interactive.sh

index aa18ae82b724812ea0b2939842395ac78f77bab1..1259adc8ea1afd51f062c18c972ef4acefeef496 100644 (file)
@@ -104,9 +104,11 @@ int edit_todo_list(struct repository *r, struct todo_list *todo_list,
                                    -1, flags | TODO_LIST_SHORTEN_IDS | TODO_LIST_APPEND_TODO_HELP))
                return error_errno(_("could not write '%s'"), todo_file);
 
-       if (initial && copy_file(rebase_path_todo_backup(), todo_file, 0666))
-               return error(_("could not copy '%s' to '%s'."), todo_file,
-                            rebase_path_todo_backup());
+       if (initial &&
+           todo_list_write_to_file(r, todo_list, rebase_path_todo_backup(),
+                                   shortrevisions, shortonto, -1,
+                                   (flags | TODO_LIST_APPEND_TODO_HELP) & ~TODO_LIST_SHORTEN_IDS) < 0)
+               return error(_("could not write '%s'."), rebase_path_todo_backup());
 
        if (launch_sequence_editor(todo_file, &new_todo->buf, NULL))
                return -2;
index 1cc9f36bc76657ed8154895f269ac46baa347e23..b90ea0fe440ffff8ae876ce293b10c32262d9ad9 100755 (executable)
@@ -1277,6 +1277,8 @@ test_expect_success SHA1 'short SHA-1 collide' '
                        .git/rebase-merge/git-rebase-todo.tmp &&
                grep "^pick [0-9a-f]\{40\}" \
                        .git/rebase-merge/git-rebase-todo &&
+               grep "^pick [0-9a-f]\{40\}" \
+                       .git/rebase-merge/git-rebase-todo.backup &&
                git rebase --continue
        ) &&
        collide2="$(git rev-parse HEAD~1 | cut -c 1-4)" &&