]> git.ipfire.org Git - thirdparty/git.git/commit
remote-curl: pass on atomic capability to remote side
authorbrian m. carlson <sandals@crustytoothpaste.net>
Wed, 16 Oct 2019 23:45:34 +0000 (23:45 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 17 Oct 2019 07:08:22 +0000 (16:08 +0900)
commit6f1194246a514ba093a11dde73aabe4c0da5526f
treec77e309f8c9b926709aeb15bc3a13baa08f149e2
parent5fa0f5238b0cd46cfe7f6fa76c3f526ea98148d9
remote-curl: pass on atomic capability to remote side

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: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/gitremote-helpers.txt
remote-curl.c
t/t5541-http-push-smart.sh
transport-helper.c
transport.h