/* * Call fn for each reference in the specified submodule for which the * refname begins with prefix. If trim is non-zero, then trim that * many characters off the beginning of each refname before passing * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to * include broken references in the iteration. If fn ever returns a * non-zero value, stop the iteration and return that value; * otherwise, return 0. */ static int do_for_each_ref(const char *submodule, const char *prefix, each_ref_fn fn, int trim, int flags, void *cb_data) { struct ref_iterator *iter; iter = files_ref_iterator_begin(submodule, prefix, flags); iter = prefix_ref_iterator_begin(iter, prefix, trim); return do_for_each_ref_iterator(iter, fn, cb_data); }
/* * Call fn for each reference in the specified submodule for which the * refname begins with prefix. If trim is non-zero, then trim that * many characters off the beginning of each refname before passing * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to * include broken references in the iteration. If fn ever returns a * non-zero value, stop the iteration and return that value; * otherwise, return 0. */ static int do_for_each_ref(struct ref_store *refs, const char *prefix, each_ref_fn fn, int trim, int flags, void *cb_data) { struct ref_iterator *iter; if (!refs) return 0; iter = refs->be->iterator_begin(refs, prefix, flags); iter = prefix_ref_iterator_begin(iter, prefix, trim); return do_for_each_ref_iterator(iter, fn, cb_data); }
static struct ref_iterator *packed_ref_iterator_begin( struct ref_store *ref_store, const char *prefix, unsigned int flags) { struct packed_ref_store *refs; struct snapshot *snapshot; const char *start; struct packed_ref_iterator *iter; struct ref_iterator *ref_iterator; unsigned int required_flags = REF_STORE_READ; if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) required_flags |= REF_STORE_ODB; refs = packed_downcast(ref_store, required_flags, "ref_iterator_begin"); /* * Note that `get_snapshot()` internally checks whether the * snapshot is up to date with what is on disk, and re-reads * it if not. */ snapshot = get_snapshot(refs); if (!snapshot->buf) return empty_ref_iterator_begin(); iter = xcalloc(1, sizeof(*iter)); ref_iterator = &iter->base; base_ref_iterator_init(ref_iterator, &packed_ref_iterator_vtable, 1); iter->snapshot = snapshot; acquire_snapshot(snapshot); if (prefix && *prefix) start = find_reference_location(snapshot, prefix, 0); else start = snapshot->buf + snapshot->header_len; iter->pos = start; iter->eof = snapshot->eof; strbuf_init(&iter->refname_buf, 0); iter->base.oid = &iter->oid; iter->flags = flags; if (prefix && *prefix) /* Stop iteration after we've gone *past* prefix: */ ref_iterator = prefix_ref_iterator_begin(ref_iterator, prefix, 0); return ref_iterator; }