diff mbox series

Re* [PATCH v3 2/2] doc: revert: add discussion

Message ID xmqq5y5ltqwd.fsf_-_@gitster.g (mailing list archive)
State New, archived
Headers show
Series Re* [PATCH v3 2/2] doc: revert: add discussion | expand

Commit Message

Junio C Hamano Aug. 11, 2023, 5:44 p.m. UTC
Junio C Hamano <gitster@pobox.com> writes:

> Linus Arver <linusa@google.com> writes:
>
>> Oswald Buddenhagen <oswald.buddenhagen@gmx.de> writes:
>>
>>> while thinking about what to write, i came up with an idea for another
>>> improvement: with (implicit) --edit, the template message would end up
>>> being:
>>>
>>>  This reverts commit <sha1>,
>>>  because <PUT REASON HERE>.
>>
>> This sounds great to me.
>
> Oh, absolutely.  I rarely do a revert myself (other than reverting a
> premature merge out of 'next'), but giving a better instruction in
> the commit log editor buffer as template is a very good idea.

It might be just the matter of doing something like the attached
patch on top of Oswald's, reusing the existing code to instruct the
user to describe the reversion.

------- >8 ------------- >8 ------------- >8 ------------- >8 -------
Subject: [PATCH 3/2] revert: force explaining overly complex revert chain

Once we revert reverts of revert and reach "Reapply "Reapply "..."",
it becomes too unweirdly to read a reversion of such a comit.

We instruct the user to explain why the reversion is done in their
own words when using the revert.reference mode, and the instruction
applies equally for such an overly complex revert chain.  The
rationale for such a sequence of events should be recorded to help
future developers.

Building on top of the recent Oswald's work to turn "revert revert"
into "reapply", let's turn the reference mode automatically on in
such a case.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---

 * I left the reference to the second parent to honor the command
   line option and configuration variable even when this new
   mechanism kicks in and this is very much deliberate.  As a commit
   that is a revert (or reapply) should be single parent (because a
   revert of a merge is a single parent commit), the choice does not
   make any difference in practice.

 sequencer.c                   | 16 +++++++++++-----
 t/t3501-revert-cherry-pick.sh | 11 ++++++++++-
 2 files changed, 21 insertions(+), 6 deletions(-)

Comments

Junio C Hamano Aug. 11, 2023, 5:53 p.m. UTC | #1
Junio C Hamano <gitster@pobox.com> writes:

> +
> +		if (starts_with(msg.subject, "Reapply \"Reapply \""))
> +			/* fifth time is too many - force reference format*/
> +			use_reference = 1;

Come to think of it, as the documentation patch in the series cited
double reapply as too unwieldy, we probably should stop before
producing such commit.  We can update "Reapply \"Reapply" above to
"Revert \"Reapply" and then "fifth" -> "fourth".  The test update
below must also be adjusted, if we want to take that route.
Randall S. Becker Aug. 11, 2023, 5:56 p.m. UTC | #2
On Friday, August 11, 2023 1:54 PM, Junio C Hamano wrote:
>Junio C Hamano <gitster@pobox.com> writes:
>
>> +
>> +		if (starts_with(msg.subject, "Reapply \"Reapply \""))
>> +			/* fifth time is too many - force reference format*/
>> +			use_reference = 1;
>
>Come to think of it, as the documentation patch in the series cited double
reapply as
>too unwieldy, we probably should stop before producing such commit.  We can
>update "Reapply \"Reapply" above to "Revert \"Reapply" and then "fifth" ->
"fourth".
>The test update below must also be adjusted, if we want to take that route.

May I suggest a potential quick solution. Perhaps we could leave this up to
users by putting in an --amend or --reword option to cause a prompt for a
comment for the reverted commit instead of trying to come up with a
one-size-fits-all solution.
Eric Sunshine Aug. 11, 2023, 6:16 p.m. UTC | #3
On Fri, Aug 11, 2023 at 2:12 PM Junio C Hamano <gitster@pobox.com> wrote:
> Subject: [PATCH 3/2] revert: force explaining overly complex revert chain
>
> Once we revert reverts of revert and reach "Reapply "Reapply "..."",
> it becomes too unweirdly to read a reversion of such a comit.

s/unweirdly/unwieldy/
s/comit/commit/

> We instruct the user to explain why the reversion is done in their
> own words when using the revert.reference mode, and the instruction
> applies equally for such an overly complex revert chain.  The
> rationale for such a sequence of events should be recorded to help
> future developers.
>
> Building on top of the recent Oswald's work to turn "revert revert"
> into "reapply", let's turn the reference mode automatically on in
> such a case.
>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Oswald Buddenhagen Aug. 11, 2023, 6:16 p.m. UTC | #4
On Fri, Aug 11, 2023 at 10:44:50AM -0700, Junio C Hamano wrote:
>Junio C Hamano <gitster@pobox.com> writes:
>
>> Linus Arver <linusa@google.com> writes:
>>
>>> Oswald Buddenhagen <oswald.buddenhagen@gmx.de> writes:
>>>
>>>> while thinking about what to write, i came up with an idea for another
>>>> improvement: with (implicit) --edit, the template message would end up
>>>> being:
>>>>
>>>>  This reverts commit <sha1>,
>>>>  because <PUT REASON HERE>.
>>>
>>> This sounds great to me.
>>
>> Oh, absolutely.  I rarely do a revert myself (other than reverting a
>> premature merge out of 'next'), but giving a better instruction in
>> the commit log editor buffer as template is a very good idea.
>
>It might be just the matter of doing something like the attached
>patch on top of Oswald's, reusing the existing code to instruct the
>user to describe the reversion.
>
hmm, this seems to be going down a too narrow road - my idea was to make 
this fully orthogonal to reverting reverts in particular (note that i 
attached it to the generic "discussion" patch rather than the "reverts 
of reverts" one).
i didn't think about the integration with existing options yet.

regards
Junio C Hamano Aug. 11, 2023, 7:43 p.m. UTC | #5
Oswald Buddenhagen <oswald.buddenhagen@gmx.de> writes:

> make this fully orthogonal to reverting reverts in particular (note
> that i attached it to the generic "discussion" patch rather than the
> "reverts of reverts" one).

I viewed that as a patch to add "discussion on how to explain
revert" (not necessarily "revert of revert", but how "revert" in
general should be explained).

