git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 02/13] revert: Factor out add_message_to_msg function

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 21, 2011, 19:01 UTC
Message-ID
<7vmxhb80vp.fsf@alter.siamese.dyndns.org>
In-Reply-To
<20110621155836.GG15461@elie>
Jonathan Nieder <jrnieder@gmail.com> writes:
Show 9 quoted lines
>> The add_message_to_msg function is poorly implemented, has an unclear
>> API, and only one callsite.  Replace the callsite with a cleaner
>> implementation.
>
> The above does not answer the question I would have, namely what
> exactly is wrong with add_message_to_msg.  Is it too slow?  Not
> robust?  Is the generated assembly too long?  Is it hard for a reader
> to figure out the intent?  Does it blend in poorly with its
> surroundings?
I do not know if I _suggested_ this, but ...
Show 13 quoted lines
> diff --git a/builtin/revert.c b/builtin/revert.c
> index 1f27c63..d6d2356 100644
> --- a/builtin/revert.c
> +++ b/builtin/revert.c
> @@ -185,19 +185,6 @@ static char *get_encoding(const char *message)
>  	return NULL;
>  }
>  
> -static void add_message_to_msg(struct strbuf *msgbuf, const char *message)
> -{
> -	const char *p = message;
> -	while (*p && (*p != '\n' || p[1] != '\n'))
> -		p++;

This is a loop that manually implements strstr("\n\n"); rewriting of which is a Good Thing.

Show 5 quoted lines
> -	if (!*p)
> -		strbuf_addstr(msgbuf, sha1_to_hex(commit->object.sha1));
> -
> -	p += 2;
> -	strbuf_addstr(msgbuf, p);

I am not sure if this corresponds to what the new code does. What happens if *p was NUL (i.e. we did not find any "\n\n" in the "message" at all)? We go two bytes beyond that NUL and run addstr from that unknown space? The new code does not seem to do that ;-)

I suspect that this was a bug from the original C-rewrite of git-revert that was done by 9509af6 (Make git-revert & git-cherry-pick a builtin, 2007-03-01), and the new code fixes the bug, but then it would be nice to note that in the commit log message.

Show 13 quoted lines
> @@ -471,11 +458,17 @@ static int do_pick_commit(void)
>  		}
>  		strbuf_addstr(&msgbuf, ".\n");
>  	} else {
> +		const char *p = strstr(msg.message, "\n\n");
> +
>  		base = parent;
>  		base_label = msg.parent_label;
>  		next = commit;
>  		next_label = msg.label;
> -		add_message_to_msg(&msgbuf, msg.message);
> +
> +		/* Add msg.message to msgbuf */
This is an incorrect comment that confuses the reader. Think:
 - What did you skip by looking for the first "\n\n"?
 - What do you instead when no such "\n\n" is found?

Perhaps what it is doing is: "Add commit log message, if exists, or the commit object name if it doesn't"

Show 6 quoted lines
> +		p = p ? p + 2 : sha1_to_hex(commit->object.sha1);
> +		strbuf_addstr(&msgbuf, p);
> +
>  		if (no_replay) {
>  			strbuf_addstr(&msgbuf, "(cherry picked from commit ");
>  			strbuf_addstr(&msgbuf, sha1_to_hex(commit->object.sha1));
Previous: Jonathan NiederNext: Ramkumar Ramachandra
Message 9 of 47 in “Sequencer with continuation features”
  1. 00/13 Sequencer with continuation featuresRamkumar Ramachandra, Jun 21, 2011
  2. 01/13 advice: Introduce error_resolve_conflictRamkumar Ramachandra, Jun 21, 2011
  3. Jonathan NiederJun 21, 2011
  4. Junio C HamanoJun 21, 2011
  5. Ramkumar RamachandraJul 2, 2011
  6. Jonathan NiederJul 2, 2011
  7. 02/13 revert: Factor out add_message_to_msg functionRamkumar Ramachandra, Jun 21, 2011
  8. Jonathan NiederJun 21, 2011
  9. Junio C HamanoJun 21, 2011
  10. 03/13 revert: Don't check lone argument in get_encodingRamkumar Ramachandra, Jun 21, 2011
  11. Jonathan NiederJun 21, 2011
  12. 04/13 revert: Propogate errors upwards from do_pick_commitRamkumar Ramachandra, Jun 21, 2011
  13. Jonathan NiederJun 21, 2011
  14. Junio C HamanoJun 21, 2011
  15. Jonathan NiederJun 21, 2011
  16. Junio C HamanoJun 21, 2011
  17. Ramkumar RamachandraJul 2, 2011
  18. 05/13 revert: Eliminate global "commit" variableRamkumar Ramachandra, Jun 21, 2011
  19. Jonathan NiederJun 21, 2011
  20. Junio C HamanoJun 21, 2011
  21. 06/13 revert: Rename no_replay to record_originRamkumar Ramachandra, Jun 21, 2011
  22. 07/13 revert: Introduce struct to keep command-line optionsRamkumar Ramachandra, Jun 21, 2011
  23. Jonathan NiederJun 21, 2011
  24. Junio C HamanoJun 21, 2011
  25. 08/13 revert: Separate cmdline parsing from functional codeRamkumar Ramachandra, Jun 21, 2011
  26. Jonathan NiederJun 21, 2011
  27. 09/13 revert: Catch incompatible command-line options earlyRamkumar Ramachandra, Jun 21, 2011
  28. Jonathan NiederJun 21, 2011
  29. Ramkumar RamachandraJul 2, 2011
  30. Jonathan NiederJul 2, 2011
  31. Jonathan NiederJul 2, 2011
  32. Ramkumar RamachandraJul 2, 2011
  33. Jonathan NiederJul 2, 2011
  34. Jonathan NiederJul 2, 2011
  35. 10/13 revert: Persist data for continuationRamkumar Ramachandra, Jun 21, 2011
  36. Jonathan NiederJun 21, 2011
  37. Junio C HamanoJun 21, 2011
  38. 11/13 revert: Introduce a layer of indirection over pick_commitsRamkumar Ramachandra, Jun 21, 2011
  39. Junio C HamanoJun 21, 2011
  40. 12/13 revert: Introduce skip-all to cleanup sequencer dataRamkumar Ramachandra, Jun 21, 2011
  41. Junio C HamanoJun 21, 2011
  42. Ramkumar RamachandraJul 2, 2011
  43. Miles BaderJul 4, 2011
  44. Ramkumar RamachandraJul 5, 2011
  45. 13/13 revert: Introduce --continue to continue the operationRamkumar Ramachandra, Jun 21, 2011
  46. Jonathan NiederJun 21, 2011
  47. Jonathan NiederJun 21, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.