• J
    upload-pack: fix transfer.hiderefs over smart-http · e172755b
    Jeff King 提交于
    When upload-pack advertises the refs (either for a normal,
    non-stateless request, or for the initial contact in a
    stateless one), we call for_each_ref with the send_ref
    function as its callback. send_ref, in turn, calls
    mark_our_ref, which checks whether the ref is hidden, and
    sets OUR_REF or HIDDEN_REF on the object as appropriate.  If
    it is hidden, mark_our_ref also returns "1" to signal
    send_ref that the ref should not be advertised.
    
    If we are not advertising refs, (i.e., the follow-up
    invocation by an http client to send its "want" lines), we
    use mark_our_ref directly as a callback to for_each_ref. Its
    marking does the right thing, but when it then returns "1"
    to for_each_ref, the latter interprets this as an error and
    stops iterating. As a result, we skip marking all of the
    refs that come lexicographically after it. Any "want" lines
    from the client asking for those objects will fail, as they
    were not properly marked with OUR_REF.
    
    To solve this, we introduce a wrapper callback around
    mark_our_ref which always returns 0 (even if the ref is
    hidden, we want to keep iterating). We also tweak the
    signature of mark_our_ref to exclude unnecessary parameters
    that were present only to conform to the callback interface.
    This should make it less likely for somebody to accidentally
    use it as a callback in the future.
    Signed-off-by: NJeff King <peff@peff.net>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    e172755b
t5551-http-fetch-smart.sh 7.2 KB