From mboxrd@z Thu Jan 1 00:00:00 1970 From: Felipe Contreras Subject: [PATCH v4 14/45] revert/cherry-pick: add --skip option Date: Sun, 9 Jun 2013 11:40:26 -0500 Message-ID: <1370796057-25312-15-git-send-email-felipe.contreras@gmail.com> References: <1370796057-25312-1-git-send-email-felipe.contreras@gmail.com> Cc: Junio C Hamano , Ramkumar Ramachandra , Jonathan Nieder , Martin von Zweigbergk , Felipe Contreras To: git@vger.kernel.org X-From: git-owner@vger.kernel.org Sun Jun 09 18:43:40 2013 Return-path: Envelope-to: gcvg-git-2@plane.gmane.org Received: from vger.kernel.org ([209.132.180.67]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1UliiR-0006ex-HW for gcvg-git-2@plane.gmane.org; Sun, 09 Jun 2013 18:43:39 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751625Ab3FIQnd (ORCPT ); Sun, 9 Jun 2013 12:43:33 -0400 Received: from mail-ob0-f179.google.com ([209.85.214.179]:48626 "EHLO mail-ob0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751485Ab3FIQnb (ORCPT ); Sun, 9 Jun 2013 12:43:31 -0400 Received: by mail-ob0-f179.google.com with SMTP id xk17so8834442obc.24 for ; Sun, 09 Jun 2013 09:43:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=S8zYBgvU3XWNLpGVcc5CjouNIuKVCMWBifkJRLEoobA=; b=tmemvA+Lb+z0k7RtNZwQppnq+ZMpbAdjzqv0zNt92Z9AHjiTg5EJ1hgfa+8+vNAIYk TokFw0xM2kh/M6U9EvVMB8rCI3nIDvDYkkU/UCCXesP/zE6mX+PQDAw4EixI0nwUOh4j xTzmer8BMfPERGbZxOPW4OPxFiY/qLzZok3tQDMtqoujzLZNan/NRlCtJWl82zY7T/4O 0r5sCmJMKKI5wT/bN5ngvmlzqHW0SqKzam2tFR+RfO9vAXQ3NJ7LE+CgIzMrrmF13zE0 J8Dd/0+aZ6/te2o9uMjwQSJbzIyV1Z0hctKoLjb5YDVAKrGrd6HITuMjalweGHhYMsnP J8tA== X-Received: by 10.60.141.164 with SMTP id rp4mr5466541oeb.38.1370796210690; Sun, 09 Jun 2013 09:43:30 -0700 (PDT) Received: from localhost (187-163-100-70.static.axtel.net. [187.163.100.70]) by mx.google.com with ESMTPSA id oe10sm15154418oeb.6.2013.06.09.09.43.29 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sun, 09 Jun 2013 09:43:29 -0700 (PDT) X-Mailer: git-send-email 1.8.3.698.g079b096 In-Reply-To: <1370796057-25312-1-git-send-email-felipe.contreras@gmail.com> Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: Akin to 'am --skip' and 'rebase --skip'. Signed-off-by: Felipe Contreras --- Documentation/git-cherry-pick.txt | 1 + Documentation/git-revert.txt | 1 + Documentation/sequencer.txt | 3 +++ builtin/revert.c | 6 ++++++ builtin/sequencer.c | 24 ++++++++++++++++++++++++ builtin/sequencer.h | 3 ++- t/t3510-cherry-pick-sequence.sh | 12 ++++++++++++ 7 files changed, 49 insertions(+), 1 deletion(-) diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt index da0bd81..d95c63c 100644 --- a/Documentation/git-cherry-pick.txt +++ b/Documentation/git-cherry-pick.txt @@ -10,6 +10,7 @@ SYNOPSIS [verse] 'git cherry-pick' [-q] [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] ... 'git cherry-pick' --continue +'git cherry-pick' --skip 'git cherry-pick' --quit 'git cherry-pick' --abort diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt index 98a8e7a..52e146e 100644 --- a/Documentation/git-revert.txt +++ b/Documentation/git-revert.txt @@ -10,6 +10,7 @@ SYNOPSIS [verse] 'git revert' [-q] [--[no-]edit] [-n] [-m parent-number] [-s] ... 'git revert' --continue +'git revert' --skip 'git revert' --quit 'git revert' --abort diff --git a/Documentation/sequencer.txt b/Documentation/sequencer.txt index 5747f44..df2d355 100644 --- a/Documentation/sequencer.txt +++ b/Documentation/sequencer.txt @@ -3,6 +3,9 @@ '.git/sequencer'. Can be used to continue after resolving conflicts in a failed cherry-pick or revert. +--skip:: + Skip the current commit, and then continue. + --quit:: Forget about the current operation in progress. Can be used to clear the sequencer state after a failed cherry-pick or diff --git a/builtin/revert.c b/builtin/revert.c index ec83748..d3d5600 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -99,11 +99,13 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) int remove_state = 0; int contin = 0; int rollback = 0; + int skip = 0; struct option options[] = { OPT__QUIET(&opts->quiet, N_("suppress progress reporting")), OPT_BOOLEAN(0, "quit", &remove_state, N_("end revert or cherry-pick sequence")), OPT_BOOLEAN(0, "continue", &contin, N_("resume revert or cherry-pick sequence")), OPT_BOOLEAN(0, "abort", &rollback, N_("cancel revert or cherry-pick sequence")), + OPT_BOOLEAN(0, "skip", &skip, N_("skip current commit in the sequence")), OPT_BOOLEAN('n', "no-commit", &opts->no_commit, N_("don't automatically commit")), OPT_BOOLEAN('e', "edit", &opts->edit, N_("edit the commit message")), OPT_NOOP_NOARG('r', NULL), @@ -164,6 +166,8 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) opts->subcommand = REPLAY_CONTINUE; else if (rollback) opts->subcommand = REPLAY_ROLLBACK; + else if (skip) + opts->subcommand = REPLAY_SKIP; else opts->subcommand = REPLAY_NONE; @@ -174,6 +178,8 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) this_operation = "--quit"; else if (opts->subcommand == REPLAY_CONTINUE) this_operation = "--continue"; + else if (opts->subcommand == REPLAY_SKIP) + this_operation = "--skip"; else { assert(opts->subcommand == REPLAY_ROLLBACK); this_operation = "--abort"; diff --git a/builtin/sequencer.c b/builtin/sequencer.c index 0f50942..2b1b30a 100644 --- a/builtin/sequencer.c +++ b/builtin/sequencer.c @@ -961,6 +961,28 @@ static int sequencer_continue(struct replay_opts *opts) return pick_commits(todo_list, opts); } +static int sequencer_skip(struct replay_opts *opts) +{ + const char *argv[4]; /* reset --hard HEAD + NULL */ + struct string_list merge_rr = STRING_LIST_INIT_DUP; + int ret; + + if (setup_rerere(&merge_rr, 0) >= 0) { + rerere_clear(&merge_rr); + string_list_clear(&merge_rr, 1); + } + + argv[0] = "reset"; + argv[1] = "--hard"; + argv[2] = "HEAD"; + argv[3] = NULL; + ret = run_command_v_opt(argv, RUN_GIT_CMD); + if (ret) + return ret; + + return sequencer_continue(opts); +} + static int single_pick(struct commit *cmit, struct replay_opts *opts) { setenv(GIT_REFLOG_ACTION, action_name(opts), 0); @@ -991,6 +1013,8 @@ int sequencer_pick_revisions(struct replay_opts *opts) return sequencer_rollback(opts); if (opts->subcommand == REPLAY_CONTINUE) return sequencer_continue(opts); + if (opts->subcommand == REPLAY_SKIP) + return sequencer_skip(opts); for (i = 0; i < opts->revs->pending.nr; i++) { unsigned char sha1[20]; diff --git a/builtin/sequencer.h b/builtin/sequencer.h index e45411c..e69495a 100644 --- a/builtin/sequencer.h +++ b/builtin/sequencer.h @@ -15,7 +15,8 @@ enum replay_subcommand { REPLAY_NONE, REPLAY_REMOVE_STATE, REPLAY_CONTINUE, - REPLAY_ROLLBACK + REPLAY_ROLLBACK, + REPLAY_SKIP }; struct replay_opts { diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh index 33c5512..c43c327 100755 --- a/t/t3510-cherry-pick-sequence.sh +++ b/t/t3510-cherry-pick-sequence.sh @@ -511,4 +511,16 @@ test_expect_success 'commit descriptions in insn sheet are optional' ' test_line_count = 4 commits ' +test_expect_success 'skip' ' + pristine_detach conflicting && + test_must_fail git cherry-pick initial..picked && + + git checkout HEAD -- unrelated && + test_must_fail git cherry-pick --continue && + git cherry-pick --skip && + + git rev-list initial..HEAD >commits && + test_line_count = 3 commits +' + test_done -- 1.8.3.698.g079b096