Skip to content
  • brian m. carlson's avatar
    remote-curl: pass on atomic capability to remote side · 6f119424
    brian m. carlson authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When pushing more than one reference with the --atomic option, the
    server is supposed to perform a single atomic transaction to update the
    references, leaving them either all to succeed or all to fail.  This
    works fine when pushing locally or over SSH, but when pushing over HTTP,
    we fail to pass the atomic capability to the remote side.  In fact, we
    have not reported this capability to any remote helpers during the life
    of the feature.
    
    Now normally, things happen to work nevertheless, since we actually
    check for most types of failures, such as non-fast-forward updates, on
    the client side, and just abort the entire attempt.  However, if the
    server side reports a problem, such as the inability to lock a ref, the
    transaction isn't atomic, because we haven't passed the appropriate
    capability over and the remote side has no way of knowing that we wanted
    atomic behavior.
    
    Fix this by passing the option from the transport code through to remote
    helpers, and from the HTTP remote helper down to send-pack.  With this
    change, we can detect if the server side rejects the push and report
    back appropriately.  Note the difference in the messages: the remote
    side reports "atomic transaction failed", while our own checking rejects
    pushes with the message "atomic push failed".
    
    Document the atomic option in the remote helper documentation, so other
    implementers can implement it if they like.
    
    Signed-off-by: default avatarbrian m. carlson <sandals@crustytoothpaste.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    6f119424