aboutsummaryrefslogtreecommitdiffstats
path: root/refs/reftable-backend.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2024-08-15 13:22:15 -0700
committerJunio C Hamano <gitster@pobox.com>2024-08-15 13:22:15 -0700
commite7f86cb69de9c3b95c8c8816b51621c1d7910e02 (patch)
tree5be466f67f045f9c1ab56411e7977ac5e66a4fe7 /refs/reftable-backend.c
parentMerge branch 'ps/submodule-ref-format' (diff)
parentref-filter: populate symref from iterator (diff)
downloadgit-e7f86cb69de9c3b95c8c8816b51621c1d7910e02.tar.gz
git-e7f86cb69de9c3b95c8c8816b51621c1d7910e02.zip
Merge branch 'jc/refs-symref-referent'
The refs API has been taught to give symref target information to the users of ref iterators, allowing for-each-ref and friends to avoid an extra ref_resolve_* API call per a symbolic ref. * jc/refs-symref-referent: ref-filter: populate symref from iterator refs: add referent to each_ref_fn refs: keep track of unresolved reference value in iterators
Diffstat (limited to 'refs/reftable-backend.c')
-rw-r--r--refs/reftable-backend.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c
index bf4446afd3..db2ae1dfcb 100644
--- a/refs/reftable-backend.c
+++ b/refs/reftable-backend.c
@@ -454,6 +454,7 @@ static int reftable_ref_iterator_advance(struct ref_iterator *ref_iterator)
struct reftable_ref_iterator *iter =
(struct reftable_ref_iterator *)ref_iterator;
struct reftable_ref_store *refs = iter->refs;
+ const char *referent = NULL;
while (!iter->err) {
int flags = 0;
@@ -493,8 +494,11 @@ static int reftable_ref_iterator_advance(struct ref_iterator *ref_iterator)
refs->base.repo->hash_algo);
break;
case REFTABLE_REF_SYMREF:
- if (!refs_resolve_ref_unsafe(&iter->refs->base, iter->ref.refname,
- RESOLVE_REF_READING, &iter->oid, &flags))
+ referent = refs_resolve_ref_unsafe(&iter->refs->base,
+ iter->ref.refname,
+ RESOLVE_REF_READING,
+ &iter->oid, &flags);
+ if (!referent)
oidclr(&iter->oid, refs->base.repo->hash_algo);
break;
default:
@@ -522,6 +526,7 @@ static int reftable_ref_iterator_advance(struct ref_iterator *ref_iterator)
continue;
iter->base.refname = iter->ref.refname;
+ iter->base.referent = referent;
iter->base.oid = &iter->oid;
iter->base.flags = flags;