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

Re: [PATCH] WIP: git notes copy --stdin

From
Johan Herland <johan@herland.net>
Date
Feb 15, 2010, 01:25 UTC
Message-ID
<201002150225.52953.johan@herland.net>
In-Reply-To
<0b241a335d71bdf56a07a712cb5506e1b1e1db6f.1266183704.git.trast@student.ethz.ch>
On Sunday 14 February 2010, Thomas Rast wrote:
Show 34 quoted lines
> This implements a 'git notes copy --stdin' mode suitable to read the
> data fed to the post-rewrite hook.
> ---
> 
> Ok, so I changed my mind and decided to implement the "make it
> built-in and configurable" way.  This helper should work.  I spent
> some time trying to refactor cmd_notes() into something that can
> nicely handle commands that do not fit the normal scheme, but
> eventually was too tired to continue and just crafted it in the
> existing code in the right place.
> 
> If nobody beats me to it I'll pick this up later this week, but
> tomorrow will be too busy to even think about it.
> 
> 
>  builtin-notes.c |   56
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed,
> 56 insertions(+), 0 deletions(-)
> 
> diff --git a/builtin-notes.c b/builtin-notes.c
> index 123ecad..3cd9e45 100644
> --- a/builtin-notes.c
> +++ b/builtin-notes.c
> @@ -278,6 +278,52 @@ int commit_notes(struct notes_tree *t, const char
> *msg) return 0;
>  }
> 
> +int notes_copy_from_stdin(int force)
> +{
> +	struct strbuf buf = STRBUF_INIT;
> +	struct notes_tree *t;
> +
> +	init_notes(NULL, NULL, NULL, 0);
> +	t = &default_notes_tree;

As you say, cmd_notes() should be refactored, so that you don't have to duplicate all of this (and some of the below stuff).

Show 35 quoted lines
> +	while (strbuf_getline(&buf, stdin, '\n') != EOF) {
> +		unsigned char from_obj[20], to_obj[20];
> +		struct strbuf **split;
> +		const unsigned char *note;
> +
> +		split = strbuf_split(&buf, ' ');
> +		if (!split[0] || !split[1])
> +			die("Malformed input line: '%s'.", buf.buf);
> +		strbuf_rtrim(split[0]);
> +		strbuf_rtrim(split[1]);
> +		if (get_sha1(split[0]->buf, from_obj))
> +			die("Failed to resolve '%s' as a valid ref.", split[0]->buf);
> +		if (get_sha1(split[1]->buf, to_obj))
> +			die("Failed to resolve '%s' as a valid ref.", split[1]->buf);
> +
> +		note = get_note(t, from_obj);
> +		if (!force) {
> +			const unsigned char *existing_note = get_note(t, to_obj);
> +			if (existing_note) {
> +				error("Cannot copy notes. Found existing notes for object"
> +				      " %s. Use '-f' to overwrite existing notes",
> +				      sha1_to_hex(to_obj));
> +				return 1;
> +			}
> +		}
> +
> +		if (note)
> +			add_note(t, to_obj, note, combine_notes_overwrite);
> +		else
> +			remove_note(t, to_obj);
> +
> +		strbuf_list_free(split);
> +	}
> +
> +	commit_notes(t, "Notes added by 'git notes copy'");

We (this goes for the existing commit_notes() call in cmd_notes() as well) should either check the return value for commit_notes(), or (since it currently only returns 0) we should change commit_notes() to void instead of int. Actually, the correct solution is probably to "return error()" instead of "die()" inside commit_notes(), and then check the return value.

Show 11 quoted lines
> +	return 0;
> +}
> +
>  int cmd_notes(int argc, const char **argv, const char *prefix)
>  {
>  	struct notes_tree *t;
> @@ -301,6 +347,7 @@ int cmd_notes(int argc, const char **argv, const char
> *prefix) OPT_CALLBACK('C', "reuse-message", &msg, "OBJECT",
>  			   "reuse specified note object", parse_reuse_arg),
>  		OPT_BOOLEAN('f', "force", &force, "replace existing notes"),
> +		OPT_BOOLEAN(0, "stdin", &force, "read objects from stdin"),
Why are you setting &force from "--stdin"?
Show 6 quoted lines
> @@ -351,6 +398,15 @@ int cmd_notes(int argc, const char **argv, const
> char *prefix)
> 
>  	if (copy) {
>  		const char *from_ref;
> +		if (stdin) {

I don't think this is intended. Isn't stdin (the standard input FILE *) _always_ true?

Show 11 quoted lines
> +			if (argc > 2) {
> +				error("too few parameters");
> +				usage_with_options(git_notes_usage, options);
> +			} else {
> +				retval = notes_copy_from_stdin(force);
> +				goto end;
> +			}
> +		}
>  		if (argc < 3) {
>  			error("too few parameters");
>  			usage_with_options(git_notes_usage, options);

The patch needs to add code that barfs if "--stdin" is used with any subcommand other than "copy".

Of course, the patch also needs documentation and tests, but I guess you knew that... ;)

I like the intent of this patch, although it needs more work before it's finished.

...Johan
-- 
Johan Herland, <johan@herland.net>
www.herland.net
Previous: Thomas RastNext: Thomas Rast
Message 11 of 34 in “post-rewrite hook and copying notes”
  1. 0/6 post-rewrite hook and copying notesThomas Rast, Feb 14, 2010
  2. 1/6 Documentation: document post-rewrite hookThomas Rast, Feb 14, 2010
  3. 2/6 commit --amend: invoke post-rewrite hookThomas Rast, Feb 14, 2010
  4. 3/6 filter-branch: invoke post-rewrite hookThomas Rast, Feb 14, 2010
  5. Johannes SixtFeb 15, 2010
  6. 4/6 rebase: invoke post-rewrite hookThomas Rast, Feb 14, 2010
  7. 5/6 rebase -i: invoke post-rewrite hookThomas Rast, Feb 14, 2010
  8. 6/6 contrib: add a hook that copies notes over rewritesThomas Rast, Feb 14, 2010
  9. Thomas RastFeb 14, 2010
  10. WIP: git notes copy --stdinThomas Rast, Feb 14, 2010
  11. Johan HerlandFeb 15, 2010
  12. 00/11 post-rewrite / automatic notes copyingThomas Rast, Feb 16, 2010
  13. 01/11 Documentation: document post-rewrite hookThomas Rast, Feb 16, 2010
  14. Junio C HamanoFeb 16, 2010
  15. Thomas RastFeb 17, 2010
  16. Junio C HamanoFeb 17, 2010
  17. 02/11 commit --amend: invoke post-rewrite hookThomas Rast, Feb 16, 2010
  18. 03/11 rebase: invoke post-rewrite hookThomas Rast, Feb 16, 2010
  19. 04/11 rebase -i: invoke post-rewrite hookThomas Rast, Feb 16, 2010
  20. 05/11 notes: clean up t3301Thomas Rast, Feb 16, 2010
  21. Junio C HamanoFeb 16, 2010
  22. 06/11 notes: implement 'git notes copy --stdin'Thomas Rast, Feb 16, 2010
  23. 07/11 notes: implement helpers needed for note copying during rewriteThomas Rast, Feb 16, 2010
  24. Junio C HamanoFeb 16, 2010
  25. Thomas RastFeb 17, 2010
  26. Junio C HamanoFeb 17, 2010
  27. Support showing notes from more than one notes treeThomas Rast, Feb 20, 2010
  28. Thomas RastFeb 20, 2010
  29. 08/11 rebase: support automatic notes copyingThomas Rast, Feb 16, 2010
  30. 09/11 commit --amend: copy notes to the new commitThomas Rast, Feb 16, 2010
  31. 10/11 filter-branch: invoke post-rewrite hookThomas Rast, Feb 16, 2010
  32. 11/11 filter-branch: learn how to filter notesThomas Rast, Feb 16, 2010
  33. Johannes SixtFeb 17, 2010
  34. Thomas RastFeb 17, 2010

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.