On 11/07/14 09:48, Jeff King wrote: [snip] > diff --git a/object.c b/object.c > index 472aa8d..b2319f6 100644 > --- a/object.c > +++ b/object.c > @@ -158,6 +158,23 @@ void *create_object(const unsigned char *sha1, void *o) > return obj; > } > > +void *object_as_type(struct object *obj, enum object_type type, int quiet) > +{ > + if (obj->type == type) > + return obj; > + else if (obj->type == OBJ_NONE) { > + obj->type = type; > + return obj; > + } > + else { > + if (!quiet) > + error("object %s is a %s, not a %s", > + sha1_to_hex(obj->sha1), > + typename(obj->type), typename(type)); > + return NULL; > + } > +} > + > struct object *lookup_unknown_object(const unsigned char *sha1) > { > struct object *obj = lookup_object(sha1); > diff --git a/object.h b/object.h > index 8020ace..5e8d8ee 100644 > --- a/object.h > +++ b/object.h > @@ -81,6 +81,8 @@ struct object *lookup_object(const unsigned char *sha1); > > extern void *create_object(const unsigned char *sha1, void *obj); > > +void *object_as_type(struct object *obj, enum object_type type, int quiet); > + > /* > * Returns the object, having parsed it to find out what it is. > * > diff --git a/refs.c b/refs.c > index 20e2bf1..5a18e2d 100644 > --- a/refs.c > +++ b/refs.c > @@ -1729,9 +1729,8 @@ static enum peel_status peel_object(const unsigned char *name, unsigned char *sh > > if (o->type == OBJ_NONE) { > int type = sha1_object_info(name, NULL); > - if (type < 0) > + if (type < 0 || !object_as_type(o, type, 0)) --------------------------------------------------------^^^ It is not possible here for object_as_type() to issue an error() report, but I had to go look at the code to check. (It would have been a change in behaviour, otherwise). So, it doesn't really matter what you pass to the quiet argument, but setting it to 1 _may_ help the next reader. (No, I'm not convinced either; the only reason I knew it had anything to do with error messages was because I had just read the code ...) Hmm, dunno. > return PEEL_INVALID; > - o->type = type; > } > > if (o->type != OBJ_TAG) > diff --git a/tag.c b/tag.c > index 79552c7..82d841b 100644 > --- a/tag.c > +++ b/tag.c > @@ -41,14 +41,7 @@ struct tag *lookup_tag(const unsigned char *sha1) > struct object *obj = lookup_object(sha1); > if (!obj) > return create_object(sha1, alloc_tag_node()); > - if (!obj->type) > - obj->type = OBJ_TAG; > - if (obj->type != OBJ_TAG) { > - error("Object %s is a %s, not a tag", > - sha1_to_hex(sha1), typename(obj->type)); > - return NULL; > - } > - return (struct tag *) obj; > + return object_as_type(obj, OBJ_TAG, 0); > } > > static unsigned long parse_tag_date(const char *buf, const char *tail) > diff --git a/tree.c b/tree.c > index ed66575..bb02c1c 100644 > --- a/tree.c > +++ b/tree.c > @@ -184,14 +184,7 @@ struct tree *lookup_tree(const unsigned char *sha1) > struct object *obj = lookup_object(sha1); > if (!obj) > return create_object(sha1, alloc_tree_node()); > - if (!obj->type) > - obj->type = OBJ_TREE; > - if (obj->type != OBJ_TREE) { > - error("Object %s is a %s, not a tree", > - sha1_to_hex(sha1), typename(obj->type)); > - return NULL; > - } > - return (struct tree *) obj; > + return object_as_type(obj, OBJ_TREE, 0); > } > > int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size) > ATB, Ramsay Jones -- 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