From: Michael Haggerty <mhagger@xxxxxxxxxxxx> This allows the caller to decide what flags to use for check_refname_format(). Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx> --- On 04/27/2012 05:06 PM, Junio C Hamano wrote: > Jeff King<peff@xxxxxxxx> writes: > >> I upgraded git on a machine recently, and it created problems for a repo >> with a bogus character in a ref name. Older versions of git never >> complained about it. Newer ones, containing your dce4bab ("add_ref(): >> verify that the refname is formatted correctly") do. That's fine; it's >> bogus and git _should_ complain about it. >> >> However, recovering from the situation is unnecessarily hard, ... >> ... >> I seem to recall discussing this format-tightening and trying to be sure >> that users were left with a way forward for fixing their repos. But I >> can't find the discussion, and I don't recall any conclusion we came to. > > I haven't dug the archive but I do recall pointing many issues out > around the theme "be liberal in what you accept and strict in what you > produce" on this topic, and loosening one or two showstoppers during the > review cycle, but obviously we did not catch all of them. > > Michael? I will work on providing more infrastructure for checking refnames at varying levels of strictness, but I don't know enough about the code paths to be able to find the places where the strictness levels need tweaking. For this to work, the various callers of check_refname_format() will have to be able to influence the level of strictness that they want to enforce. This patch is one trivial step in that direction. refs.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/refs.c b/refs.c index 09322fe..bc735e7 100644 --- a/refs.c +++ b/refs.c @@ -172,15 +172,11 @@ struct ref_entry { }; static struct ref_entry *create_ref_entry(const char *refname, - const unsigned char *sha1, int flag, - int check_name) + const unsigned char *sha1, int flag) { int len; struct ref_entry *ref; - if (check_name && - check_refname_format(refname, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT)) - die("Reference has invalid format: '%s'", refname); len = strlen(refname) + 1; ref = xmalloc(sizeof(struct ref_entry) + len); hashcpy(ref->u.value.sha1, sha1); @@ -710,7 +706,11 @@ static void read_packed_refs(FILE *f, struct ref_dir *dir) refname = parse_ref_line(refline, sha1); if (refname) { - last = create_ref_entry(refname, sha1, flag, 1); + if (check_refname_format(refname, + REFNAME_ALLOW_ONELEVEL| + REFNAME_DOT_COMPONENT)) + die("Packed reference has invalid format: '%s'", refname); + last = create_ref_entry(refname, sha1, flag); add_ref(dir, last); continue; } @@ -745,8 +745,11 @@ static struct ref_dir *get_packed_refs(struct ref_cache *refs) void add_packed_ref(const char *refname, const unsigned char *sha1) { + if (check_refname_format(refname, + REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT)) + die("Reference has invalid format: '%s'", refname); add_ref(get_packed_refs(get_ref_cache(NULL)), - create_ref_entry(refname, sha1, REF_ISPACKED, 1)); + create_ref_entry(refname, sha1, REF_ISPACKED)); } static void get_ref_dir(struct ref_cache *refs, const char *base, @@ -805,7 +808,11 @@ static void get_ref_dir(struct ref_cache *refs, const char *base, hashclr(sha1); flag |= REF_ISBROKEN; } - add_ref(dir, create_ref_entry(refname, sha1, flag, 1)); + if (check_refname_format(refname, + REFNAME_ALLOW_ONELEVEL| + REFNAME_DOT_COMPONENT)) + die("Loose reference has invalid format: '%s'", refname); + add_ref(dir, create_ref_entry(refname, sha1, flag)); } free(refname); closedir(d); -- 1.7.10 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html