diff options
-rw-r--r-- | builtin/reflog.c | 40 | ||||
-rwxr-xr-x | t/t1410-reflog.sh | 17 | ||||
-rw-r--r-- | t/test-lib-functions.sh | 2 |
3 files changed, 50 insertions, 9 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); } diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh index 68f69bb543..0dc36d842b 100755 --- a/t/t1410-reflog.sh +++ b/t/t1410-reflog.sh @@ -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 && diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh index 0f439c99d6..1d00474458 100644 --- a/t/test-lib-functions.sh +++ b/t/test-lib-functions.sh @@ -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 |