git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Phillip Wood <phillip.wood123@gmail.com>
To: Philippe Blain <levraiphilippeblain@gmail.com>,
	Josh Steadmon <steadmon@google.com>,
	git@vger.kernel.org
Cc: gitster@pobox.com
Subject: Re: [PATCH v2] sequencer: advise if skipping cherry-picked commit
Date: Wed, 18 Aug 2021 11:02:12 +0100	[thread overview]
Message-ID: <e363df27-a99e-1a43-f493-ed90de7b6363@gmail.com> (raw)
In-Reply-To: <c185a396-c498-b2ef-1c86-cec7d5751f3d@gmail.com>

On 12/08/2021 18:45, Philippe Blain wrote:
> Hi Josh,
> [...]
>> diff --git a/sequencer.c b/sequencer.c
>> index 7f07cd00f3..1235f61c9d 100644
>> --- a/sequencer.c
>> +++ b/sequencer.c
>> @@ -5099,6 +5099,7 @@ static int make_script_with_merges(struct 
>> pretty_print_context *pp,
>>       int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
>>       int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
>>       int root_with_onto = flags & TODO_LIST_ROOT_WITH_ONTO;
>> +    int skipped_commit = 0;
>>       struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
>>       struct strbuf label = STRBUF_INIT;
>>       struct commit_list *commits = NULL, **tail = &commits, *iter;
>> @@ -5149,8 +5150,13 @@ static int make_script_with_merges(struct 
>> pretty_print_context *pp,
>>           oidset_insert(&interesting, &commit->object.oid);
>>           is_empty = is_original_commit_empty(commit);
>> -        if (!is_empty && (commit->object.flags & PATCHSAME))
>> +        if (!is_empty && (commit->object.flags & PATCHSAME)) {
>> +            advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS,
>> +                    _("skipped previously applied commit %s"),
>> +                    short_commit_name(commit));
>> +            skipped_commit = 1;
>>               continue;
>> +        }
>>           if (is_empty && !keep_empty)
>>               continue;
> 
> For interactive rebase, an alternate implementation, that I suggested in 
> [1] last summer, would be to keep
> the cherry-picks in the todo list, but mark them as 'drop' and add a 
> comment at the
> end of their line, like '# already applied' or something like this, similar
> to how empty commits have '# empty' appended. I think that for 
> interactive rebase, I
> would prefer this, since it is easier for the user to notice it and 
> change the 'drop'
> to 'pick' right away if they realise they do not want to drop those 
> commits (easier
> than seeing the warning, realising they did not want to drop them, 
> aborting the rebase
> and redoing it with '--reapply-cherry-picks').

That would be nice, but we could always add it in the future if Josh 
does not want to implement it now. At the moment the function that 
creates the todo list does not know if it is going to be edited, I'm not 
sure how easy it would be to pass that information down.

> For non-interactive rebase adding a warning/advice like your patch does 
> seems to
> be a good solution.
> 
>> @@ -5214,6 +5220,9 @@ static int make_script_with_merges(struct 
>> pretty_print_context *pp,
>>           oidcpy(&entry->entry.oid, &commit->object.oid);
>>           oidmap_put(&commit2todo, entry);
>>       }
>> +    if (skipped_commit)
>> +        advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS,
>> +                  _("use --reapply-cherry-picks to include skipped 
>> commits"));
>>       /*
>>        * Second phase:
>> @@ -5334,6 +5343,7 @@ int sequencer_make_script(struct repository *r, 
>> struct strbuf *out, int argc,
>>       const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : 
>> "pick";
>>       int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
>>       int reapply_cherry_picks = flags & TODO_LIST_REAPPLY_CHERRY_PICKS;
>> +    int skipped_commit = 0;
>>       repo_init_revisions(r, &revs, NULL);
>>       revs.verbose_header = 1;
>> @@ -5369,8 +5379,13 @@ int sequencer_make_script(struct repository *r, 
>> struct strbuf *out, int argc,
>>       while ((commit = get_revision(&revs))) {
>>           int is_empty = is_original_commit_empty(commit);
>> -        if (!is_empty && (commit->object.flags & PATCHSAME))
>> +        if (!is_empty && (commit->object.flags & PATCHSAME)) {
>> +            advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS,
>> +                      _("skipped previously applied commit %s"),
>> +                      short_commit_name(commit));
>> +            skipped_commit = 1;
>>               continue;
>> +        }
>>           if (is_empty && !keep_empty)
>>               continue;
>>           strbuf_addf(out, "%s %s ", insn,
>> @@ -5380,6 +5395,9 @@ int sequencer_make_script(struct repository *r, 
>> struct strbuf *out, int argc,
>>               strbuf_addf(out, " %c empty", comment_line_char);
>>           strbuf_addch(out, '\n');
>>       }
>> +    if (skipped_commit)
>> +        advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS,
>> +                  _("use --reapply-cherry-picks to include skipped 
>> commits"));
>>       return 0;
>>   }
>>
> 
> Like Junio remarked, it is a little unfortunate that some logic is 
> duplicated between
> 'sequencer_make_script' and 'make_script_with_merges', such that your 
> patch has to do
> the same thing at two different code locations. Maybe a preparatory 
> cleanup could add
> a new function that takes care of the duplicated logic and call if from 
> both ? I'm
> just thinking out loud here, I did not analyze in details if this would 
> be easy/feasible...

I think feasible but not easy (or required for this change), it would 
also complicate the code in a different way as I think we'd have to add 
some conditionals for whether we are recreating merges or not.

Best Wishes

Phillip


> Thanks for suggesting this change,
> 
> Philippe.
> 
> 
> [1] 
> https://lore.kernel.org/git/0EA8C067-5805-40A7-857A-55C2633B8570@gmail.com/


  parent reply	other threads:[~2021-08-18 10:02 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-04 20:53 [RFC PATCH] sequencer: warn on skipping previously seen commit Josh Steadmon
2021-08-04 21:28 ` Junio C Hamano
2021-08-05 10:13   ` Phillip Wood
2021-08-05 16:30     ` Junio C Hamano
2021-08-10 19:20 ` [PATCH v2] sequencer: advise if skipping cherry-picked commit Josh Steadmon
2021-08-10 22:33   ` Junio C Hamano
2021-08-18 10:08     ` Phillip Wood
2021-08-30 21:19     ` Josh Steadmon
2021-08-12 17:45   ` Philippe Blain
2021-08-12 19:13     ` Junio C Hamano
2021-08-18 10:02     ` Phillip Wood [this message]
2021-08-18 22:45       ` Philippe Blain
2021-08-19 10:04         ` Phillip Wood
2021-08-30 21:21     ` Josh Steadmon
2021-08-25 19:40   ` Junio C Hamano
2021-08-30 21:46 ` [PATCH v3] " Josh Steadmon
2021-08-30 22:21   ` Junio C Hamano
2021-08-30 23:40     ` 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=e363df27-a99e-1a43-f493-ed90de7b6363@gmail.com \
    --to=phillip.wood123@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=levraiphilippeblain@gmail.com \
    --cc=phillip.wood@dunelm.org.uk \
    --cc=steadmon@google.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 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).