Instead of using a files-backend-specific struct ref_lock, the generic
ref_transaction struct should provide a void pointer that backends can use
for their own lock data.

Signed-off-by: David Turner <dtur...@twopensource.com>
---
 refs/files-backend.c | 29 ++++++++++++++++-------------
 refs/refs-internal.h |  2 +-
 2 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/refs/files-backend.c b/refs/files-backend.c
index 685fc6f..aa11ba2 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -3208,11 +3208,12 @@ static int files_transaction_commit(struct 
ref_transaction *transaction,
         */
        for (i = 0; i < n; i++) {
                struct ref_update *update = updates[i];
+               struct ref_lock *lock;
 
                if ((update->flags & REF_HAVE_NEW) &&
                    is_null_sha1(update->new_sha1))
                        update->flags |= REF_DELETING;
-               update->lock = lock_ref_sha1_basic(
+               lock = lock_ref_sha1_basic(
                                update->refname,
                                ((update->flags & REF_HAVE_OLD) ?
                                 update->old_sha1 : NULL),
@@ -3220,7 +3221,8 @@ static int files_transaction_commit(struct 
ref_transaction *transaction,
                                update->flags,
                                &update->type,
                                err);
-               if (!update->lock) {
+               update->backend_data = lock;
+               if (!lock) {
                        char *reason;
 
                        ret = (errno == ENOTDIR)
@@ -3238,12 +3240,12 @@ static int files_transaction_commit(struct 
ref_transaction *transaction,
                                                  (update->flags & 
REF_NODEREF));
 
                        if (!overwriting_symref &&
-                           !hashcmp(update->lock->old_oid.hash, 
update->new_sha1)) {
+                           !hashcmp(lock->old_oid.hash, update->new_sha1)) {
                                /*
                                 * The reference already has the desired
                                 * value, so we don't need to write it.
                                 */
-                       } else if (write_ref_to_lockfile(update->lock,
+                       } else if (write_ref_to_lockfile(lock,
                                                         update->new_sha1,
                                                         err)) {
                                char *write_err = strbuf_detach(err, NULL);
@@ -3252,7 +3254,7 @@ static int files_transaction_commit(struct 
ref_transaction *transaction,
                                 * The lock was freed upon failure of
                                 * write_ref_to_lockfile():
                                 */
-                               update->lock = NULL;
+                               update->backend_data = NULL;
                                strbuf_addf(err,
                                            "cannot update the ref '%s': %s",
                                            update->refname, write_err);
@@ -3268,7 +3270,7 @@ static int files_transaction_commit(struct 
ref_transaction *transaction,
                         * We didn't have to write anything to the lockfile.
                         * Close it to free up the file descriptor:
                         */
-                       if (close_ref(update->lock)) {
+                       if (close_ref(lock)) {
                                strbuf_addf(err, "Couldn't close %s.lock",
                                            update->refname);
                                goto cleanup;
@@ -3281,16 +3283,16 @@ static int files_transaction_commit(struct 
ref_transaction *transaction,
                struct ref_update *update = updates[i];
 
                if (update->flags & REF_NEEDS_COMMIT) {
-                       if (commit_ref_update(update->lock,
+                       if (commit_ref_update(update->backend_data,
                                              update->new_sha1, update->msg,
                                              update->flags, err)) {
                                /* freed by commit_ref_update(): */
-                               update->lock = NULL;
+                               update->backend_data = NULL;
                                ret = TRANSACTION_GENERIC_ERROR;
                                goto cleanup;
                        } else {
                                /* freed by commit_ref_update(): */
-                               update->lock = NULL;
+                               update->backend_data = NULL;
                        }
                }
        }
@@ -3298,16 +3300,17 @@ static int files_transaction_commit(struct 
ref_transaction *transaction,
        /* Perform deletes now that updates are safely completed */
        for (i = 0; i < n; i++) {
                struct ref_update *update = updates[i];
+               struct ref_lock *lock = update->backend_data;
 
                if (update->flags & REF_DELETING) {
-                       if (delete_ref_loose(update->lock, update->type, err)) {
+                       if (delete_ref_loose(lock, update->type, err)) {
                                ret = TRANSACTION_GENERIC_ERROR;
                                goto cleanup;
                        }
 
                        if (!(update->flags & REF_ISPRUNING))
                                string_list_append(&refs_to_delete,
-                                                  update->lock->ref_name);
+                                                  lock->ref_name);
                }
        }
 
@@ -3323,8 +3326,8 @@ cleanup:
        transaction->state = REF_TRANSACTION_CLOSED;
 
        for (i = 0; i < n; i++)
-               if (updates[i]->lock)
-                       unlock_ref(updates[i]->lock);
+               if (updates[i]->backend_data)
+                       unlock_ref(updates[i]->backend_data);
        string_list_clear(&refs_to_delete, 0);
        string_list_clear(&affected_refnames, 0);
        return ret;
diff --git a/refs/refs-internal.h b/refs/refs-internal.h
index 15fa99c..3dec075 100644
--- a/refs/refs-internal.h
+++ b/refs/refs-internal.h
@@ -161,7 +161,7 @@ struct ref_update {
         * REF_DELETING, and REF_ISPRUNING:
         */
        unsigned int flags;
-       struct ref_lock *lock;
+       void *backend_data;
        int type;
        char *msg;
        const char refname[FLEX_ARRAY];
-- 
2.4.2.749.g730654d-twtrsrc

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to