summaryrefslogtreecommitdiff
path: root/refs
diff options
context:
space:
mode:
authorMichael Haggerty <mhagger@alum.mit.edu>2017-05-22 16:17:42 +0200
committerJunio C Hamano <gitster@pobox.com>2017-05-23 14:29:55 +0900
commitc0ca9357640ae5efbdbfed4c5b476c820a839e85 (patch)
tree294b2881d00573adda19ecbd361754b51dd0a034 /refs
parent00d174489e9905411dbae5f895758f2ca489bd9f (diff)
downloadgit-c0ca9357640ae5efbdbfed4c5b476c820a839e85.tar.gz
files_transaction_cleanup(): new helper function
Extract the cleanup functionality from `files_transaction_commit()` into a new function. It will soon have another caller. Use the common cleanup code even on early exit if the transaction is empty, to reduce code duplication. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs')
-rw-r--r--refs/files-backend.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 1db40432af..2c70de5209 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -2834,6 +2834,27 @@ static int lock_ref_for_update(struct files_ref_store *refs,
return 0;
}
+/*
+ * Unlock any references in `transaction` that are still locked, and
+ * mark the transaction closed.
+ */
+static void files_transaction_cleanup(struct ref_transaction *transaction)
+{
+ size_t i;
+
+ for (i = 0; i < transaction->nr; i++) {
+ struct ref_update *update = transaction->updates[i];
+ struct ref_lock *lock = update->backend_data;
+
+ if (lock) {
+ unlock_ref(lock);
+ update->backend_data = NULL;
+ }
+ }
+
+ transaction->state = REF_TRANSACTION_CLOSED;
+}
+
static int files_transaction_commit(struct ref_store *ref_store,
struct ref_transaction *transaction,
struct strbuf *err)
@@ -2856,10 +2877,8 @@ static int files_transaction_commit(struct ref_store *ref_store,
if (transaction->state != REF_TRANSACTION_OPEN)
die("BUG: commit called for transaction that is not open");
- if (!transaction->nr) {
- transaction->state = REF_TRANSACTION_CLOSED;
- return 0;
- }
+ if (!transaction->nr)
+ goto cleanup;
/*
* Fail if a refname appears more than once in the
@@ -3005,15 +3024,11 @@ static int files_transaction_commit(struct ref_store *ref_store,
clear_loose_ref_cache(refs);
cleanup:
+ files_transaction_cleanup(transaction);
strbuf_release(&sb);
- transaction->state = REF_TRANSACTION_CLOSED;
for (i = 0; i < transaction->nr; i++) {
struct ref_update *update = transaction->updates[i];
- struct ref_lock *lock = update->backend_data;
-
- if (lock)
- unlock_ref(lock);
if (update->flags & REF_DELETED_LOOSE) {
/*