diff options
author | Michael Haggerty <mhagger@alum.mit.edu> | 2017-09-25 10:00:14 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-09-25 11:02:46 +0200 |
commit | ba1c052fa616eb93a654375e8b9d59daa47c28a8 (patch) | |
tree | 6f68177a994cd8c597a604850193fe7bdf5913e9 /refs.c | |
parent | packed_read_raw_ref(): read the reference from the mmapped buffer (diff) | |
download | git-ba1c052fa616eb93a654375e8b9d59daa47c28a8.tar.xz git-ba1c052fa616eb93a654375e8b9d59daa47c28a8.zip |
ref_store: implement `refs_peel_ref()` generically
We're about to stop storing packed refs in a `ref_cache`. That means
that the only way we have left to optimize `peel_ref()` is by checking
whether the reference being peeled is the one currently being iterated
over (in `current_ref_iter`), and if so, using `ref_iterator_peel()`.
But this can be done generically; it doesn't have to be implemented
per-backend.
So implement `refs_peel_ref()` in `refs.c` and remove the `peel_ref()`
method from the refs API.
This removes the last callers of a couple of functions, so delete
them. More cleanup to come...
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs.c')
-rw-r--r-- | refs.c | 18 |
1 files changed, 17 insertions, 1 deletions
@@ -1735,7 +1735,23 @@ int refs_pack_refs(struct ref_store *refs, unsigned int flags) int refs_peel_ref(struct ref_store *refs, const char *refname, unsigned char *sha1) { - return refs->be->peel_ref(refs, refname, sha1); + int flag; + unsigned char base[20]; + + if (current_ref_iter && current_ref_iter->refname == refname) { + struct object_id peeled; + + if (ref_iterator_peel(current_ref_iter, &peeled)) + return -1; + hashcpy(sha1, peeled.hash); + return 0; + } + + if (refs_read_ref_full(refs, refname, + RESOLVE_REF_READING, base, &flag)) + return -1; + + return peel_object(base, sha1); } int peel_ref(const char *refname, unsigned char *sha1) |