All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Nieder <jrnieder@gmail.com>
To: Johannes Sixt <j.sixt@viscovery.net>
Cc: Junio C Hamano <gitster@pobox.com>,
	Ramkumar Ramachandra <artagnon@gmail.com>,
	git@vger.kernel.org, Christian Couder <chriscool@tuxfamily.org>,
	Martin von Zweigbergk <martin.von.zweigbergk@gmail.com>,
	Jay Soffian <jaysoffian@gmail.com>
Subject: [PATCH 4/7] revert: allow single-pick in the middle of cherry-pick sequence
Date: Sat, 10 Dec 2011 06:59:48 -0600	[thread overview]
Message-ID: <20111210125948.GE22035@elie.hsd1.il.comcast.net> (raw)
In-Reply-To: <20111210124644.GA22035@elie.hsd1.il.comcast.net>

When I messed up a difficult conflict in the middle of a cherry-pick
sequence, it can be useful to be able to 'git checkout HEAD . && git
cherry-pick that-one-commit' to restart the conflict resolution.

Suggested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Maybe this should come after patch 6/7, so the use case could use
"git reset --hard".

 builtin/revert.c                |   26 ++++++++++++++++++++++++++
 t/t3510-cherry-pick-sequence.sh |   12 ++++++++++++
 2 files changed, 38 insertions(+), 0 deletions(-)

diff --git a/builtin/revert.c b/builtin/revert.c
index 71570357..dcb69904 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -1072,6 +1072,12 @@ static int sequencer_continue(struct replay_opts *opts)
 	return pick_commits(todo_list, opts);
 }
 