> i didn't think about the integration with existing options yet.

Now I did ;-).  

The discussion of what the right way to present and justify a revert
was done before, and I think revert.reference and the "--reference"
option came out of it.  It aims the same "do not just describe the
fact what was reverted, but you should explain why" spirit.  While
what I showed in my illustration patch was not meant as "integration
with existing options", it is inevitable that reuse of existing code
that was written earlier for improving the workflow in the same
spirit may get involved.

Perhaps we should also tweak the commit log template to give a
gentle knudge to the user to use revert.reference and then enhance
the help text we give.

Instead of

    Revert "doc: revert: add discussion"

    This reverts commit 7139d1298993b0148ad429cd7cb4824223b7f420.

you may see something along the lines of ...

    # Consider retitling to reflect WHY you are reverting.
    # You may also want to set revert.reference configuration to
    # help encuraging a better title for revert commits.
    Revert "doc: revert: add discussion"

    This reverts commit 7139d1298993b0148ad429cd7cb4824223b7f420
    because <REASON OF REVERSION HERE>

I ran out of time budget for today to think about a topic that is
not releant to the current release, so I'd stop here.

THanks.
diff mbox series

Patch

diff --git c/sequencer.c w/sequencer.c
index 7dc13fdcca..43bb558518 100644
--- c/sequencer.c
+++ w/sequencer.c
@@ -2130,10 +2130,10 @@  static int should_edit(struct replay_opts *opts) {
 	return opts->edit;
 }
 
-static void refer_to_commit(struct replay_opts *opts,
+static void refer_to_commit(int use_reference,
 			    struct strbuf *msgbuf, struct commit *commit)
 {
-	if (opts->commit_use_reference) {
+	if (use_reference) {
 		struct pretty_print_context ctx = {
 			.abbrev = DEFAULT_ABBREV,
 			.date_mode.type = DATE_SHORT,
@@ -2250,12 +2250,18 @@  static int do_pick_commit(struct repository *r,
 
 	if (command == TODO_REVERT) {
 		const char *orig_subject;
+		int use_reference = opts->commit_use_reference;
 
 		base = commit;
 		base_label = msg.label;
 		next = parent;
 		next_label = msg.parent_label;
-		if (opts->commit_use_reference) {
+
+		if (starts_with(msg.subject, "Reapply \"Reapply \""))
+			/* fifth time is too many - force reference format*/
+			use_reference = 1;
+
+		if (use_reference) {
 			strbuf_addstr(&msgbuf,
 				"# *** SAY WHY WE ARE REVERTING ON THE TITLE LINE ***");
 		} else if (skip_prefix(msg.subject, "Revert \"", &orig_subject) &&
@@ -2273,11 +2279,11 @@  static int do_pick_commit(struct repository *r,
 			strbuf_addstr(&msgbuf, "\"");
 		}
 		strbuf_addstr(&msgbuf, "\n\nThis reverts commit ");
-		refer_to_commit(opts, &msgbuf, commit);
+		refer_to_commit(use_reference, &msgbuf, commit);
 
 		if (commit->parents && commit->parents->next) {
 			strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
-			refer_to_commit(opts, &msgbuf, parent);
+			refer_to_commit(opts->commit_use_reference, &msgbuf, parent);
 		}
 		strbuf_addstr(&msgbuf, ".\n");
 	} else {
diff --git c/t/t3501-revert-cherry-pick.sh w/t/t3501-revert-cherry-pick.sh
index 7011e3a421..7a8715d3f4 100755
--- c/t/t3501-revert-cherry-pick.sh
+++ w/t/t3501-revert-cherry-pick.sh
@@ -190,7 +190,16 @@  test_expect_success 'title of fresh reverts' '
 	git revert --no-edit HEAD &&
 	echo "Revert \"Reapply \"B\"\"" >expect &&
 	git log -1 --pretty=%s >actual &&
-	test_cmp expect actual
+	test_cmp expect actual &&
+	git revert --no-edit HEAD &&
+	echo "Reapply \"Reapply \"B\"\"" >expect &&
+	git log -1 --pretty=%s >actual &&
+	test_cmp expect actual &&
+
+	# Give the stronger instruction for unusually complex case
+	git revert --no-edit HEAD &&
+	git log -1 --pretty=%s >actual &&
+	grep -F -e "# *** SAY WHY WE ARE REVERTING" actual
 '
 
 test_expect_success 'title of legacy double revert' '