add_packed_ref(): teach function to overwrite existing refs
Teach `add_packed_ref()` to overwrite an existing entry if one already exists for the specified `refname`. This means that we can call it from `files_pack_refs()`, thereby reducing the amount that the latter function needs to know about the internals of packed-reference handling. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Michael Haggerty committed
Jun 23, 2017 at 09:01 UTC
2f108821666a968940f171d52d4d0745a3002b35
1 file changed
+18
-22
refs/files-backend.c
+18
-22
@@ -413,15 +413,16 @@ static struct ref_dir *get_packed_refs(struct files_ref_store *refs)
413
}
414
415
/*
416
- * Add a reference to the in-memory packed reference cache. This may
417
- * only be called while the packed-refs file is locked (see
418
- * lock_packed_refs()). To actually write the packed-refs file, call
419
- * commit_packed_refs().
416
+ * Add or overwrite a reference in the in-memory packed reference
417
+ * cache. This may only be called while the packed-refs file is locked
418
+ * (see lock_packed_refs()). To actually write the packed-refs file,
419
+ * call commit_packed_refs().
420
*/
421
static void add_packed_ref(struct files_ref_store *refs,
422
const char *refname, const struct object_id *oid)
423
{
424
- struct packed_ref_cache *packed_ref_cache = get_packed_ref_cache(refs);
424
+ struct ref_dir *packed_refs;
425
+ struct ref_entry *packed_entry;
426
427
if (!is_lock_file_locked(&refs->packed_refs_lock))
428
die("BUG: packed refs not locked");
@@ -429,8 +430,17 @@ static void add_packed_ref(struct files_ref_store *refs,
430
if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
431
die("Reference has invalid format: '%s'", refname);
432
432
- add_ref_entry(get_packed_ref_dir(packed_ref_cache),
433
- create_ref_entry(refname, oid, REF_ISPACKED));
433
+ packed_refs = get_packed_refs(refs);
434
+ packed_entry = find_ref_entry(packed_refs, refname);
435
+ if (packed_entry) {
436
+ /* Overwrite the existing entry: */
437
+ oidcpy(&packed_entry->u.value.oid, oid);
438
+ packed_entry->flag = REF_ISPACKED;
439
+ oidclr(&packed_entry->u.value.peeled);
440
+ } else {
441
+ packed_entry = create_ref_entry(refname, oid, REF_ISPACKED);
442
+ add_ref_entry(packed_refs, packed_entry);
443
+ }
444
}
445
446
/*
@@ -1526,12 +1536,10 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)
1536
files_downcast(ref_store, REF_STORE_WRITE | REF_STORE_ODB,
1537
"pack_refs");
1538
struct ref_iterator *iter;
1529
- struct ref_dir *packed_refs;
1539
int ok;
1540
struct ref_to_prune *refs_to_prune = NULL;
1541
1542
lock_packed_refs(refs, LOCK_DIE_ON_ERROR);
1534
- packed_refs = get_packed_refs(refs);
1543
1544
iter = cache_ref_iterator_begin(get_loose_ref_cache(refs), NULL, 0);
1545
while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
@@ -1540,8 +1548,6 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)
1548
* in the packed ref cache. If the reference should be
1549
* pruned, also add it to refs_to_prune.
1550
*/
1543
- struct ref_entry *packed_entry;
1544
-
1551
if (!should_pack_ref(iter->refname, iter->oid, iter->flags,
1552
flags))
1553
continue;
@@ -1552,17 +1558,7 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)
1558
* we don't copy the peeled status, because we want it
1559
* to be re-peeled.
1560
*/
1555
- packed_entry = find_ref_entry(packed_refs, iter->refname);
1556
- if (packed_entry) {
1557
- /* Overwrite existing packed entry with info from loose entry */
1558
- packed_entry->flag = REF_ISPACKED;
1559
- oidcpy(&packed_entry->u.value.oid, iter->oid);
1560
- } else {
1561
- packed_entry = create_ref_entry(iter->refname, iter->oid,
1562
- REF_ISPACKED);
1563
- add_ref_entry(packed_refs, packed_entry);
1564
- }
1565
- oidclr(&packed_entry->u.value.peeled);
1561
+ add_packed_ref(refs, iter->refname, iter->oid);
1562
1563
/* Schedule the loose reference for pruning if requested. */
1564
if ((flags & PACK_REFS_PRUNE)) {