summaryrefslogtreecommitdiff
path: root/refs.c
diff options
context:
space:
mode:
authorMichael Haggerty <mhagger@alum.mit.edu>2015-06-22 16:03:03 +0200
committerJunio C Hamano <gitster@pobox.com>2015-06-22 13:17:11 -0700
commitfb802b312961f49d0aa35f50e72a9a2d17fde9aa (patch)
tree181c727902f5904005a938cb18413e89a7b26bee /refs.c
parent0a4b24ff146405fb636d74945c0fdf1afaef3fd6 (diff)
downloadgit-fb802b312961f49d0aa35f50e72a9a2d17fde9aa.tar.gz
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.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/refs.c b/refs.c
index 6380a0970a..388ac3ed35 100644
--- a/refs.c
+++ b/refs.c
@@ -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;
}