[PATCH v2 10/12] initial_ref_transaction_commit(): check for duplicate refs
- From
Michael Haggerty <mhagger@alum.mit.edu>
- Date
- Jun 13, 2015, 14:42 UTC
- Message-ID
- <73ebe2bdae4e7e38a2349db4c5be783085971b19.1434206062.git.mhagger@alum.mit.edu>
- In-Reply-To
- <cover.1434206062.git.mhagger@alum.mit.edu>
Error out if the ref_transaction includes more than one update for any refname.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> --- refs.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
diff --git a/refs.c b/refs.c index a715524..dfe9090 100644 --- a/refs.c +++ b/refs.c @@ -4068,12 +4068,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]; @@ -4106,6 +4116,7 @@ int initial_ref_transaction_commit(struct ref_transaction *transaction, cleanup: transaction->state = REF_TRANSACTION_CLOSED; + string_list_clear(&affected_refnames, 0); return ret; }
-- 2.1.4