From: "Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Junio C Hamano <gitster@pobox.com>,
Stefan Haller <lists@haller-berlin.de>,
Phillip Wood <phillip.wood123@gmail.com>,
Phillip Wood <phillip.wood@dunelm.org.uk>
Subject: [PATCH v2 0/6] rebase -i: impove handling of failed commands
Date: Fri, 21 Apr 2023 14:57:48 +0000 [thread overview]
Message-ID: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1492.git.1679237337683.gitgitgadget@gmail.com>
This series fixes several bugs in the way we handle a commit cannot be
picked because it would overwrite an untracked file.
* after a failed pick "git rebase --continue" will happily commit any
staged changes even though no commit was picked.
* the commit of the failed pick is recorded as rewritten even though no
commit was picked.
* the "done" file used by "git status" to show the recently executed
commands contains an incorrect entry.
Thanks for the comments on V1, this series has now grown somewhat.
Previously I was worried that refactoring would change the behavior, but
having thought about it the current behavior is wrong and should be changed.
Changes since V1:
Rebased onto master to avoid a conflict with
ab/remove-implicit-use-of-the-repository
* Patches 1-3 are new preparatory changes
* Patches 4 & 5 are new and fix the first two issues listed above.
* Patch 6 is the old patch 1 which has been rebased and the commit message
reworded. It fixes the last issues listed above.
Phillip Wood (6):
rebase -i: move unlink() calls
rebase -i: remove patch file after conflict resolution
sequencer: factor out part of pick_commits()
rebase --continue: refuse to commit after failed command
rebase: fix rewritten list for failed pick
rebase -i: fix adding failed command to the todo list
sequencer.c | 170 ++++++++++++++++++----------------
t/t3404-rebase-interactive.sh | 49 +++++++---
t/t3430-rebase-merges.sh | 35 +++++--
t/t5407-post-rewrite-hook.sh | 11 +++
4 files changed, 165 insertions(+), 100 deletions(-)
base-commit: 9c6990cca24301ae8f82bf6291049667a0aef14b
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1492%2Fphillipwood%2Frebase-dont-write-done-when-rescheduling-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1492/phillipwood/rebase-dont-write-done-when-rescheduling-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1492
Range-diff vs v1:
-: ----------- > 1: 3dfb2c6903b rebase -i: move unlink() calls
-: ----------- > 2: 227aea031b5 rebase -i: remove patch file after conflict resolution
-: ----------- > 3: 31bb644e769 sequencer: factor out part of pick_commits()
-: ----------- > 4: 9356d14b09a rebase --continue: refuse to commit after failed command
-: ----------- > 5: f8e64c1b631 rebase: fix rewritten list for failed pick
1: dc51a7499bc ! 6: a836b049b90 rebase -i: do not update "done" when rescheduling command
@@ Metadata
Author: Phillip Wood <phillip.wood@dunelm.org.uk>
## Commit message ##
- rebase -i: do not update "done" when rescheduling command
+ rebase -i: fix adding failed command to the todo list
- As the sequencer executes todo commands it appends them to
- .git/rebase-merge/done. This file is used by "git status" to show the
- recently executed commands. Unfortunately when a command is rescheduled
+ When rebasing commands are moved from the todo list in "git-rebase-todo"
+ to the "done" file (which is used by "git status" to show the recently
+ executed commands) just before they are executed. This means that if a
+ command fails because it would overwrite an untracked file it has to be
+ added back into the todo list before the rebase stops for the user to
+ fix the problem.
+
+ Unfortunately when a failed command is added back into the todo list
the command preceding it is erroneously appended to the "done" file.
- This means that when rebase stops after rescheduling "pick B" the "done"
+ This means that when rebase stops after "pick B" fails the "done"
file contains
pick A
@@ Commit message
pick A
pick B
- Fix this by not updating the "done" file when adding a rescheduled
- command back into the "todo" file. A couple of the existing tests are
+ Fix this by not updating the "done" file when adding a failed command
+ back into the "git-rebase-todo" file. A couple of the existing tests are
modified to improve their coverage as none of them trigger this bug or
check the "done" file.
- Note that the rescheduled command will still be appended to the "done"
- file again when it is successfully executed. Arguably it would be better
- not to do that but fixing it would be more involved.
-
Reported-by: Stefan Haller <lists@haller-berlin.de>
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
@@ sequencer.c: static int pick_commits(struct repository *r,
int check_todo = 0;
- if (save_todo(todo_list, opts))
-+ if (save_todo(todo_list, opts, 0))
++ if (save_todo(todo_list, opts, reschedule))
return -1;
if (is_rebase_i(opts)) {
if (item->command != TODO_COMMENT) {
-@@ sequencer.c: static int pick_commits(struct repository *r,
- todo_list->current),
- get_item_line(todo_list,
- todo_list->current));
-- todo_list->current--;
-- if (save_todo(todo_list, opts))
-+ if (save_todo(todo_list, opts, 1))
- return -1;
- }
- if (item->command == TODO_EDIT) {
@@ sequencer.c: static int pick_commits(struct repository *r,
get_item_line_length(todo_list,
todo_list->current),
get_item_line(todo_list, todo_list->current));
- todo_list->current--;
- if (save_todo(todo_list, opts))
-+ if (save_todo(todo_list, opts, 1))
++ if (save_todo(todo_list, opts, reschedule))
return -1;
if (item->commit)
- return error_with_patch(r,
+ write_rebase_head(&item->commit->object.oid);
## t/t3404-rebase-interactive.sh ##
@@ t/t3404-rebase-interactive.sh: test_expect_success 'todo count' '
@@ t/t3404-rebase-interactive.sh: test_expect_success 'todo count' '
+ head -n3 todo >expect &&
+ test_cmp expect .git/rebase-merge/done &&
+ rm file2 &&
+ test_path_is_missing .git/rebase-merge/author-script &&
+ test_path_is_missing .git/rebase-merge/patch &&
+ test_path_is_missing .git/MERGE_MSG &&
+@@ t/t3404-rebase-interactive.sh: test_expect_success 'rebase -i commits that overwrite untracked files (pick)' '
+ grep "error: you have staged changes in your working tree" err &&
+ git reset --hard HEAD &&
git rebase --continue &&
- test_cmp_rev HEAD I
+ test_cmp_rev HEAD D &&
--
gitgitgadget
next prev parent reply other threads:[~2023-04-21 14:58 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-19 14:48 [PATCH] rebase -i: do not update "done" when rescheduling command Phillip Wood via GitGitGadget
2023-03-20 7:29 ` Stefan Haller
2023-03-20 17:46 ` Junio C Hamano
2023-03-24 10:50 ` Phillip Wood
2023-03-24 15:49 ` Junio C Hamano
2023-03-24 16:22 ` Phillip Wood
2023-03-27 7:04 ` Johannes Schindelin
2023-08-03 12:56 ` Phillip Wood
2023-08-23 8:54 ` Johannes Schindelin
2023-04-21 14:57 ` Phillip Wood via GitGitGadget [this message]
2023-04-21 14:57 ` [PATCH v2 1/6] rebase -i: move unlink() calls Phillip Wood via GitGitGadget
2023-04-21 17:22 ` Junio C Hamano
2023-04-27 10:15 ` Phillip Wood
2023-04-21 14:57 ` [PATCH v2 2/6] rebase -i: remove patch file after conflict resolution Phillip Wood via GitGitGadget
2023-04-21 19:01 ` Junio C Hamano
2023-04-27 10:17 ` Phillip Wood
2023-06-21 20:14 ` Glen Choo
2023-07-14 10:08 ` Phillip Wood
2023-07-14 16:51 ` Junio C Hamano
2023-07-17 15:39 ` Phillip Wood
2023-04-21 14:57 ` [PATCH v2 3/6] sequencer: factor out part of pick_commits() Phillip Wood via GitGitGadget
2023-04-21 19:12 ` Eric Sunshine
2023-04-21 19:31 ` Junio C Hamano
2023-04-21 20:00 ` Phillip Wood
2023-04-21 21:21 ` Junio C Hamano
2023-04-21 14:57 ` [PATCH v2 4/6] rebase --continue: refuse to commit after failed command Phillip Wood via GitGitGadget
2023-04-21 19:14 ` Eric Sunshine
2023-04-21 21:05 ` Junio C Hamano
2023-06-21 20:35 ` Glen Choo
2023-04-21 14:57 ` [PATCH v2 5/6] rebase: fix rewritten list for failed pick Phillip Wood via GitGitGadget
2023-06-21 20:49 ` Glen Choo
2023-07-25 15:42 ` Phillip Wood
2023-07-25 16:46 ` Glen Choo
2023-07-26 13:08 ` Phillip Wood
2023-07-26 17:48 ` Glen Choo
2023-07-28 13:19 ` Phillip Wood
2023-04-21 14:57 ` [PATCH v2 6/6] rebase -i: fix adding failed command to the todo list Phillip Wood via GitGitGadget
2023-06-21 20:59 ` Glen Choo
2023-04-21 16:56 ` [PATCH v2 0/6] rebase -i: impove handling of failed commands Junio C Hamano
2023-06-21 20:07 ` Glen Choo
2023-08-01 15:23 ` [PATCH v3 0/7] " Phillip Wood via GitGitGadget
2023-08-01 15:23 ` [PATCH v3 1/7] rebase -i: move unlink() calls Phillip Wood via GitGitGadget
2023-08-01 17:22 ` Junio C Hamano
2023-08-01 18:42 ` Phillip Wood
2023-08-01 19:31 ` Junio C Hamano
2023-08-01 15:23 ` [PATCH v3 2/7] rebase -i: remove patch file after conflict resolution Phillip Wood via GitGitGadget
2023-08-01 17:23 ` Junio C Hamano
2023-08-01 18:47 ` Phillip Wood
2023-08-01 15:23 ` [PATCH v3 3/7] sequencer: use rebase_path_message() Phillip Wood via GitGitGadget
2023-08-01 17:23 ` Junio C Hamano
2023-08-01 18:49 ` Phillip Wood
2023-08-02 22:02 ` Junio C Hamano
2023-08-01 15:23 ` [PATCH v3 4/7] sequencer: factor out part of pick_commits() Phillip Wood via GitGitGadget
2023-08-23 8:55 ` Johannes Schindelin
2023-08-01 15:23 ` [PATCH v3 5/7] rebase: fix rewritten list for failed pick Phillip Wood via GitGitGadget
2023-08-23 8:55 ` Johannes Schindelin
2023-09-04 14:31 ` Phillip Wood
2023-08-01 15:23 ` [PATCH v3 6/7] rebase --continue: refuse to commit after failed command Phillip Wood via GitGitGadget
2023-08-23 9:01 ` Johannes Schindelin
2023-09-04 14:37 ` Phillip Wood
2023-09-05 11:17 ` Johannes Schindelin
2023-09-05 14:57 ` Junio C Hamano
2023-09-05 15:25 ` Phillip Wood
2023-08-01 15:23 ` [PATCH v3 7/7] rebase -i: fix adding failed command to the todo list Phillip Wood via GitGitGadget
2023-08-02 22:10 ` [PATCH v3 0/7] rebase -i: impove handling of failed commands Junio C Hamano
2023-08-03 13:06 ` Phillip Wood
2023-08-09 13:08 ` Phillip Wood
2023-08-07 20:16 ` Glen Choo
2023-08-09 10:06 ` Phillip Wood
2023-09-06 15:22 ` [PATCH v4 " Phillip Wood via GitGitGadget
2023-09-06 15:22 ` [PATCH v4 1/7] rebase -i: move unlink() calls Phillip Wood via GitGitGadget
2023-09-06 15:22 ` [PATCH v4 2/7] rebase -i: remove patch file after conflict resolution Phillip Wood via GitGitGadget
2023-09-06 15:22 ` [PATCH v4 3/7] sequencer: use rebase_path_message() Phillip Wood via GitGitGadget
2023-09-06 15:22 ` [PATCH v4 4/7] sequencer: factor out part of pick_commits() Phillip Wood via GitGitGadget
2023-09-06 15:22 ` [PATCH v4 5/7] rebase: fix rewritten list for failed pick Phillip Wood via GitGitGadget
2023-09-06 15:22 ` [PATCH v4 6/7] rebase --continue: refuse to commit after failed command Phillip Wood via GitGitGadget
2023-09-06 15:22 ` [PATCH v4 7/7] rebase -i: fix adding failed command to the todo list Phillip Wood via GitGitGadget
2023-09-06 21:01 ` [PATCH v4 0/7] rebase -i: impove handling of failed commands Junio C Hamano
2023-09-07 9:56 ` Johannes Schindelin
2023-09-07 20:33 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1492.v2.git.1682089074.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=lists@haller-berlin.de \
--cc=phillip.wood123@gmail.com \
--cc=phillip.wood@dunelm.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).