Michael Haggerty <[email protected]> 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.