diff options
| author | John Cai <johncai86@gmail.com> | 2024-08-09 15:37:49 +0000 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2024-08-09 08:47:33 -0700 |
| commit | cfd971520ed11096aaa11f6bd1ee99b307f3146c (patch) | |
| tree | 616578d53f64884cdac7bd6906572d109d7a36f1 /refs/reftable-backend.c | |
| parent | Git 2.46 (diff) | |
| download | git-cfd971520ed11096aaa11f6bd1ee99b307f3146c.tar.gz git-cfd971520ed11096aaa11f6bd1ee99b307f3146c.zip | |
refs: keep track of unresolved reference value in iterators
Since ref iterators do not hold onto the direct value of a reference
without resolving it, the only way to get ahold of a direct value of a
symbolic ref is to make a separate call to refs_read_symbolic_ref.
To make accessing the direct value of a symbolic ref more efficient,
let's save the direct value of the ref in the iterators for both the
files backend and the reftable backend.
Signed-off-by: John Cai <johncai86@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs/reftable-backend.c')
| -rw-r--r-- | refs/reftable-backend.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c index fbe74c239d..50a072b97b 100644 --- a/refs/reftable-backend.c +++ b/refs/reftable-backend.c @@ -455,6 +455,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; @@ -494,8 +495,12 @@ static int reftable_ref_iterator_advance(struct ref_iterator *ref_iterator) the_repository->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, the_repository->hash_algo); break; default: @@ -523,6 +528,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; |
