+
+static int remove_cmd(int argc, const char **argv, const char *prefix)
+{
+ struct option options[] = {
+ OPT_END()
+ };
+ const char *object_ref;
+ struct notes_tree *t;
+ unsigned char object[20];
+
+ argc = parse_options(argc, argv, prefix, options,
+ git_notes_remove_usage, 0);
+
+ if (1 < argc) {
+ error("too many parameters");
+ usage_with_options(git_notes_remove_usage, options);
+ }
+
+ object_ref = argc ? argv[0] : "HEAD";
+
+ if (get_sha1(object_ref, object))
+ die("Failed to resolve '%s' as a valid ref.", object_ref);
+
+ t = init_notes_check("remove");
+
+ fprintf(stderr, "Removing note for object %s\n", sha1_to_hex(object));
+ remove_note(t, object);
+
+ commit_notes(t, "Notes removed by 'git notes remove'");
+ free_notes(t);
+ return 0;
+}
+
+static int prune(int argc, const char **argv, const char *prefix)
+{
+ struct notes_tree *t;
+ struct option options[] = {
+ OPT_END()
+ };
+
+ argc = parse_options(argc, argv, prefix, options, git_notes_prune_usage,
+ 0);
+
+ if (argc) {
+ error("too many parameters");
+ usage_with_options(git_notes_prune_usage, options);
+ }
+
+ t = init_notes_check("prune");
+
+ prune_notes(t);
+ commit_notes(t, "Notes removed by 'git notes prune'");
+ free_notes(t);
+ return 0;
+}
+
+int cmd_notes(int argc, const char **argv, const char *prefix)
+{
+ int result;
+ const char *override_notes_ref = NULL;
+ struct option options[] = {
+ OPT_STRING(0, "ref", &override_notes_ref, "notes_ref",
+ "use notes from <notes_ref>"),
+ OPT_END()
+ };
+
+ git_config(git_default_config, NULL);
+ argc = parse_options(argc, argv, prefix, options, git_notes_usage,
+ PARSE_OPT_STOP_AT_NON_OPTION);
+
+ if (override_notes_ref) {
+ struct strbuf sb = STRBUF_INIT;
+ if (!prefixcmp(override_notes_ref, "refs/notes/"))
+ /* we're happy */;
+ else if (!prefixcmp(override_notes_ref, "notes/"))
+ strbuf_addstr(&sb, "refs/");
+ else
+ strbuf_addstr(&sb, "refs/notes/");
+ strbuf_addstr(&sb, override_notes_ref);
+ setenv("GIT_NOTES_REF", sb.buf, 1);
+ strbuf_release(&sb);
+ }
+
+ if (argc < 1 || !strcmp(argv[0], "list"))
+ result = list(argc, argv, prefix);
+ else if (!strcmp(argv[0], "add"))
+ result = add(argc, argv, prefix);
+ else if (!strcmp(argv[0], "copy"))
+ result = copy(argc, argv, prefix);
+ else if (!strcmp(argv[0], "append") || !strcmp(argv[0], "edit"))
+ result = append_edit(argc, argv, prefix);
+ else if (!strcmp(argv[0], "show"))
+ result = show(argc, argv, prefix);
+ else if (!strcmp(argv[0], "remove"))
+ result = remove_cmd(argc, argv, prefix);
+ else if (!strcmp(argv[0], "prune"))
+ result = prune(argc, argv, prefix);
+ else {
+ result = error("Unknown subcommand: %s", argv[0]);
+ usage_with_options(git_notes_usage, options);
+ }
+
+ return result ? 1 : 0;
+}