Skip to content
  • Jeff King's avatar
    upload-pack: send ERR packet for non-tip objects · 014ade74
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    Commit bdb31ead (upload-pack: report "not our ref" to client,
    2017-02-23) catches the case where a client asks for an object we don't
    have, and issues a message that the client can show to the user (in
    addition to dying and writing to stderr).
    
    There's a similar case (with the same message) when the client asks for
    an object which we _do_ have, but which isn't a ref tip (or isn't
    reachable, when uploadpack.allowReachableSHA1InWant is true). Let's give
    that one the same treatment, for the same reason (namely that it's more
    informative to the client than just hanging up, since they won't see our
    stderr over some protocols).
    
    There are two tests here. We cover it most directly in t5530 by invoking
    upload-pack, which matches the existing "not our ref" test.
    
    But a more end-to-end check is that "git fetch" actually shows the
    message to the client. We're already checking in t5516 that this case
    fails, so we can just check stderr there, too. Note that even after we
    started ignoring SIGPIPE in 8bf4becf, this could in theory still be
    racy as described in that commit (because we die() on write failures
    before pumping the connection for any ERR packets).
    
    In practice this should be OK for this case. The server will not
    actually check reachability until it has received our whole group of
    "want" lines. And since we have no objects in the repository, we won't
    send any "have" lines, meaning we're always waiting to read the server
    response.
    
    Note also that this case cannot happen in the v2 protocol, since it
    allows any available object to be requested. However, we don't have to
    take any steps to protect against the upcoming GIT_TEST_PROTOCOL_VERSION
    in our tests:
    
      - the tests in t5516 would already need to be skipped under v2, and
        that is covered by ab0c5f50
    
     (tests: always test fetch of
        unreachable with v0, 2019-02-25)
    
      - the tests in t5530 invoke upload-pack directly, which will continue
        to default to v0. Eventually we may have a test setting which uses
        v2 even for bare upload-pack calls, but we can't override it here
        until we know what the setting looks like.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    014ade74