On Monday 28 May 2007, Junio C Hamano wrote: > However it would be a good > idea to add logic to fsck to warn upon inconsistencis (perhaps > by mistake) between refname and tag's true name. > > The check would say something like: > > If an annotated (signed or unsigned) tag has a "tag" > line to give it the official $name, and if it is pointed > at by a ref, the refname must end with "/$name". > Otherwise we warn. > > Trivially, the above rule says that having v2.6.22 tag under > refs/tags/v2.6.20 is a mistake we would want to be warned upon. This patch adds the check described by Junio. It is assumed that the "tag" header is mandatory for all tag objects. This might change in the future, at which point this patch should be revised. Signed-off-by: Johan Herland <johan@xxxxxxxxxxx> --- I hope this is what you had in mind :) Have fun! ...Johan builtin-fsck.c | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) diff --git a/builtin-fsck.c b/builtin-fsck.c index cbbcaf0..3594bd3 100644 --- a/builtin-fsck.c +++ b/builtin-fsck.c @@ -501,6 +501,23 @@ static int fsck_handle_reflog(const char *logname, const unsigned char *sha1, in return 0; } +static void fsck_verify_ref_to_tag_object(const char *refname, struct object *obj) +{ + /* Verify that refname matches the name stored in obj's "tag" header */ + struct tag *tagobj = (struct tag *) parse_object(obj->sha1); + size_t tagname_len = strlen(tagobj->tag); + size_t refname_len = strlen(refname); + + if (tagname_len < refname_len && + !memcmp(tagobj->tag, refname + (refname_len - tagname_len), tagname_len) && + refname[(refname_len - tagname_len) - 1] == '/') { + /* OK: tag name is "$name", and refname ends with "/$name" */ + return; + } + else + error("%s: Mismatch between tag ref and tag object's name %s", refname, tagobj->tag); +} + static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data) { struct object *obj; @@ -515,6 +532,8 @@ static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int f /* We'll continue with the rest despite the error.. */ return 0; } + if (obj->type == OBJ_TAG) /* ref to tag object */ + fsck_verify_ref_to_tag_object(refname, obj); default_refs++; obj->used = 1; mark_reachable(obj, REACHABLE); -- 1.5.2.87.g875de-dirty - 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