• Jeff King's avatar
    add object_as_type helper for casting objects · 8ff226a9
    Jeff King authored
    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
      - 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
      - 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: default avatarJeff King <[email protected]>
    Signed-off-by: default avatarJunio C Hamano <[email protected]>
tag.c 3.76 KB