diff options
author | Jonathan Tan <jonathantanmy@google.com> | 2017-08-18 15:20:35 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-08-23 15:12:07 -0700 |
commit | 1a1e5d4f47fd77dec1b7e7ef0867939a251252b6 (patch) | |
tree | 686d489255d76713b976930c851745b4c5e7422a /packfile.c | |
parent | d6fe0036fd5e0cf7f51aa84381ebd321e898350a (diff) | |
download | git-1a1e5d4f47fd77dec1b7e7ef0867939a251252b6.tar.gz |
pack: move find_pack_entry() and make it global
This function needs to be global as it is used by sha1_file.c and will
be used by packfile.c.
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'packfile.c')
-rw-r--r-- | packfile.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/packfile.c b/packfile.c index 135e95cb2e..22bdbbcf2c 100644 --- a/packfile.c +++ b/packfile.c @@ -1787,3 +1787,56 @@ struct packed_git *find_sha1_pack(const unsigned char *sha1, return NULL; } + +static int fill_pack_entry(const unsigned char *sha1, + struct pack_entry *e, + struct packed_git *p) +{ + off_t offset; + + if (p->num_bad_objects) { + unsigned i; + for (i = 0; i < p->num_bad_objects; i++) + if (!hashcmp(sha1, p->bad_object_sha1 + 20 * i)) + return 0; + } + + offset = find_pack_entry_one(sha1, p); + if (!offset) + return 0; + + /* + * We are about to tell the caller where they can locate the + * requested object. We better make sure the packfile is + * still here and can be accessed before supplying that + * answer, as it may have been deleted since the index was + * loaded! + */ + if (!is_pack_valid(p)) + return 0; + e->offset = offset; + e->p = p; + hashcpy(e->sha1, sha1); + return 1; +} + +/* + * Iff a pack file contains the object named by sha1, return true and + * store its location to e. + */ +int find_pack_entry(const unsigned char *sha1, struct pack_entry *e) +{ + struct mru_entry *p; + + prepare_packed_git(); + if (!packed_git) + return 0; + + for (p = packed_git_mru->head; p; p = p->next) { + if (fill_pack_entry(sha1, e, p->item)) { + mru_mark(packed_git_mru, p); + return 1; + } + } + return 0; +} |