diff options
author | Michael Haggerty <mhagger@alum.mit.edu> | 2017-05-22 16:17:42 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-05-23 14:29:55 +0900 |
commit | c0ca9357640ae5efbdbfed4c5b476c820a839e85 (patch) | |
tree | 294b2881d00573adda19ecbd361754b51dd0a034 /refs | |
parent | 00d174489e9905411dbae5f895758f2ca489bd9f (diff) | |
download | git-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.c | 33 |
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) { /* |