Michael Haggerty <mhagger@xxxxxxxxxxxx> writes: > * (And the main goal): Avoid reading and parsing the *whole > `packed-refs` file* (as we do now) every time any part of it is > needed. Instead, use binary search to find the reference and/or > range of references that we want, and parse the info out of the > mmapped image on the fly. Oooohh.... Juicy. > This patch series extracts a `ref_cache` module out of > `files_ref_cache`, and goes some way to disentangling those two > modules, which until now were overly intimate with each other: > > * Remove `verify_refname_available()` from the refs VTABLE, instead > implementing it in a generic way that uses only the usual refs API > to talk to the `ref_store`. > > * Split `ref_cache`-related code into a new module, > `refs/ref-cache.{c,h}`. Encapsulate the data structure in a new > class, `struct ref_cache`. > > * Change the lazy-filling mechanism of `ref_cache` to call back to its > backing `ref_store` via a callback function rather than calling > `read_loose_refs()` directly. Nice. > * Move the special handling of `refs/bisect/` from `ref_cache` to > `files_ref_store`. > > * Make `cache_ref_iterator_begin()` smarter, and change external users > to iterate via this interface instead of using > `do_for_each_entry_in_dir()`. > > Even after this patch series, the modules are still too intimate for > my taste, but I think this is a big step forward, and it is enough to > allow the other changes that I've been working on. > > These patches depend on Duy's nd/files-backend-git-dir branch, v6 [2]. > They are also available from my GitHub fork [1] as branch > `separate-ref-cache`. > > Happily, this patch series actually removes a few more lines than it > adds, mostly thanks to the simpler `verify_refname_available()` > implementation. Thanks.