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)) {