git-reflog: add exists command

This is necessary because alternate ref backends might store reflogs
somewhere other than .git/logs.  Code that now directly manipulates
.git/logs should instead go through git-reflog.

Signed-off-by: David Turner <dturner@twopensource.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
David Turner 2015-07-21 17:04:53 -04:00 коммит произвёл Junio C Hamano
Родитель abd0cd3a30
Коммит afcb2e7a3b
3 изменённых файлов: 41 добавлений и 1 удалений

Просмотреть файл

@ -23,6 +23,7 @@ depending on the subcommand:
[--dry-run] [--verbose] [--all | <refs>...] [--dry-run] [--verbose] [--all | <refs>...]
'git reflog delete' [--rewrite] [--updateref] 'git reflog delete' [--rewrite] [--updateref]
[--dry-run] [--verbose] ref@\{specifier\}... [--dry-run] [--verbose] ref@\{specifier\}...
'git reflog exists' <ref>
Reference logs, or "reflogs", record when the tips of branches and Reference logs, or "reflogs", record when the tips of branches and
other references were updated in the local repository. Reflogs are other references were updated in the local repository. Reflogs are
@ -52,6 +53,9 @@ argument must be an _exact_ entry (e.g. "`git reflog delete
master@{2}`"). This subcommand is also typically not used directly by master@{2}`"). This subcommand is also typically not used directly by
end users. end users.
The "exists" subcommand checks whether a ref has a reflog. It exits
with zero status if the reflog exists, and non-zero status if it does
not.
OPTIONS OPTIONS
------- -------

Просмотреть файл

@ -13,6 +13,8 @@ static const char reflog_expire_usage[] =
"git reflog expire [--expire=<time>] [--expire-unreachable=<time>] [--rewrite] [--updateref] [--stale-fix] [--dry-run | -n] [--verbose] [--all] <refs>..."; "git reflog expire [--expire=<time>] [--expire-unreachable=<time>] [--rewrite] [--updateref] [--stale-fix] [--dry-run | -n] [--verbose] [--all] <refs>...";
static const char reflog_delete_usage[] = static const char reflog_delete_usage[] =
"git reflog delete [--rewrite] [--updateref] [--dry-run | -n] [--verbose] <refs>..."; "git reflog delete [--rewrite] [--updateref] [--dry-run | -n] [--verbose] <refs>...";
static const char reflog_exists_usage[] =
"git reflog exists <ref>";
static unsigned long default_reflog_expire; static unsigned long default_reflog_expire;
static unsigned long default_reflog_expire_unreachable; static unsigned long default_reflog_expire_unreachable;
@ -699,12 +701,38 @@ static int cmd_reflog_delete(int argc, const char **argv, const char *prefix)
return status; return status;
} }
static int cmd_reflog_exists(int argc, const char **argv, const char *prefix)
{
int i, start = 0;
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
if (!strcmp(arg, "--")) {
i++;
break;
}
else if (arg[0] == '-')
usage(reflog_exists_usage);
else
break;
}
start = i;
if (argc - start != 1)
usage(reflog_exists_usage);
if (check_refname_format(argv[start], REFNAME_ALLOW_ONELEVEL))
die("invalid ref format: %s", argv[start]);
return !reflog_exists(argv[start]);
}
/* /*
* main "reflog" * main "reflog"
*/ */
static const char reflog_usage[] = static const char reflog_usage[] =
"git reflog [ show | expire | delete ]"; "git reflog [ show | expire | delete | exists ]";
int cmd_reflog(int argc, const char **argv, const char *prefix) int cmd_reflog(int argc, const char **argv, const char *prefix)
{ {
@ -724,5 +752,8 @@ int cmd_reflog(int argc, const char **argv, const char *prefix)
if (!strcmp(argv[1], "delete")) if (!strcmp(argv[1], "delete"))
return cmd_reflog_delete(argc - 1, argv + 1, prefix); return cmd_reflog_delete(argc - 1, argv + 1, prefix);
if (!strcmp(argv[1], "exists"))
return cmd_reflog_exists(argc - 1, argv + 1, prefix);
return cmd_log_reflog(argc, argv, prefix); return cmd_log_reflog(argc, argv, prefix);
} }

Просмотреть файл

@ -166,4 +166,9 @@ test_expect_success 'git log -g -p shows diffs vs. parents' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'reflog exists works' '
git reflog exists refs/heads/master &&
! git reflog exists refs/heads/nonexistent
'
test_done test_done