All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Gummerer <t.gummerer@gmail.com>
To: Rohit Ashiwal <rohit.ashiwal265@gmail.com>
Cc: git@vger.kernel.org, newren@gmail.com
Subject: Re: [GSoC][PATCH 2/3] cherry-pick/revert: add --skip option
Date: Sun, 9 Jun 2019 09:37:09 +0100	[thread overview]
Message-ID: <20190609083708.GA28007@hank.intra.tgummerer.com> (raw)
In-Reply-To: <20190608191958.4593-3-rohit.ashiwal265@gmail.com>

On 06/09, Rohit Ashiwal wrote:
> git am or rebase advise the user to use `git (am | rebase) --skip` to
> skip the commit. cherry-pick and revert also have this concept of
> skipping commits but they advise the user to use `git reset` (or in
> case of a patch which had conflicts, `git reset --merge`) which on the
> user's part is annoying and sometimes confusing. Add a `--skip` option
> to make these commands more consistent.

Something I missed in the off-list review for this PR:  I think this
commit message is a bit heavy on the advice part, rather than on the
real advantage the --skip flag brings, which is that it's less
cumbersome for the user to skip a commit, and brings consistency to
the commands.  Maybe something like:

        git am or rebase have a --skip flag to skip the current commit if
        the user wishes to do so.  During a cherry-pick or revert a user
        could likewise skip a commit, but needs to use 'git reset' (or in
        the case of conflicts 'git reset --merge'), followed by 'git
        (cherry-pick | revert) --continue' to skip the commit.  This is
        more annoying and sometimes confusing on the users part.  Add a
        `--skip` option to make skipping commits easier for the user and
        to make the commands more consistent.

