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; + + 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'"); + 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"), OPT_END() }; @@ -351,6 +398,15 @@ int cmd_notes(int argc, const char **argv, const char *prefix) if (copy) { const char *from_ref; + if (stdin) { + 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); -- 1.7.0.224.g30f23.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html