Hi Phillip, Le 10/01/2020 à 18:13, Phillip Wood a écrit : > Hi Alban > > On 09/01/2020 21:13, Alban Gruin wrote: >> Hi Phillip, >> >> Le 09/12/2019 à 17:00, Phillip Wood a écrit : >>>>> diff --git a/rebase-interactive.c b/rebase-interactive.c >>>>> index ad5dd49c31..80b6a2e7a6 100644 >>>>> --- a/rebase-interactive.c >>>>> +++ b/rebase-interactive.c >>>>> @@ -97,7 +97,8 @@ int edit_todo_list(struct repository *r, struct >>>>> todo_list *todo_list, >>>>> struct todo_list *new_todo, const char *shortrevisions, >>>>> const char *shortonto, unsigned flags) >>>>> { >>>>> - const char *todo_file = rebase_path_todo(); >>>>> + const char *todo_file = rebase_path_todo(), >>>>> + *todo_backup = rebase_path_todo_backup(); >>>>> /* If the user is editing the todo list, we first try to parse >>>>> @@ -110,9 +111,9 @@ 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()); >>>>> + unlink(todo_backup); >>>>> + if (copy_file(todo_backup, todo_file, 0666)) >>>>> + return error(_("could not copy '%s' to '%s'."), todo_file, >>>>> todo_backup); >>>> >>>> We used to copy ONLY when initial is set and we left old todo_backup >>>> intact when !initial. That is no longer true after this change, but >>>> it is intended---we create an exact copy of what we would hand out >>>> to the end-user, so that we can compare it with the edited result >>>> to figure out what got changed. >>> >>> I think it would be better to only create a new copy if the last edit >>> was successful. As it stands if I edit the todo list and accidentally >>> delete some lines and then edit the todo list again to try and fix it >>> the second edit will succeed whether or not I reinserted the deleted >>> lines. >>> >>> We could add this to the tests to check that a subsequent edit that does >>> not fix the problem fails >>> >>> diff --git a/t/t3404-rebase-interactive.sh >>> b/t/t3404-rebase-interactive.sh >>> index 969e12d281..8544d8ab2c 100755 >>> --- a/t/t3404-rebase-interactive.sh >>> +++ b/t/t3404-rebase-interactive.sh >>> >>> @@ -1416,6 +1416,7 @@ test_expect_success 'rebase --edit-todo respects >>> rebase.missingCommitsCheck = er >>> test_i18ncmp expect actual && >>> test_must_fail git rebase --continue 2>actual && >>> test_i18ncmp expect actual && >>> + test_must_fail git rebase --edit-todo && >>> cp orig .git/rebase-merge/git-rebase-todo && >>> test_must_fail env FAKE_LINES="1 2 3 4" \ >>> git rebase --edit-todo 2>actual && >>> >>> >> >> In which case, if the check did not pass at the previous edit, the new >> todo list should be compared to the backup. As sequencer_continue() >> already does this, extract this to its own function in >> rebase-interactive.c. To keep track of this, a file is created on the >> disk (as you suggested in your other email.) At the next edit, if this >> file exists and no errors were found, it is deleted. The backup is only >> created if there is no errors in `todo_list' and in `new_todo'. >> >> This would guarantee that there is no errors in the backup, and that the >> edited list is always compared to a list exempt of errors. >> >> This approach also has the benefit to detect if a commit part of a >> badcmd was dropped. >> >> After some tweaks (ie. `expect' now lists 2 commits instead of one), >> this passes the test with the change you suggested, and the one you sent >> in your other email. > > That sounds good. I'm not sure how it passes the test in my other email > though, if sequencer_continue() compares the todo list to the backup > wont it still fail when continuing after conflicts as the backup is out > of date? > I changed sequencer_continue() to check the todo list only if the file indicating an error exists. I still have to rewrite the commit message, then I’ll re-send this series. Cheers, Alban > Best Wishes > > Phillip >