To prevent mistakes when editing a branch, rebase features a knob, rebase.missingCommitsCheck, to warn the user if a commit was dropped. Unfortunately, this check is only effective for the initial edit, which means that if you edit the todo list at a later point of the rebase and drop a commit, no warnings or errors would be issued. This adds the ability to check if commits were dropped when editing the todo list with `--edit-todo', and when resuming a rebase. The first patch moves moves check_todo_list_from_file() and `edit_todo_list_advice' from sequencer.c to rebase-interactive.c so the latter can be used by edit_todo_list() and todo_list_check(). The second patch adds the check to `--edit-todo' and `--continue' and tests. This is based on 26027625dd ("rebase -i: also avoid SHA-1 collisions with missingCommitsCheck", 2020-01-23). The tip of this series is tagged as "edit-todo-drop-v6" at https://github.com/agrn/git. Changes since v5: - Rebased onto js/rebase-i-with-colliding-hash. This means the backup is once again created with todo_list_write_to_file(), but without the flag `TODO_LIST_SHORTEN_IDS' this time. Alban Gruin (2): sequencer: move check_todo_list_from_file() to rebase-interactive.c rebase-interactive: warn if commit is dropped with `rebase --edit-todo' rebase-interactive.c | 84 ++++++++++++++++++++--- rebase-interactive.h | 5 ++ sequencer.c | 51 ++++---------- sequencer.h | 2 +- t/t3404-rebase-interactive.sh | 121 ++++++++++++++++++++++++++++++++++ 5 files changed, 214 insertions(+), 49 deletions(-) Range-diff against v5: 1: 996045a300 = 1: 4f07ce94a8 sequencer: move check_todo_list_from_file() to rebase-interactive.c 2: 6dbaa8cbe6 ! 2: 68481d89b0 rebase-interactive: warn if commit is dropped with `rebase --edit-todo' @@ rebase-interactive.c: int edit_todo_list(struct repository *r, struct 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 || !incorrect) { -+ if (!initial) -+ unlink(todo_backup); -+ -+ if (copy_file(todo_backup, todo_file, 0666)) -+ return error(_("could not copy '%s' to '%s'."), todo_file, todo_backup); -+ } - - if (launch_sequence_editor(todo_file, &new_todo->buf, NULL)) - return -2; +- if (initial && +- todo_list_write_to_file(r, todo_list, rebase_path_todo_backup(), ++ if (!incorrect && ++ todo_list_write_to_file(r, todo_list, 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()); @@ rebase-interactive.c: int edit_todo_list(struct repository *r, struct todo_list *todo_list, if (initial && new_todo->buf.len == 0) return -3; @@ sequencer.c: int sequencer_continue(struct repository *r, struct replay_opts *op + unlink(rebase_path_dropped()); + } + - if (commit_staged_changes(r, opts, &todo_list)) - return -1; - } else if (!file_exists(get_todo_path(opts))) + if (commit_staged_changes(r, opts, &todo_list)) { + res = -1; + goto release_todo_list; @@ sequencer.c: int todo_list_write_to_file(struct repository *r, struct todo_list *todo_list, return res; } -- 2.24.1