reflog: handle $name => remotes/%s/HEAD mapping consistently for logs

When refs/remotes/gfi/master and refs/remotes/gfi/HEAD exist,
and the latter is a symref that points at the former, dwim_ref()
resolves string "gfi" to "refs/remotes/gfi/master" as expected,
but dwim_log() does not understand "gfi@{1.day}" and needs to be
told "gfi/master@{1.day}".  This is confusing.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2007-02-08 23:24:51 -08:00
Родитель eb3a48221f
Коммит 40facde06e
1 изменённых файлов: 21 добавлений и 8 удалений

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

@ -275,16 +275,29 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
*log = NULL;
for (p = ref_fmt; *p; p++) {
struct stat st;
char *path = mkpath(*p, len, str);
unsigned char hash[20];
char path[PATH_MAX];
const char *ref, *it;
strcpy(path, mkpath(*p, len, str));
ref = resolve_ref(path, hash, 0, NULL);
if (!ref)
continue;
if (!stat(git_path("logs/%s", path), &st) &&
S_ISREG(st.st_mode)) {
if (!logs_found++) {
*log = xstrdup(path);
resolve_ref(path, sha1, 0, NULL);
}
if (!warn_ambiguous_refs)
break;
S_ISREG(st.st_mode))
it = path;
else if (strcmp(ref, path) &&
!stat(git_path("logs/%s", ref), &st) &&
S_ISREG(st.st_mode))
it = ref;
else
continue;
if (!logs_found++) {
*log = xstrdup(it);
hashcpy(sha1, hash);
}
if (!warn_ambiguous_refs)
break;
}
return logs_found;
}