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>,
Phillip Wood <phillip.wood@dunelm.org.uk>
Subject: [PATCH v2 4/6] rebase --continue: refuse to commit after failed command
Date: Fri, 21 Apr 2023 14:57:52 +0000 [thread overview]
Message-ID: <9356d14b09a468d8ef2884cd7d76e59ec5c16691.1682089075.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1492.v2.git.1682089074.gitgitgadget@gmail.com>
From: Phillip Wood <phillip.wood@dunelm.org.uk>
If a commit cannot be picked because it would overwrite an untracked
file then "git rebase --continue" should refuse to commit any staged
changes as the commit was not picked. Do this by using the existing
check for a missing author script in run_git_commit() which prevents
"rebase --continue" from committing staged changes after failed exec
commands.
When fast-forwarding it is not necessary to write the author script as
we're reusing an existing commit, not creating a new one. If a
fast-forwarded commit is modified by an "edit" or "reword" command then
the modification is committed with "git commit --amend" which reuses the
author of the commit being amended so the author script is not needed.
baf8ec8d3a (rebase -r: don't write .git/MERGE_MSG when fast-forwarding,
2021-08-20) changed run_git_commit() to allow a missing author script
when rewording a commit. This changes extends that to allow a missing
author script whenever the commit is being amended.
If we're not fast-forwarding then we must remove the author script if
the pick fails.
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
---
sequencer.c | 10 +++++-----
t/t3404-rebase-interactive.sh | 8 ++++++++
t/t3430-rebase-merges.sh | 4 +++-
3 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/sequencer.c b/sequencer.c
index 2d463818dd1..55bf0a72c3a 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -1055,7 +1055,7 @@ static int run_git_commit(const char *defmsg,
if (is_rebase_i(opts) &&
((opts->committer_date_is_author_date && !opts->ignore_date) ||
- !(!defmsg && (flags & AMEND_MSG))) &&
+ !(flags & AMEND_MSG)) &&
read_env_script(&cmd.env)) {
const char *gpg_opt = gpg_sign_opt_quoted(opts);
@@ -2216,8 +2216,6 @@ static int do_pick_commit(struct repository *r,
if (opts->allow_ff && !is_fixup(command) &&
((parent && oideq(&parent->object.oid, &head)) ||
(!parent && unborn))) {
- if (is_rebase_i(opts))
- write_author_script(msg.message);
res = fast_forward_to(r, &commit->object.oid, &head, unborn,
opts);
if (res || command != TODO_REWORD)
@@ -2324,9 +2322,10 @@ static int do_pick_commit(struct repository *r,
command == TODO_REVERT) {
res = do_recursive_merge(r, base, next, base_label, next_label,
&head, &msgbuf, opts);
- if (res < 0)
+ if (res < 0) {
+ unlink(rebase_path_author_script());
goto leave;
-
+ }
res |= write_message(msgbuf.buf, msgbuf.len,
git_path_merge_msg(r), 0);
} else {
@@ -4141,6 +4140,7 @@ static int do_merge(struct repository *r,
if (ret < 0) {
error(_("could not even attempt to merge '%.*s'"),
merge_arg_len, arg);
+ unlink(rebase_path_author_script());
goto leave_merge;
}
/*
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index ff0afad63e2..c1fe55dc2c1 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -1288,6 +1288,12 @@ test_expect_success 'rebase -i commits that overwrite untracked files (pick)' '
test_must_fail git rebase --continue &&
test_cmp_rev HEAD F &&
rm file6 &&
+ test_path_is_missing .git/rebase-merge/author-script &&
+ echo changed >file1 &&
+ git add file1 &&
+ test_must_fail git rebase --continue 2>err &&
+ grep "error: you have staged changes in your working tree" err &&
+ git reset --hard HEAD &&
git rebase --continue &&
test_cmp_rev HEAD I
'
@@ -1306,6 +1312,7 @@ test_expect_success 'rebase -i commits that overwrite untracked files (squash)'
test_must_fail git rebase --continue &&
test_cmp_rev HEAD F &&
rm file6 &&
+ test_path_is_missing .git/rebase-merge/author-script &&
git rebase --continue &&
test $(git cat-file commit HEAD | sed -ne \$p) = I &&
git reset --hard original-branch2
@@ -1324,6 +1331,7 @@ test_expect_success 'rebase -i commits that overwrite untracked files (no ff)' '
test_must_fail git rebase --continue &&
test $(git cat-file commit HEAD | sed -ne \$p) = F &&
rm file6 &&
+ test_path_is_missing .git/rebase-merge/author-script &&
git rebase --continue &&
test $(git cat-file commit HEAD | sed -ne \$p) = I
'
diff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh
index f03599c63b9..360ec787ffd 100755
--- a/t/t3430-rebase-merges.sh
+++ b/t/t3430-rebase-merges.sh
@@ -168,13 +168,15 @@ test_expect_success 'failed `merge -C` writes patch (may be rescheduled, too)' '
grep "^merge -C .* G$" .git/rebase-merge/done &&
grep "^merge -C .* G$" .git/rebase-merge/git-rebase-todo &&
test_path_is_file .git/rebase-merge/patch &&
+ test_path_is_missing .git/rebase-merge/author-script &&
: fail because of merge conflict &&
rm G.t .git/rebase-merge/patch &&
git reset --hard conflicting-G &&
test_must_fail git rebase --continue &&
! grep "^merge -C .* G$" .git/rebase-merge/git-rebase-todo &&
- test_path_is_file .git/rebase-merge/patch
+ test_path_is_file .git/rebase-merge/patch &&
+ test_path_is_file .git/rebase-merge/author-script
'
test_expect_success 'failed `merge <branch>` does not crash' '
--
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 ` [PATCH v2 0/6] rebase -i: impove handling of failed commands Phillip Wood via GitGitGadget
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 ` Phillip Wood via GitGitGadget [this message]
2023-04-21 19:14 ` [PATCH v2 4/6] rebase --continue: refuse to commit after failed command 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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9356d14b09a468d8ef2884cd7d76e59ec5c16691.1682089075.git.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.
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 NNTP newsgroup(s).