diff options
author | Michael Haggerty <mhagger@alum.mit.edu> | 2015-06-22 17:03:03 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-06-22 23:17:11 +0300 |
commit | fb802b312961f49d0aa35f50e72a9a2d17fde9aa (patch) | |
tree | 181c727902f5904005a938cb18413e89a7b26bee /refs.c | |
parent | 0a4b24ff146405fb636d74945c0fdf1afaef3fd6 (diff) |
initial_ref_transaction_commit(): check for duplicate refs
Error out if the ref_transaction includes more than one update for any
refname.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs.c')
-rw-r--r-- | refs.c | 11 |
1 files changed, 11 insertions, 0 deletions
@@ -4099,12 +4099,22 @@ int initial_ref_transaction_commit(struct ref_transaction *transaction, int ret = 0, i; int n = transaction->nr; struct ref_update **updates = transaction->updates; + struct string_list affected_refnames = STRING_LIST_INIT_NODUP; assert(err); if (transaction->state != REF_TRANSACTION_OPEN) die("BUG: commit called for transaction that is not open"); + /* Fail if a refname appears more than once in the transaction: */ + for (i = 0; i < n; i++) + string_list_append(&affected_refnames, updates[i]->refname); + string_list_sort(&affected_refnames); + if (ref_update_reject_duplicates(&affected_refnames, err)) { + ret = TRANSACTION_GENERIC_ERROR; + goto cleanup; + } + for (i = 0; i < n; i++) { struct ref_update *update = updates[i]; @@ -4137,6 +4147,7 @@ int initial_ref_transaction_commit(struct ref_transaction *transaction, cleanup: transaction->state = REF_TRANSACTION_CLOSED; + string_list_clear(&affected_refnames, 0); return ret; } |