refs: add update_refs for multiple simultaneous updates
commit98aee92d5c9e5161a8c11b7666996e4ffffe80ab
authorBrad King <brad.king@kitware.com>
Wed, 4 Sep 2013 15:22:43 +0000 (4 11:22 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 4 Sep 2013 18:10:28 +0000 (4 11:10 -0700)
treede4b08360058b244cc3ef5b2858d1da7fc4bad26
parent61cee0dbac84160ad4a1bcc2ecdb15761bd284fc
refs: add update_refs for multiple simultaneous updates

Add 'struct ref_update' to encode the information needed to update or
delete a ref (name, new sha1, optional old sha1, no-deref flag).  Add
function 'update_refs' accepting an array of updates to perform.  First
sort the input array to order locks consistently everywhere and reject
multiple updates to the same ref.  Then acquire locks on all refs with
verified old values.  Then update or delete all refs accordingly.  Fail
if any one lock cannot be obtained or any one old value does not match.

Though the refs themselves cannot be modified together in a single
atomic transaction, this function does enable some useful semantics.
For example, a caller may create a new branch starting from the head of
another branch and rewind the original branch at the same time.  This
transfers ownership of commits between branches without risk of losing
commits added to the original branch by a concurrent process, or risk of
a concurrent process creating the new branch first.

Signed-off-by: Brad King <brad.king@kitware.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c
refs.h