diff --git a/builtin/notes.c b/builtin/notes.c
index 3644d14..223f990 100644
--- a/builtin/notes.c
+++ b/builtin/notes.c
@@ -20,18 +20,7 @@
#include "notes-merge.h"
static const char * const git_notes_usage[] = {
- "git notes [--ref <notes_ref>] [list [<object>]]",
- "git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]",
- "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>",
- "git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]",
- "git notes [--ref <notes_ref>] edit [<object>]",
- "git notes [--ref <notes_ref>] show [<object>]",
- "git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>",
- "git notes merge --commit [-v | -q]",
- "git notes merge --abort [-v | -q]",
- "git notes [--ref <notes_ref>] remove [<object>...]",
- "git notes [--ref <notes_ref>] prune [-n | -v]",
- "git notes [--ref <notes_ref>] get-ref",
+ "git notes [<options>] [<subcommand>] [<options>] [<object>..]",
NULL
};
@@ -1059,15 +1048,76 @@ static int get_ref(int argc, const char **argv, const char *prefix)
return 0;
}
+
+struct subcommand {
+ const char *name;
+ const char *help;
+ int (*callback)(int, const char **, const char *);
+};
+
+#define USAGE_OPTS_WIDTH 24
+#define USAGE_GAP 2
+
+static void subcommand_usage(const char * const *usagestr,
+ struct string_list *subcmds)
+{
+ int i;
+
+ fprintf(stderr, "usage: %s\n", *usagestr++);
+ while (*usagestr && **usagestr)
+ fprintf(stderr, " or: %s\n", *usagestr++);
+ while (*usagestr) {
+ fprintf(stderr, "%s%s\n",
+ **usagestr ? " " : "",
+ *usagestr);
+ usagestr++;
+ }
+
+ fputc('\n', stderr);
+ fprintf(stderr, "available subcommands:\n");
+ for (i = 0; i < subcmds->nr; i++) {
+ size_t pos;
+ int pad;
+
+ pos = fprintf(stderr, " ");
+ pos += fprintf(stderr, "%s", subcmds->items[i].string);
+
+ if (pos <= USAGE_OPTS_WIDTH)
+ pad = USAGE_OPTS_WIDTH - pos;
+ else {
+ fputc('\n', stderr);
+ pad = USAGE_OPTS_WIDTH;
+ }
+ fprintf(stderr, "%*s%s\n", pad + USAGE_GAP, "",
+ ((struct subcommand *)(subcmds->items[i].util))->help);
+ }
+ fputc('\n', stderr);
+}
+
int cmd_notes(int argc, const char **argv, const char *prefix)
{
- int result;
+ int i;
const char *override_notes_ref = NULL;
+ struct string_list subcmds = STRING_LIST_INIT_NODUP;
+ struct string_list_item *item;
struct option options[] = {
OPT_STRING(0, "ref", &override_notes_ref, "notes_ref",
"use notes from <notes_ref>"),
OPT_END()
};
+ struct subcommand util[] = {
+ { "list", "list notes for given object", list },
+ { "add", "add notes for given object", add },
+ { "copy", "copy notes for first object onto second object", copy },
+ { "append", "append notes to existing object", append_edit },
+ { "edit", "edit notes for given object", append_edit },
+ { "show", "show notes for given object", show },
+ { "merge", "merge given notes ref into current notes ref", merge },
+ { "remove", "remove notes for given objects", remove_cmd },
+ { "prune",
+ "remove all notes for non-existing/unreachable objects", prune },
+ { "get-ref", "print the current notes ref", get_ref }
+ };
git_config(git_default_config, NULL);
argc = parse_options(argc, argv, prefix, options, git_notes_usage,@@ -1081,28 +1131,18 @@ int cmd_notes(int argc, const char **argv, const char *prefix)
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], "merge"))
- result = merge(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 if (!strcmp(argv[0], "get-ref"))
- result = get_ref(argc, argv, prefix);
- else {
- result = error(_("Unknown subcommand: %s"), argv[0]);
- usage_with_options(git_notes_usage, options);
- }
+ for (i = 0; i < ARRAY_SIZE(util); i++)
+ string_list_insert(&subcmds, util[i].name)->util = &util[i];
+ sort_string_list(&subcmds);
+
+ if (argc < 1)
+ return list(argc, argv, prefix) ? 1 : 0;
+
+ item = string_list_lookup(&subcmds, argv[0]);
+ if (item)
+ return ((struct subcommand *)(item->util))->callback(argc, argv, prefix) ? 1 : 0;
- return result ? 1 : 0;
+ error("unknown subcommand: %s", argv[0]);
+ subcommand_usage(git_notes_usage, &subcmds);
+ exit(129);
}--
1.7.10