summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Turner <dturner@twopensource.com>2016-09-04 16:08:43 (GMT)
committerJunio C Hamano <gitster@pobox.com>2016-09-09 22:28:14 (GMT)
commit7d618264394a17e6ecd83d9412ac9ddb4609a2e5 (patch)
treefc3fa086a1598c9d2525ee4d4b26011cdceb8cd5
parent9b6b40d93a4c93d36225533ddc6717841b07d09d (diff)
downloadgit-7d618264394a17e6ecd83d9412ac9ddb4609a2e5.zip
git-7d618264394a17e6ecd83d9412ac9ddb4609a2e5.tar.gz
git-7d618264394a17e6ecd83d9412ac9ddb4609a2e5.tar.bz2
refs: make lock generic
Instead of including a files-backend-specific struct ref_lock, change the generic ref_update struct to include a void pointer that backends can use for their own arbitrary data. Signed-off-by: David Turner <dturner@twopensource.com> Signed-off-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--refs/files-backend.c25
-rw-r--r--refs/refs-internal.h2
2 files changed, 14 insertions, 13 deletions
diff --git a/refs/files-backend.c b/refs/files-backend.c
index f61101a..82b3ac0 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -3520,9 +3520,8 @@ static int lock_ref_for_update(struct files_ref_store *refs,
ret = lock_raw_ref(refs, update->refname, mustexist,
affected_refnames, NULL,
- &update->lock, &referent,
+ &lock, &referent,
&update->type, err);
-
if (ret) {
char *reason;
@@ -3533,7 +3532,7 @@ static int lock_ref_for_update(struct files_ref_store *refs,
return ret;
}
- lock = update->lock;
+ update->backend_data = lock;
if (update->type & REF_ISSYMREF) {
if (update->flags & REF_NODEREF) {
@@ -3589,7 +3588,8 @@ static int lock_ref_for_update(struct files_ref_store *refs,
for (parent_update = update->parent_update;
parent_update;
parent_update = parent_update->parent_update) {
- oidcpy(&parent_update->lock->old_oid, &lock->old_oid);
+ struct ref_lock *parent_lock = parent_update->backend_data;
+ oidcpy(&parent_lock->old_oid, &lock->old_oid);
}
if ((update->flags & REF_HAVE_OLD) &&
@@ -3624,7 +3624,7 @@ static int lock_ref_for_update(struct files_ref_store *refs,
* 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);
@@ -3742,7 +3742,7 @@ static int files_transaction_commit(struct ref_store *ref_store,
/* Perform updates first so live commits remain referenced */
for (i = 0; i < transaction->nr; i++) {
struct ref_update *update = transaction->updates[i];
- struct ref_lock *lock = update->lock;
+ struct ref_lock *lock = update->backend_data;
if (update->flags & REF_NEEDS_COMMIT ||
update->flags & REF_LOG_ONLY) {
@@ -3755,7 +3755,7 @@ static int files_transaction_commit(struct ref_store *ref_store,
lock->ref_name, old_msg);
free(old_msg);
unlock_ref(lock);
- update->lock = NULL;
+ update->backend_data = NULL;
ret = TRANSACTION_GENERIC_ERROR;
goto cleanup;
}
@@ -3765,7 +3765,7 @@ static int files_transaction_commit(struct ref_store *ref_store,
if (commit_ref(lock)) {
strbuf_addf(err, "couldn't set '%s'", lock->ref_name);
unlock_ref(lock);
- update->lock = NULL;
+ update->backend_data = NULL;
ret = TRANSACTION_GENERIC_ERROR;
goto cleanup;
}
@@ -3774,17 +3774,18 @@ static int files_transaction_commit(struct ref_store *ref_store,
/* Perform deletes now that updates are safely completed */
for (i = 0; i < transaction->nr; i++) {
struct ref_update *update = transaction->updates[i];
+ struct ref_lock *lock = update->backend_data;
if (update->flags & REF_DELETING &&
!(update->flags & REF_LOG_ONLY)) {
- 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);
}
}
@@ -3800,8 +3801,8 @@ cleanup:
transaction->state = REF_TRANSACTION_CLOSED;
for (i = 0; i < transaction->nr; i++)
- if (transaction->updates[i]->lock)
- unlock_ref(transaction->updates[i]->lock);
+ if (transaction->updates[i]->backend_data)
+ unlock_ref(transaction->updates[i]->backend_data);
string_list_clear(&refs_to_delete, 0);
free(head_ref);
string_list_clear(&affected_refnames, 0);
diff --git a/refs/refs-internal.h b/refs/refs-internal.h
index c598cb1..681982b 100644
--- a/refs/refs-internal.h
+++ b/refs/refs-internal.h
@@ -162,7 +162,7 @@ struct ref_update {
*/
unsigned int flags;
- struct ref_lock *lock;
+ void *backend_data;
unsigned int type;
char *msg;