]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reflog: convert to parse_options() API
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Thu, 17 Mar 2022 18:08:39 +0000 (19:08 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 23 Mar 2022 22:26:39 +0000 (15:26 -0700)
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>
builtin/reflog.c
t/t1410-reflog.sh
t/test-lib-functions.sh

index 9847e9db3de4cef0b14113a81bed106aa24d66c3..6bd176fe91f18cc823008efa4074ef5ea028d3c5 100644 (file)
@@ -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);
 }
index 68f69bb5431d3248020ac6990189e4b1972dc93d..0dc36d842b0d1e915ac91d865953f91b488dbd19 100755 (executable)
@@ -106,6 +106,23 @@ test_expect_success setup '
        test_line_count = 4 output
 '
 
+test_expect_success 'correct usage on sub-command -h' '
+       test_expect_code 129 git reflog expire -h >err &&
+       grep "git reflog expire" err
+'
+
+test_expect_success 'pass through -- to sub-command' '
+       test_when_finished "rm -rf repo" &&
+       git init repo &&
+       test_commit -C repo message --a-file contents dash-tag &&
+
+       git -C repo reflog show -- --does-not-exist >out &&
+       test_must_be_empty out &&
+       git -C repo reflog show >expect &&
+       git -C repo reflog show -- --a-file >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success rewind '
        test_tick && git reset --hard HEAD~2 &&
        test -f C &&
index 0f439c99d6109110786db0492111ebdb945342a6..1d004744589a653e4584b65e6901a44130579b98 100644 (file)
@@ -329,7 +329,7 @@ test_commit () {
        else
                $echo "${3-$1}" >"$indir$file"
        fi &&
-       git ${indir:+ -C "$indir"} add "$file" &&
+       git ${indir:+ -C "$indir"} add -- "$file" &&
        if test -z "$notick"
        then
                test_tick