diff options
author | Michael Haggerty <mhagger@alum.mit.edu> | 2018-01-24 12:14:14 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-01-24 12:55:26 -0800 |
commit | f34242975fae1468dd94d31289d27f68853a28fb (patch) | |
tree | 2089da2e073c4a2f5d98add5f86b4f31ce7e5174 | |
parent | 4a14f8d093138a313070fd6a50204eda66c1f9eb (diff) | |
download | git-f34242975fae1468dd94d31289d27f68853a28fb.tar.gz |
packed_ref_iterator_begin(): make optimization more general
We can return an empty iterator not only if the `packed-refs` file is
missing, but also if it is empty or if there are no references whose
names succeed `prefix`. Optimize away those cases as well by moving
the call to `find_reference_location()` higher in the function and
checking whether the determined start position is the same as
`snapshot->eof`. (This is possible now because the previous commit
made `find_reference_location()` robust against empty snapshots.)
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | refs/packed-backend.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/refs/packed-backend.c b/refs/packed-backend.c index fffface428..c2efe912cc 100644 --- a/refs/packed-backend.c +++ b/refs/packed-backend.c @@ -927,7 +927,12 @@ static struct ref_iterator *packed_ref_iterator_begin( */ snapshot = get_snapshot(refs); - if (!snapshot->buf) + if (prefix && *prefix) + start = find_reference_location(snapshot, prefix, 0); + else + start = snapshot->start; + + if (start == snapshot->eof) return empty_ref_iterator_begin(); iter = xcalloc(1, sizeof(*iter)); @@ -937,11 +942,6 @@ static struct ref_iterator *packed_ref_iterator_begin( iter->snapshot = snapshot; acquire_snapshot(snapshot); - if (prefix && *prefix) - start = find_reference_location(snapshot, prefix, 0); - else - start = snapshot->start; - iter->pos = start; iter->eof = snapshot->eof; strbuf_init(&iter->refname_buf, 0); |