From: Alban Gruin Date: Fri, 10 Jan 2020 21:31:03 GMT Subject: Re: [PATCH v3 2/2] rebase-interactive: warn if commit is dropped with `rebase --edit-todo' Message-ID: <85e3d40a-9829-0f50-8d91-7e8e8fa319f1@gmail.com> In-Reply-To: <79ad2e01-2fc3-cd52-7879-5a81370628ef@gmail.com> 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 >