зеркало из https://github.com/microsoft/git.git
resolve_ref(): report breakage to the caller without warning
629cd3a
(resolve_ref(): emit warnings for improperly-formatted references,
2011-09-15) made resolve_ref() warn against files that are found in the
directories the ref dwimmery looks at. The intent may be good, but these
messages come from a wrong level of the API hierarchy.
Instead record the breakage in "flags" whose purpose is to explain the
result of the function to the caller, who is in a much better position to
make intelligent decision based on the information.
This updates sha1_name.c::dwim_ref() to warn against such a broken
candidate only when it does not appear directly below $GIT_DIR to restore
the traditional behaviour, as we know many files directly underneath
$GIT_DIR/ are not refs.
Warning against "git show config --" with "$GIT_DIR/config does not look
like a well-formed ref" does not make sense, and we may later tweak the
dwimmery not to even consider them as candidates, but that is a longer
term topic.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
98ac34b2b1
Коммит
5595635002
18
refs.c
18
refs.c
|
@ -489,7 +489,6 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *
|
|||
ssize_t len;
|
||||
char buffer[256];
|
||||
static char ref_buffer[256];
|
||||
char path[PATH_MAX];
|
||||
|
||||
if (flag)
|
||||
*flag = 0;
|
||||
|
@ -498,6 +497,7 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *
|
|||
return NULL;
|
||||
|
||||
for (;;) {
|
||||
char path[PATH_MAX];
|
||||
struct stat st;
|
||||
char *buf;
|
||||
int fd;
|
||||
|
@ -570,21 +570,22 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *
|
|||
*/
|
||||
if (prefixcmp(buffer, "ref:"))
|
||||
break;
|
||||
if (flag)
|
||||
*flag |= REF_ISSYMREF;
|
||||
buf = buffer + 4;
|
||||
while (isspace(*buf))
|
||||
buf++;
|
||||
if (check_refname_format(buf, REFNAME_ALLOW_ONELEVEL)) {
|
||||
warning("symbolic reference in %s is formatted incorrectly",
|
||||
path);
|
||||
if (flag)
|
||||
*flag |= REF_ISBROKEN;
|
||||
return NULL;
|
||||
}
|
||||
ref = strcpy(ref_buffer, buf);
|
||||
if (flag)
|
||||
*flag |= REF_ISSYMREF;
|
||||
}
|
||||
/* Please note that FETCH_HEAD has a second line containing other data. */
|
||||
if (get_sha1_hex(buffer, sha1) || (buffer[40] != '\0' && !isspace(buffer[40]))) {
|
||||
warning("reference in %s is formatted incorrectly", path);
|
||||
if (flag)
|
||||
*flag |= REF_ISBROKEN;
|
||||
return NULL;
|
||||
}
|
||||
return ref;
|
||||
|
@ -1107,8 +1108,11 @@ int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
|
|||
*ref = xstrdup(r);
|
||||
if (!warn_ambiguous_refs)
|
||||
break;
|
||||
} else if ((flag & REF_ISSYMREF) && strcmp(fullref, "HEAD"))
|
||||
} else if ((flag & REF_ISSYMREF) && strcmp(fullref, "HEAD")) {
|
||||
warning("ignoring dangling symref %s.", fullref);
|
||||
} else if ((flag & REF_ISBROKEN) && strchr(fullref, '/')) {
|
||||
warning("ignoring broken ref %s.", fullref);
|
||||
}
|
||||
}
|
||||
free(last_branch);
|
||||
return refs_found;
|
||||
|
|
Загрузка…
Ссылка в новой задаче