diff options
| author | Jeff King <peff@peff.net> | 2014-07-13 02:42:03 -0400 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2014-07-13 18:59:05 -0700 | 
| commit | 8ff226a9d5ee065fe52752e6032f63cb6e4beccb (patch) | |
| tree | 7076defdcbf14d7abf9d1ce8fc4e37663e0b8f8a /object.c | |
| parent | 5af01caa08700e389d49a81be15c7413abd4aa69 (diff) | |
| download | git-8ff226a9d5ee065fe52752e6032f63cb6e4beccb.tar.gz | |
add object_as_type helper for casting objects
When we call lookup_commit, lookup_tree, etc, the logic goes
something like:
  1. Look for an existing object struct. If we don't have
     one, allocate and return a new one.
  2. Double check that any object we have is the expected
     type (and complain and return NULL otherwise).
  3. Convert an object with type OBJ_NONE (from a prior
     call to lookup_unknown_object) to the expected type.
We can encapsulate steps 2 and 3 in a helper function which
checks whether we have the expected object type, converts
OBJ_NONE as appropriate, and returns the object.
Not only does this shorten the code, but it also provides
one central location for converting OBJ_NONE objects into
objects of other types. Future patches will use that to
enforce type-specific invariants.
Since this is a refactoring, we would want it to behave
exactly as the current code. It takes a little reasoning to
see that this is the case:
  - for lookup_{commit,tree,etc} functions, we are just
    pulling steps 2 and 3 into a function that does the same
    thing.
  - for the call in peel_object, we currently only do step 3
    (but we want to consolidate it with the others, as
    mentioned above). However, step 2 is a noop here, as the
    surrounding conditional makes sure we have OBJ_NONE
    (which we want to keep to avoid an extraneous call to
    sha1_object_info).
  - for the call in lookup_commit_reference_gently, we are
    currently doing step 2 but not step 3. However, step 3
    is a noop here. The object we got will have just come
    from deref_tag, which must have figured out the type for
    each object in order to know when to stop peeling.
    Therefore the type will never be OBJ_NONE.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'object.c')
| -rw-r--r-- | object.c | 17 | 
1 files changed, 17 insertions, 0 deletions
| @@ -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); | 
