[PATCH 02/16] sha1_file: refactor into `find_pack_object_pos`
flat view
STALE3777d
From: Vicent Marti <hidden>
Date: 2016-06-15 22:57:54
Subsystem:
the rest · Maintainer:
Linus Torvalds
Looking up the offset in the packfile for a given SHA1 involves the following: - Finding the position in the index for the given SHA1 - Accessing the offset cache in the index for the found position There are cases however where we'd like to find the position of a SHA1 in the index without looking up the packfile offset (e.g. when accessing information that has been indexed based on index offsets). This refactoring implements `find_pack_object_pos`, returning the position in the index, and re-implements `find_pack_entry_one`(returning the actual offset in the packfile) to use the new function. --- cache.h | 1 + sha1_file.c | 27 +++++++++++++++++---------- 2 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/cache.h b/cache.h
index ec8240f..a29645e 100644
--- a/cache.h
+++ b/cache.h@@ -1101,6 +1101,7 @@ extern void clear_delta_base_cache(void); extern struct packed_git *add_packed_git(const char *, int, int); extern const unsigned char *nth_packed_object_sha1(struct packed_git *, uint32_t); extern off_t nth_packed_object_offset(const struct packed_git *, uint32_t); +extern int find_pack_entry_pos(const unsigned char *sha1, struct packed_git *p); extern off_t find_pack_entry_one(const unsigned char *, struct packed_git *); extern int is_pack_valid(struct packed_git *); extern void *unpack_entry(struct packed_git *, off_t, enum object_type *, unsigned long *);
diff --git a/sha1_file.c b/sha1_file.c
index 0af19c0..371e295 100644
--- a/sha1_file.c
+++ b/sha1_file.c@@ -2205,8 +2205,7 @@ off_t nth_packed_object_offset(const struct packed_git *p, uint32_t n) } } -off_t find_pack_entry_one(const unsigned char *sha1, - struct packed_git *p) +int find_pack_entry_pos(const unsigned char *sha1, struct packed_git *p) { const uint32_t *level1_ofs = p->index_data; const unsigned char *index = p->index_data;
@@ -2219,7 +2218,7 @@ off_t find_pack_entry_one(const unsigned char *sha1, if (!index) { if (open_pack_index(p)) - return 0; + return -1; level1_ofs = p->index_data; index = p->index_data; }
@@ -2243,12 +2242,9 @@ off_t find_pack_entry_one(const unsigned char *sha1, if (use_lookup < 0) use_lookup = !!getenv("GIT_USE_LOOKUP"); + if (use_lookup) { - int pos = sha1_entry_pos(index, stride, 0, - lo, hi, p->num_objects, sha1); - if (pos < 0) - return 0; - return nth_packed_object_offset(p, pos); + return sha1_entry_pos(index, stride, 0, lo, hi, p->num_objects, sha1); } do {
@@ -2259,13 +2255,24 @@ off_t find_pack_entry_one(const unsigned char *sha1, printf("lo %u hi %u rg %u mi %u\n", lo, hi, hi - lo, mi); if (!cmp) - return nth_packed_object_offset(p, mi); + return mi; if (cmp > 0) hi = mi; else lo = mi+1; } while (lo < hi); - return 0; + + return -1; +} + +off_t find_pack_entry_one(const unsigned char *sha1, struct packed_git *p) +{ + int pos; + + if ((pos = find_pack_entry_pos(sha1, p)) < 0) + return 0; + + return nth_packed_object_offset(p, (uint32_t)pos); } int is_pack_valid(struct packed_git *p)
--
1.7.9.5