+static int single_pick(struct commit *cmit, struct replay_opts *opts)
+{
+	setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
+	return do_pick_commit(cmit, opts);
+}
+
 static int pick_revisions(struct replay_opts *opts)
 {
 	struct commit_list *todo_list = NULL;
@@ -1097,6 +1103,26 @@ static int pick_revisions(struct replay_opts *opts)
 		return sequencer_continue(opts);
 
 	/*
+	 * If we were called as "git cherry-pick <commit>", just
+	 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
+	 * REVERT_HEAD, and don't touch the sequencer state.
+	 * This means it is possible to cherry-pick in the middle
+	 * of a cherry-pick sequence.
+	 */
+	if (opts->revs->cmdline.nr == 1 &&
+	    opts->revs->cmdline.rev->whence == REV_CMD_REV &&
+	    opts->revs->no_walk &&
+	    !opts->revs->cmdline.rev->flags) {
+		struct commit *cmit;
+		if (prepare_revision_walk(opts->revs))
+			die(_("revision walk setup failed"));
+		cmit = get_revision(opts->revs);
+		if (!cmit || get_revision(opts->revs))
+			die("BUG: expected exactly one commit from walk");
+		return single_pick(cmit, opts);
+	}
+
+	/*
 	 * Start a new cherry-pick/ revert sequence; but
 	 * first, make sure that an existing one isn't in
 	 * progress
diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh
index 56c95ec1..98a27a23 100755
--- a/t/t3510-cherry-pick-sequence.sh
+++ b/t/t3510-cherry-pick-sequence.sh
@@ -50,6 +50,18 @@ test_expect_success 'cherry-pick persists data on failure' '
 	test_path_is_file .git/sequencer/opts
 '
 
+test_expect_success 'cherry-pick mid-cherry-pick-sequence' '
+	pristine_detach initial &&
+	test_must_fail git cherry-pick base..anotherpick &&
+	test_cmp_rev picked CHERRY_PICK_HEAD &&
+	# "oops, I forgot that these patches rely on the change from base"
+	git checkout HEAD foo &&
+	git cherry-pick base &&
+	git cherry-pick picked &&
+	git cherry-pick --continue &&
+	git diff --exit-code anotherpick
+'
+
 test_expect_success 'cherry-pick persists opts correctly' '
 	pristine_detach initial &&
 	test_must_fail git cherry-pick -s -m 1 --strategy=recursive -X patience -X ours base..anotherpick &&
-- 
1.7.8.rc3

  parent reply	other threads:[~2011-12-10 13:00 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-20  7:30 cherry-pick/revert error messages Jonathan Nieder
2011-11-20  8:02 ` Ramkumar Ramachandra
2011-11-20  9:46   ` [RFC/PATCH 0/3] " Jonathan Nieder
2011-11-20  9:48     ` [PATCH 1/3] revert: rename --reset option to --quit Jonathan Nieder
2011-11-21 20:36       ` Junio C Hamano
2011-11-21 22:35         ` Jakub Narebski
2011-11-21 22:43           ` Jonathan Nieder
2011-11-20  9:50     ` [PATCH 2/3] revert: rearrange pick_revisions() for clarity Jonathan Nieder
2011-11-20  9:51     ` [PATCH 3/3] revert: improve error message for cherry-pick during cherry-pick Jonathan Nieder
2011-11-22 11:12     ` [PATCH v2 0/3] Re: cherry-pick/revert error messages Jonathan Nieder
2011-11-22 11:14       ` [PATCH 1/3] revert: rename --reset option to --quit Jonathan Nieder
2011-11-22 11:15       ` [PATCH 2/3] revert: rearrange pick_revisions() for clarity Jonathan Nieder
2011-11-22 11:15       ` [PATCH 3/3] revert: improve error message for cherry-pick during cherry-pick Jonathan Nieder
2011-11-22 11:17       ` [PATCH 4/3] revert: write REVERT_HEAD pseudoref during conflicted revert Jonathan Nieder
2011-11-22 21:40         ` Thiago Farina
2011-12-01  9:34         ` Ramkumar Ramachandra
2011-11-22 11:20       ` [PATCH 5/3] revert: introduce --abort to cancel a failed cherry-pick Jonathan Nieder
2011-11-23  0:43         ` Junio C Hamano
2011-11-23  1:27           ` Jonathan Nieder
2011-11-23  8:49             ` [PATCH] Fix revert --abort on Windows Johannes Sixt
2011-11-23 10:04               ` Jonathan Nieder
2011-11-23 10:21                 ` Johannes Sixt
2011-12-10 12:46                   ` [RFC/PATCH 0/7] some sequencer loose ends (Re: Fix revert --abort on Windows) Jonathan Nieder
2011-12-10 12:47                     ` [PATCH 1/7] revert: give --continue handling its own function Jonathan Nieder
2011-12-14 13:16                       ` Ramkumar Ramachandra
2011-12-10 12:49                     ` [PATCH 2/7] revert: allow cherry-pick --continue to commit before resuming Jonathan Nieder
2011-12-14 14:26                       ` Ramkumar Ramachandra
2011-12-14 16:48                         ` Jonathan Nieder
2011-12-10 12:58                     ` [PATCH 3/7] revert: pass around rev-list args in already-parsed form Jonathan Nieder
2011-12-14 14:51                       ` Ramkumar Ramachandra
2011-12-10 12:59                     ` Jonathan Nieder [this message]
2011-12-14 15:48                       ` [PATCH 4/7] revert: allow single-pick in the middle of cherry-pick sequence Ramkumar Ramachandra
2011-12-14 16:21                         ` Jonathan Nieder
2012-04-05 11:49                       ` Ævar Arnfjörð Bjarmason
2012-04-05 12:15                         ` Jonathan Nieder
2011-12-10 13:02                     ` [PATCH 5/7] revert: do not remove state until sequence is finished Jonathan Nieder
2011-12-14 16:02                       ` Ramkumar Ramachandra
2011-12-10 13:03                     ` [PATCH 6/7] Revert "reset: Make reset remove the sequencer state" Jonathan Nieder
2011-12-14 16:06                       ` Ramkumar Ramachandra
2011-12-10 13:06                     ` [PATCH 7/7] revert: stop creating and removing sequencer-old directory Jonathan Nieder
2011-12-14 16:10                       ` Ramkumar Ramachandra
2011-12-11 19:58                     ` [RFC/PATCH 0/7] some sequencer loose ends (Re: Fix revert --abort on Windows) Jonathan Nieder
2011-12-12  8:15                       ` Junio C Hamano
2011-12-12 21:31                     ` Junio C Hamano
2011-12-14  9:57                       ` Jonathan Nieder
2011-11-23 17:23               ` [PATCH] Fix revert --abort on Windows Alex Riesen
2011-11-30 22:52         ` [PATCH 5/3] revert: introduce --abort to cancel a failed cherry-pick Junio C Hamano
2011-11-22 11:20       ` [PATCH 6/3] revert: remove --reset compatibility option Jonathan Nieder
2011-11-22 21:49         ` Junio C Hamano
2011-11-22 23:11           ` Jonathan Nieder
2011-11-22 23:38             ` Junio C Hamano
2011-11-22 11:27       ` [PATCH v2 0/3] Re: cherry-pick/revert error messages Jonathan Nieder

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=20111210125948.GE22035@elie.hsd1.il.comcast.net \
    --to=jrnieder@gmail.com \
    --cc=artagnon@gmail.com \
    --cc=chriscool@tuxfamily.org \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=j.sixt@viscovery.net \
    --cc=jaysoffian@gmail.com \
    --cc=martin.von.zweigbergk@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.