Browse Source

files_pack_refs(): use a reference transaction to write packed refs

Now that the packed reference store supports transactions, we can use
a transaction to write the packed versions of references that we want
to pack. This decreases the coupling between `files_ref_store` and
`packed_ref_store`.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Michael Haggerty 8 years ago committed by Junio C Hamano
parent
commit
27d03d04d5
  1. 24
      refs/files-backend.c

24
refs/files-backend.c

@ -1100,6 +1100,11 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags) @@ -1100,6 +1100,11 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)
int ok;
struct ref_to_prune *refs_to_prune = NULL;
struct strbuf err = STRBUF_INIT;
struct ref_transaction *transaction;

transaction = ref_store_transaction_begin(refs->packed_ref_store, &err);
if (!transaction)
return -1;

packed_refs_lock(refs->packed_ref_store, LOCK_DIE_ON_ERROR, &err);

@ -1115,12 +1120,14 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags) @@ -1115,12 +1120,14 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)
continue;

/*
* Create an entry in the packed-refs cache equivalent
* to the one from the loose ref cache, except that
* we don't copy the peeled status, because we want it
* to be re-peeled.
* Add a reference creation for this reference to the
* packed-refs transaction:
*/
add_packed_ref(refs->packed_ref_store, iter->refname, iter->oid);
if (ref_transaction_update(transaction, iter->refname,
iter->oid->hash, NULL,
REF_NODEREF, NULL, &err))
die("failure preparing to create packed reference %s: %s",
iter->refname, err.buf);

/* Schedule the loose reference for pruning if requested. */
if ((flags & PACK_REFS_PRUNE)) {
@ -1134,8 +1141,11 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags) @@ -1134,8 +1141,11 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)
if (ok != ITER_DONE)
die("error while iterating over references");

if (commit_packed_refs(refs->packed_ref_store, &err))
die("unable to overwrite old ref-pack file: %s", err.buf);
if (ref_transaction_commit(transaction, &err))
die("unable to write new packed-refs: %s", err.buf);

ref_transaction_free(transaction);

packed_refs_unlock(refs->packed_ref_store);

prune_refs(refs, refs_to_prune);

Loading…
Cancel
Save