mirror of
https://github.com/git/git.git
synced 2026-03-17 04:00:11 +01:00
refs: loosen over-strict "format" check
The add_extra_ref() interface is used to add an extra-ref that is _not_
our ref for the purpose of helping auto-following of tags and reducing
object transfer from remote repository, and they are typically formatted
as a tagname followed by ^{} to make sure no valid refs match that
pattern. In other words, these entries are deliberately formatted not to
pass check-refname-format test.
A recent series however added a test unconditionally to the add_ref()
function that is called from add_extra_ref(). The check may be sensible
for other two callsites of the add_ref() interface, but definitely is
a wrong thing to do in add_extra_ref(). Disable it.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
11
refs.c
11
refs.c
@@ -56,7 +56,7 @@ static const char *parse_ref_line(char *line, unsigned char *sha1)
|
||||
|
||||
/* Add a ref_entry to the end of the ref_array (unsorted). */
|
||||
static void add_ref(const char *refname, const unsigned char *sha1,
|
||||
int flag, struct ref_array *refs,
|
||||
int flag, int check_name, struct ref_array *refs,
|
||||
struct ref_entry **new_entry)
|
||||
{
|
||||
int len;
|
||||
@@ -67,7 +67,8 @@ static void add_ref(const char *refname, const unsigned char *sha1,
|
||||
entry = xmalloc(sizeof(struct ref_entry) + len);
|
||||
hashcpy(entry->sha1, sha1);
|
||||
hashclr(entry->peeled);
|
||||
if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT))
|
||||
if (check_name &&
|
||||
check_refname_format(refname, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT))
|
||||
die("Reference has invalid format: '%s'", refname);
|
||||
memcpy(entry->name, refname, len);
|
||||
entry->flag = flag;
|
||||
@@ -257,7 +258,7 @@ static void read_packed_refs(FILE *f, struct ref_array *array)
|
||||
|
||||
refname = parse_ref_line(refline, sha1);
|
||||
if (refname) {
|
||||
add_ref(refname, sha1, flag, array, &last);
|
||||
add_ref(refname, sha1, flag, 1, array, &last);
|
||||
continue;
|
||||
}
|
||||
if (last &&
|
||||
@@ -272,7 +273,7 @@ static void read_packed_refs(FILE *f, struct ref_array *array)
|
||||
|
||||
void add_extra_ref(const char *refname, const unsigned char *sha1, int flag)
|
||||
{
|
||||
add_ref(refname, sha1, flag, &extra_refs, NULL);
|
||||
add_ref(refname, sha1, flag, 0, &extra_refs, NULL);
|
||||
}
|
||||
|
||||
void clear_extra_refs(void)
|
||||
@@ -359,7 +360,7 @@ static void get_ref_dir(struct ref_cache *refs, const char *base,
|
||||
hashclr(sha1);
|
||||
flag |= REF_BROKEN;
|
||||
}
|
||||
add_ref(ref, sha1, flag, array, NULL);
|
||||
add_ref(ref, sha1, flag, 1, array, NULL);
|
||||
}
|
||||
free(ref);
|
||||
closedir(dir);
|
||||
|
||||
@@ -146,4 +146,11 @@ test_expect_success 'cloning with reference being subset of source (-l -s)' \
|
||||
|
||||
cd "$base_dir"
|
||||
|
||||
test_expect_success 'clone with reference from a tagged repository' '
|
||||
(
|
||||
cd A && git tag -a -m 'tagged' HEAD
|
||||
) &&
|
||||
git clone --reference=A A I
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
Reference in New Issue
Block a user