diff options
author | Ævar Arnfjörð Bjarmason <avarab@gmail.com> | 2022-03-17 19:08:39 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2022-03-23 15:26:39 -0700 |
commit | e3c3675801f6d7494ac11e772e848981d1e158b4 (patch) | |
tree | bdf4a0281defe3227482c5df48352144f8ee3ea1 /builtin | |
parent | reflog exists: use parse_options() API (diff) | |
download | tgif-e3c3675801f6d7494ac11e772e848981d1e158b4.tar.xz |
reflog: convert to parse_options() API
Continue the work started in 33d7bdd6459 (builtin/reflog.c: use
parse-options api for expire, delete subcommands, 2022-01-06) and
convert the cmd_reflog() function itself to use the parse_options()
API.
Let's also add a test which would fail if we forgot
PARSE_OPT_NO_INTERNAL_HELP here, as well as making sure that we'll
still pass through "--" by supplying PARSE_OPT_KEEP_DASHDASH. For that
test we need to change "test_commit()" to accept files starting with
"--".
The "git reflog -h" usage will now show the usage for all of the
sub-commands, rather than a terse summary which wasn't
correct (e.g. "git reflog exists" is not a valid command). See my
8757b35d443 (commit-graph: define common usage with a macro,
2021-08-23) for prior art.
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/reflog.c | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/builtin/reflog.c b/builtin/reflog.c index 9847e9db3d..6bd176fe91 100644 --- a/builtin/reflog.c +++ b/builtin/reflog.c @@ -32,6 +32,14 @@ static const char *const reflog_exists_usage[] = { NULL, }; +static const char *const reflog_usage[] = { + N_("git reflog [show] [<log-options>] [<ref>]"), + BUILTIN_REFLOG_EXPIRE_USAGE, + BUILTIN_REFLOG_DELETE_USAGE, + BUILTIN_REFLOG_EXISTS_USAGE, + NULL +}; + static timestamp_t default_reflog_expire; static timestamp_t default_reflog_expire_unreachable; @@ -372,17 +380,28 @@ static int cmd_reflog_exists(int argc, const char **argv, const char *prefix) * main "reflog" */ -static const char reflog_usage[] = -"git reflog [ show | expire | delete | exists ]"; - int cmd_reflog(int argc, const char **argv, const char *prefix) { - if (argc > 1 && !strcmp(argv[1], "-h")) - usage(_(reflog_usage)); + struct option options[] = { + OPT_END() + }; + + argc = parse_options(argc, argv, prefix, options, reflog_usage, + PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0 | + PARSE_OPT_KEEP_UNKNOWN | + PARSE_OPT_NO_INTERNAL_HELP); + + /* + * With "git reflog" we default to showing it. !argc is + * impossible with PARSE_OPT_KEEP_ARGV0. + */ + if (argc == 1) + goto log_reflog; - /* With no command, we default to showing it. */ - if (argc < 2 || *argv[1] == '-') - return cmd_log_reflog(argc, argv, prefix); + if (!strcmp(argv[1], "-h")) + usage_with_options(reflog_usage, options); + else if (*argv[1] == '-') + goto log_reflog; if (!strcmp(argv[1], "show")) return cmd_log_reflog(argc - 1, argv + 1, prefix); @@ -393,5 +412,10 @@ int cmd_reflog(int argc, const char **argv, const char *prefix) else if (!strcmp(argv[1], "exists")) return cmd_reflog_exists(argc - 1, argv + 1, prefix); + /* + * Fall-through for e.g. "git reflog -1", "git reflog master", + * as well as the plain "git reflog" above goto above. + */ +log_reflog: return cmd_log_reflog(argc, argv, prefix); } |