• Jonathan Tan's avatar
    transport: list refs before fetch if necessary · 6ab40557
    Jonathan Tan authored
    The built-in bundle transport and the transport helper interface do not
    work when transport_fetch_refs() is called immediately after transport
    creation. This will be needed in a subsequent patch, so fix this.
    
    Evidence: fetch_refs_from_bundle() relies on data->header being
    initialized in get_refs_from_bundle(), and fetch() in transport-helper.c
    relies on either data->fetch or data->import being set by get_helper(),
    but neither transport_helper_init() nor fetch() calls get_helper().
    
    Up until the introduction of the partial clone feature, this has not
    been a problem, because transport_fetch_refs() is always called after
    transport_get_remote_refs(). With the introduction of the partial clone
    feature, which involves calling transport_fetch_refs() (to fetch objects
    by their OIDs) without transport_get_remote_refs(), this is still not a
    problem, but only coincidentally - we do not support partially cloning a
    bundle, and as for cloning using a transport-helper-using protocol, it
    so happens that before transport_fetch_refs() is called, fetch_refs() in
    fetch-object.c calls transport_set_option(), which means that the
    aforementioned get_helper() is invoked through set_helper_option() in
    transport-helper.c.
    
    This could be fixed by fixing the transports themselves, but it doesn't
    seem like a good idea to me to open up previously untested code paths;
    also, there may be transport helpers in the wild that assume that "list"
    is always called before "fetch". Instead, fix this by having
    transport_fetch_refs() call transport_get_remote_refs() to ensure that
    the latter is always called at least once, unless the transport
    explicitly states that it supports fetching without listing refs.
    Signed-off-by: 's avatarJonathan Tan <jonathantanmy@google.com>
    Signed-off-by: 's avatarJunio C Hamano <gitster@pobox.com>
    6ab40557
transport-internal.h 2.72 KB