refs debug: add a wrapper for "read_symbolic_ref"

In cd475b3b038 (refs: add ability for backends to special-case reading of symbolic refs, 2022-03-01) when the "read_symbolic_ref" callback was added we'd fall back on "refs_read_raw_ref" if there wasn't any backend implementation of "read_symbolic_ref". As discussed in the preceding commit this would only happen if we were running the "debug" backend, e.g. in the "setup for ref completion" test in t9902-completion.sh with: GIT_TRACE_REFS=1 git fetch --no-tags other Let's improve the trace output, but and also eliminate the now-redundant refs_read_raw_ref() fallback case. As noted in the preceding commit the "packed" backend will never call refs_read_symbolic_ref() (nor is it ever going to). For any future backend such as reftable it's OK to ask that they either implement this (or a wrapper) themselves. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Ævar Arnfjörð Bjarmason committed Mar 17, 2022 at 18:27 UTC 5b8754043c9cbe47f3de35f2d196f074645d135f
2 files changed +27 -13
refs.c
+1 -12
@@ -1676,18 +1676,7 @@ int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
1676 int refs_read_symbolic_ref(struct ref_store *ref_store, const char *refname,
1677 struct strbuf *referent)
1678 {
1679 - struct object_id oid;
1680 - int ret, failure_errno = 0;
1681 - unsigned int type = 0;
1682 -
1683 - if (ref_store->be->read_symbolic_ref)
1684 - return ref_store->be->read_symbolic_ref(ref_store, refname, referent);
1685 -
1686 - ret = refs_read_raw_ref(ref_store, refname, &oid, referent, &type, &failure_errno);
1687 - if (ret || !(type & REF_ISSYMREF))
1688 - return -1;
1689 -
1690 - return 0;
1679 + return ref_store->be->read_symbolic_ref(ref_store, refname, referent);
1680 }
1681
1682 const char *refs_resolve_ref_unsafe(struct ref_store *refs,
refs/debug.c
+26 -1
@@ -262,6 +262,24 @@ static int debug_read_raw_ref(struct ref_store *ref_store, const char *refname,
262 return res;
263 }
264
265 +static int debug_read_symbolic_ref(struct ref_store *ref_store, const char *refname,
266 + struct strbuf *referent)
267 +{
268 + struct debug_ref_store *drefs = (struct debug_ref_store *)ref_store;
269 + struct ref_store *refs = drefs->refs;
270 + int res;
271 +
272 + res = refs->be->read_symbolic_ref(refs, refname, referent);
273 + if (!res)
274 + trace_printf_key(&trace_refs, "read_symbolic_ref: %s: (%s)\n",
275 + refname, referent->buf);
276 + else
277 + trace_printf_key(&trace_refs,
278 + "read_symbolic_ref: %s: %d\n", refname, res);
279 + return res;
280 +
281 +}
282 +
283 static struct ref_iterator *
284 debug_reflog_iterator_begin(struct ref_store *ref_store)
285 {
@@ -423,6 +441,13 @@ struct ref_storage_be refs_be_debug = {
441 .name = "debug",
442 .init = NULL,
443 .init_db = debug_init_db,
444 +
445 + /*
446 + * None of these should be NULL. If the "files" backend (in
447 + * "struct ref_storage_be refs_be_files" in files-backend.c)
448 + * has a function we should also have a wrapper for it here.
449 + * Test the output with "GIT_TRACE_REFS=1".
450 + */
451 .transaction_prepare = debug_transaction_prepare,
452 .transaction_finish = debug_transaction_finish,
453 .transaction_abort = debug_transaction_abort,
@@ -436,7 +461,7 @@ struct ref_storage_be refs_be_debug = {
461
462 .iterator_begin = debug_ref_iterator_begin,
463 .read_raw_ref = debug_read_raw_ref,
439 - .read_symbolic_ref = NULL,
464 + .read_symbolic_ref = debug_read_symbolic_ref,
465
466 .reflog_iterator_begin = debug_reflog_iterator_begin,
467 .for_each_reflog_ent = debug_for_each_reflog_ent,