> In the next commit, we will change the advice messages hence finishing
> the process of teaching revert and cherry-pick "how to skip commits".
> 
> Signed-off-by: Rohit Ashiwal <rohit.ashiwal265@gmail.com>
> ---
>  Documentation/git-cherry-pick.txt |  4 +-
>  Documentation/git-revert.txt      |  4 +-
>  Documentation/sequencer.txt       |  4 ++
>  builtin/revert.c                  |  5 +++
>  sequencer.c                       | 23 +++++++++++
>  sequencer.h                       |  1 +
>  t/t3510-cherry-pick-sequence.sh   | 63 +++++++++++++++++++++++++++++++
>  7 files changed, 98 insertions(+), 6 deletions(-)
> 
> diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt
> index 754b16ce0c..955880ab88 100644
> --- a/Documentation/git-cherry-pick.txt
> +++ b/Documentation/git-cherry-pick.txt
> @@ -10,9 +10,7 @@ SYNOPSIS
>  [verse]
>  'git cherry-pick' [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]
>  		  [-S[<keyid>]] <commit>...
> -'git cherry-pick' --continue
> -'git cherry-pick' --quit
> -'git cherry-pick' --abort
> +'git cherry-pick' --continue | --skip | --abort | --quit
>  
>  DESCRIPTION
>  -----------
> diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt
> index 0c82ca5bc0..ffce98099c 100644
> --- a/Documentation/git-revert.txt
> +++ b/Documentation/git-revert.txt
> @@ -9,9 +9,7 @@ SYNOPSIS
>  --------
>  [verse]
>  'git revert' [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>...
> -'git revert' --continue
> -'git revert' --quit
> -'git revert' --abort
> +'git revert' --continue | --skip | --abort | --quit
>  
>  DESCRIPTION
>  -----------
> diff --git a/Documentation/sequencer.txt b/Documentation/sequencer.txt
> index 5a57c4a407..3bceb56474 100644
> --- a/Documentation/sequencer.txt
> +++ b/Documentation/sequencer.txt
> @@ -3,6 +3,10 @@
>  	`.git/sequencer`.  Can be used to continue after resolving
>  	conflicts in a failed cherry-pick or revert.
>  
> +--skip::
> +	Skip the current commit and continue with the rest of the
> +	sequence.
> +
>  --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 d4dcedbdc6..5dc5891ea2 100644
> --- a/builtin/revert.c
> +++ b/builtin/revert.c
> @@ -102,6 +102,7 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)
>  		OPT_CMDMODE(0, "quit", &cmd, N_("end revert or cherry-pick sequence"), 'q'),
>  		OPT_CMDMODE(0, "continue", &cmd, N_("resume revert or cherry-pick sequence"), 'c'),
>  		OPT_CMDMODE(0, "abort", &cmd, N_("cancel revert or cherry-pick sequence"), 'a'),
> +		OPT_CMDMODE(0, "skip", &cmd, N_("skip current commit and continue"), 's'),
>  		OPT_CLEANUP(&cleanup_arg),
>  		OPT_BOOL('n', "no-commit", &opts->no_commit, N_("don't automatically commit")),
>  		OPT_BOOL('e', "edit", &opts->edit, N_("edit the commit message")),
> @@ -151,6 +152,8 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)
>  			this_operation = "--quit";
>  		else if (cmd == 'c')
>  			this_operation = "--continue";
> +		else if (cmd == 's')
> +			this_operation = "--skip";
>  		else {
>  			assert(cmd == 'a');
>  			this_operation = "--abort";
> @@ -210,6 +213,8 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)
>  		return sequencer_continue(the_repository, opts);
>  	if (cmd == 'a')
>  		return sequencer_rollback(the_repository, opts);
> +	if (cmd == 's')
> +		return sequencer_skip(the_repository, opts);
>  	return sequencer_pick_revisions(the_repository, opts);
>  }
>  
> diff --git a/sequencer.c b/sequencer.c
> index 9c561a041b..f586e677d3 100644
> --- a/sequencer.c
> +++ b/sequencer.c
> @@ -2784,6 +2784,29 @@ int sequencer_rollback(struct repository *r, struct replay_opts *opts)
>  	return -1;
>  }
>  
> +int sequencer_skip(struct repository *r, struct replay_opts *opts)
> +{
> +	switch (opts->action) {
> +	case REPLAY_REVERT:
> +		if (!file_exists(git_path_revert_head(r)))
> +			return error(_("no revert in progress"));
> +		break;
> +	case REPLAY_PICK:
> +		if (!file_exists(git_path_cherry_pick_head(r)))
> +			return error(_("no cherry-pick in progress"));
> +		break;

I see that in some cases (e.g 'rollback_single_pick'), we just check
if either REVERT_HEAD or CHERRY_PICK_HEAD exist, but would allow the
"wrong" command to be used, e.g. 'git revert --abort' when a
cherry-pick is in progress.  This helps avoiding that, good!

> +	default:
> +		BUG("the control must not reach here.");

We don't support rebase in 'sequencer_skip' yet, makes sense as this
patch is focused on cherry-pick and revert.  There's nothing
preventing supporting that in the future though.

> +	}
> +
> +	if (rollback_single_pick(r))
> +		return error(_("failed to skip the commit"));
> +	if (!is_directory(git_path_seq_dir()))
> +		return 0;

If there's no sequencer directory, we don't need to continue the
cherry-pick/revert, as there's nothing left to do.  Otherwise we
continue.  Good.

So this looks good to me.

> +
> +	return sequencer_continue(r, opts);
> +}
> +
>  static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
>  {
>  	struct lock_file todo_lock = LOCK_INIT;
> diff --git a/sequencer.h b/sequencer.h
> index 0c494b83d4..731b9853eb 100644
> --- a/sequencer.h
> +++ b/sequencer.h
> @@ -129,6 +129,7 @@ int sequencer_pick_revisions(struct repository *repo,
>  			     struct replay_opts *opts);
>  int sequencer_continue(struct repository *repo, struct replay_opts *opts);
>  int sequencer_rollback(struct repository *repo, struct replay_opts *opts);
> +int sequencer_skip(struct repository *repo, struct replay_opts *opts);
>  int sequencer_remove_state(struct replay_opts *opts);
>  
>  #define TODO_LIST_KEEP_EMPTY (1U << 0)
> diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh
> index 941d5026da..48cc9f13ee 100755
> --- a/t/t3510-cherry-pick-sequence.sh
> +++ b/t/t3510-cherry-pick-sequence.sh
> @@ -93,6 +93,69 @@ test_expect_success 'cherry-pick cleans up sequencer state upon success' '
>  	test_path_is_missing .git/sequencer
>  '
>  
> +test_expect_success 'cherry-pick --skip requires cherry-pick in progress' '
> +	pristine_detach initial &&
> +	test_must_fail git cherry-pick --skip
> +'
> +
> +test_expect_success 'revert --skip requires revert in progress' '
> +	pristine_detach initial &&
> +	test_must_fail git revert --skip
> +'
> +
> +test_expect_success 'cherry-pick --skip to skip commit' '
> +	pristine_detach initial &&
> +	test_must_fail git cherry-pick anotherpick &&
> +	test_must_fail git revert --skip &&
> +	git cherry-pick --skip &&
> +	test_cmp_rev initial HEAD &&
> +	test_path_is_missing .git/CHERRY_PICK_HEAD
> +'
> +
> +test_expect_success 'revert --skip to skip commit' '
> +	pristine_detach anotherpick &&
> +	test_must_fail git revert anotherpick~1 &&
> +	test_must_fail git cherry-pick --skip &&
> +	git revert --skip &&
> +	test_cmp_rev anotherpick HEAD
> +'
> +
> +test_expect_success 'skip "empty" commit' '
> +	pristine_detach picked &&
> +	test_commit dummy foo d &&
> +	test_must_fail git cherry-pick anotherpick &&
> +	git cherry-pick --skip &&
> +	test_cmp_rev dummy HEAD
> +'
> +
> +test_expect_success 'skip a commit and check if rest of sequence is correct' '
> +	pristine_detach initial &&
> +	echo e >expect &&
> +	cat >expect.log <<-EOF &&
> +	OBJID
> +	:100644 100644 OBJID OBJID M	foo
> +	OBJID
> +	:100644 100644 OBJID OBJID M	foo
> +	OBJID
> +	:100644 100644 OBJID OBJID M	unrelated
> +	OBJID
> +	:000000 100644 OBJID OBJID A	foo
> +	:000000 100644 OBJID OBJID A	unrelated
> +	EOF
> +	test_must_fail git cherry-pick base..yetanotherpick &&
> +	test_must_fail git cherry-pick --skip &&
> +	echo d >foo &&
> +	git add foo &&
> +	git cherry-pick --continue &&
> +	{
> +		git rev-list HEAD |
> +		git diff-tree --root --stdin |
> +		sed "s/$OID_REGEX/OBJID/g"
> +	} >actual.log &&
> +	test_cmp expect foo &&
> +	test_cmp expect.log actual.log
> +'
> +
>  test_expect_success '--quit does not complain when no cherry-pick is in progress' '
>  	pristine_detach initial &&
>  	git cherry-pick --quit
> -- 
> 2.21.0
> 

  reply	other threads:[~2019-06-09  8:37 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-08 19:19 [GSoC][PATCH 0/3] Teach cherry-pick/revert to skip commits Rohit Ashiwal
2019-06-08 19:19 ` [GSoC][PATCH 1/3] sequencer: add advice for revert Rohit Ashiwal
2019-06-09 17:52   ` Phillip Wood
2019-06-10  5:13     ` Rohit Ashiwal
2019-06-10 10:39       ` Phillip Wood
2019-06-10 13:25         ` Rohit Ashiwal
2019-06-10 17:46           ` Phillip Wood
2019-06-10 16:34         ` Junio C Hamano
2019-06-08 19:19 ` [GSoC][PATCH 2/3] cherry-pick/revert: add --skip option Rohit Ashiwal
2019-06-09  8:37   ` Thomas Gummerer [this message]
2019-06-09 18:01   ` Phillip Wood
2019-06-10  5:57     ` Rohit Ashiwal
2019-06-10 10:40       ` Phillip Wood
2019-06-10 13:43         ` Rohit Ashiwal
2019-06-10 17:47           ` Phillip Wood
2019-06-08 19:19 ` [GSoC][PATCH 3/3] cherry-pick/revert: update hints Rohit Ashiwal
2019-06-09  8:42   ` Thomas Gummerer
2019-06-09 18:03   ` Phillip Wood
2019-06-10  5:28     ` Rohit Ashiwal
2019-06-10 10:40       ` Phillip Wood
2019-06-10 13:33         ` Rohit Ashiwal
2019-06-10 17:47           ` Phillip Wood
2019-06-09  9:02 ` [GSoC][PATCH 0/3] Teach cherry-pick/revert to skip commits Thomas Gummerer
2019-06-09 10:06   ` Rohit Ashiwal
2019-06-09 20:00     ` Thomas Gummerer
2019-06-11  7:31 ` [GSoC][PATCH v2 " Rohit Ashiwal
2019-06-11  7:31   ` [GSoC][PATCH v2 1/3] sequencer: add advice for revert Rohit Ashiwal
2019-06-11 21:25     ` Junio C Hamano
2019-06-11  7:31   ` [GSoC][PATCH v2 2/3] cherry-pick/revert: add --skip option Rohit Ashiwal
2019-06-12 13:31     ` Phillip Wood
2019-06-12 18:11       ` Junio C Hamano
2019-06-12 18:57         ` Phillip Wood
2019-06-11  7:31   ` [GSoC][PATCH v2 3/3] cherry-pick/revert: advise using --skip Rohit Ashiwal
2019-06-12 15:16     ` Phillip Wood
2019-06-13  4:05 ` [GSoC][PATCH v3 0/3] Teach cherry-pick/revert to skip commits Rohit Ashiwal
2019-06-13  4:05   ` [GSoC][PATCH v3 1/3] sequencer: add advice for revert Rohit Ashiwal
2019-06-13 17:45     ` Phillip Wood
2019-06-13 19:21       ` Martin Ågren
2019-06-13 20:59         ` Junio C Hamano
2019-06-14  3:44         ` Rohit Ashiwal
2019-06-14  3:43       ` Rohit Ashiwal
2019-06-13  4:05   ` [GSoC][PATCH v3 2/3] cherry-pick/revert: add --skip option Rohit Ashiwal
2019-06-13 17:56     ` Junio C Hamano
2019-06-13 19:57       ` Junio C Hamano
2019-06-14  3:48         ` Rohit Ashiwal
2019-06-14  3:45       ` Rohit Ashiwal
2019-06-14 15:58         ` Junio C Hamano
2019-06-16  7:03       ` Rohit Ashiwal
2019-06-13 17:59     ` Phillip Wood
2019-06-13  4:05   ` [GSoC][PATCH v3 3/3] cherry-pick/revert: advise using --skip Rohit Ashiwal
2019-06-16  8:20 ` [GSoC][PATCH v4 0/4] [GSoC][PATCH 0/3] Teach cherry-pick/revert to skip commits Rohit Ashiwal
2019-06-16  8:20   ` [GSoC][PATCH v4 1/4] sequencer: add advice for revert Rohit Ashiwal
2019-06-17  5:51     ` Thomas Gummerer
2019-06-16  8:20   ` [GSoC][PATCH v4 2/4] sequencer: rename reset_for_rollback to reset_merge Rohit Ashiwal
2019-06-16  8:20   ` [GSoC][PATCH v4 3/4] cherry-pick/revert: add --skip option Rohit Ashiwal
2019-06-17  8:30     ` Thomas Gummerer
2019-06-16  8:20   ` [GSoC][PATCH v4 4/4] cherry-pick/revert: advise using --skip Rohit Ashiwal
2019-06-17  8:39   ` [GSoC][PATCH v4 0/4] [GSoC][PATCH 0/3] Teach cherry-pick/revert to skip commits Thomas Gummerer
2019-06-18 17:06 ` [GSoC][PATCH v5 0/5] " Rohit Ashiwal
2019-06-18 17:06   ` [GSoC][PATCH v5 1/5] sequencer: add advice for revert Rohit Ashiwal
2019-06-18 17:06   ` [GSoC][PATCH v5 2/5] sequencer: rename reset_for_rollback to reset_merge Rohit Ashiwal
2019-06-18 17:06   ` [GSoC][PATCH v5 3/5] sequencer: use argv_array in reset_merge Rohit Ashiwal
2019-06-18 17:06   ` [GSoC][PATCH v5 4/5] cherry-pick/revert: add --skip option Rohit Ashiwal
2019-06-20  3:40     ` Junio C Hamano
2019-06-20  9:46       ` Rohit Ashiwal
2019-06-20  9:57       ` Phillip Wood
2019-06-20 20:09         ` Junio C Hamano
2019-06-20 10:02     ` Phillip Wood
2019-06-20 10:34       ` Rohit Ashiwal
2019-06-20 11:42         ` Phillip Wood
2019-06-21  7:47           ` Rohit Ashiwal
2019-06-18 17:06   ` [GSoC][PATCH v5 5/5] cherry-pick/revert: advise using --skip Rohit Ashiwal
2019-06-21  9:17 ` [GSoC][PATCH v6 0/5] Teach cherry-pick/revert to skip commits Rohit Ashiwal
2019-06-21  9:17   ` [GSoC][PATCH v6 1/5] sequencer: add advice for revert Rohit Ashiwal
2019-06-21  9:17   ` [GSoC][PATCH v6 2/5] sequencer: rename reset_for_rollback to reset_merge Rohit Ashiwal
2019-06-21  9:17   ` [GSoC][PATCH v6 3/5] sequencer: use argv_array in reset_merge Rohit Ashiwal
2019-06-21  9:17   ` [GSoC][PATCH v6 4/5] cherry-pick/revert: add --skip option Rohit Ashiwal
2019-06-21  9:18   ` [GSoC][PATCH v6 5/5] cherry-pick/revert: advise using --skip Rohit Ashiwal
2019-06-21 19:09   ` [GSoC][PATCH v6 0/5] Teach cherry-pick/revert to skip commits Junio C Hamano
2019-06-23 20:03 ` [GSoC][PATCH v7 0/6] " Rohit Ashiwal
2019-06-23 20:03   ` [GSoC][PATCH v7 1/6] advice: add sequencerInUse config variable Rohit Ashiwal
2019-06-25  9:18     ` Thomas Gummerer
2019-06-23 20:03   ` [GSoC][PATCH v7 2/6] sequencer: add advice for revert Rohit Ashiwal
2019-06-29 14:05     ` Phillip Wood
2019-06-23 20:03   ` [GSoC][PATCH v7 3/6] sequencer: rename reset_for_rollback to reset_merge Rohit Ashiwal
2019-06-23 20:03   ` [GSoC][PATCH v7 4/6] sequencer: use argv_array in reset_merge Rohit Ashiwal
2019-06-23 20:03   ` [GSoC][PATCH v7 5/6] cherry-pick/revert: add --skip option Rohit Ashiwal
2019-06-23 20:03   ` [GSoC][PATCH v7 6/6] cherry-pick/revert: advise using --skip Rohit Ashiwal
2019-07-02  9:11 ` [GSoC][PATCH v8 0/5] Teach cherry-pick/revert to skip commits Rohit Ashiwal
2019-07-02  9:11   ` [GSoC][PATCH v8 1/5] sequencer: add advice for revert Rohit Ashiwal
2019-07-02  9:11   ` [GSoC][PATCH v8 2/5] sequencer: rename reset_for_rollback to reset_merge Rohit Ashiwal
2019-07-02  9:11   ` [GSoC][PATCH v8 3/5] sequencer: use argv_array in reset_merge Rohit Ashiwal
2019-07-02  9:11   ` [GSoC][PATCH v8 4/5] cherry-pick/revert: add --skip option Rohit Ashiwal
2019-07-02  9:11   ` [GSoC][PATCH v8 5/5] cherry-pick/revert: advise using --skip Rohit Ashiwal
2019-07-02 15:26   ` [GSoC][PATCH v8 0/5] Teach cherry-pick/revert to skip commits Phillip Wood

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=20190609083708.GA28007@hank.intra.tgummerer.com \
    --to=t.gummerer@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=newren@gmail.com \
    --cc=rohit.ashiwal265@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.