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; }
struct ref_iterator *cache_ref_iterator_begin(struct ref_cache *cache, const char *prefix, int prime_dir) { struct ref_dir *dir; struct cache_ref_iterator *iter; struct ref_iterator *ref_iterator; struct cache_ref_iterator_level *level; dir = get_ref_dir(cache->root); if (prefix && *prefix) dir = find_containing_dir(dir, prefix, 0); if (!dir) /* There's nothing to iterate over. */ return empty_ref_iterator_begin(); if (prime_dir) prime_ref_dir(dir, prefix); iter = xcalloc(1, sizeof(*iter)); ref_iterator = &iter->base; base_ref_iterator_init(ref_iterator, &cache_ref_iterator_vtable, 1); ALLOC_GROW(iter->levels, 10, iter->levels_alloc); iter->levels_nr = 1; level = &iter->levels[0]; level->index = -1; level->dir = dir; if (prefix && *prefix) { iter->prefix = xstrdup(prefix); level->prefix_state = PREFIX_WITHIN_DIR; } else { level->prefix_state = PREFIX_CONTAINS_DIR; } return ref_iterator; }
static struct ref_iterator *packed_reflog_iterator_begin(struct ref_store *ref_store) { return empty_ref_iterator_begin(); }