From: Nicolas Pitre Date: Wed, 16 Jul 2008 06:31:36 +0000 (-0400) Subject: clean up and optimize nth_packed_object_sha1() usage X-Git-Tag: v1.4.4.5~3 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=3205364fc4c1565a587f0f4f1751f4ebd1bc5c12;p=git.git clean up and optimize nth_packed_object_sha1() usage Let's avoid the open coded pack index reference in pack-object and use nth_packed_object_sha1() instead. This will help encapsulating index format differences in one place. And while at it there is no reason to copy SHA1's over and over while a direct pointer to it in the index will do just fine. (based on commit d72308e01c5977177cda0aed06cfeee9192e1247) Signed-off-by: Nicolas Pitre Signed-off-by: Junio C Hamano --- diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c index ae051f90a..4c345d5d6 100644 --- a/builtin-pack-objects.c +++ b/builtin-pack-objects.c @@ -227,7 +227,7 @@ static const unsigned char *find_packed_object_name(struct packed_git *p, unsigned long ofs) { struct revindex_entry *entry = find_packed_object(p, ofs); - return ((unsigned char *)p->index_data) + 4 * 256 + 24 * entry->nr + 4; + return nth_packed_object_sha1(p, entry->nr); } static void *delta_against(void *buf, unsigned long size, struct object_entry *entry) diff --git a/cache.h b/cache.h index cc8e84e7f..191c738ed 100644 --- a/cache.h +++ b/cache.h @@ -388,7 +388,7 @@ extern int use_packed_git(struct packed_git *); extern void unuse_packed_git(struct packed_git *); extern struct packed_git *add_packed_git(char *, int, int); extern int num_packed_objects(const struct packed_git *p); -extern int nth_packed_object_sha1(const struct packed_git *, int, unsigned char*); +extern const unsigned char *nth_packed_object_sha1(const struct packed_git *, unsigned int); extern unsigned long find_pack_entry_one(const unsigned char *, struct packed_git *); extern void *unpack_entry_gently(struct packed_git *, unsigned long, char *, unsigned long *); extern unsigned long unpack_object_header_gently(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep); diff --git a/fsck-objects.c b/fsck-objects.c index 46b628cb9..f6015a80f 100644 --- a/fsck-objects.c +++ b/fsck-objects.c @@ -289,7 +289,7 @@ static int fsck_tag(struct tag *tag) return 0; } -static int fsck_sha1(unsigned char *sha1) +static int fsck_sha1(const unsigned char *sha1) { struct object *obj = parse_object(sha1); if (!obj) @@ -551,11 +551,8 @@ int main(int argc, char **argv) for (p = packed_git; p; p = p->next) { int num = num_packed_objects(p); - for (i = 0; i < num; i++) { - unsigned char sha1[20]; - nth_packed_object_sha1(p, i, sha1); - fsck_sha1(sha1); - } + for (i = 0; i < num; i++) + fsck_sha1(nth_packed_object_sha1(p, i)); } } diff --git a/pack-check.c b/pack-check.c index 7db44e91c..11f6ed211 100644 --- a/pack-check.c +++ b/pack-check.c @@ -51,12 +51,13 @@ static int verify_packfile(struct packed_git *p) * we do not do scan-streaming check on the pack file. */ for (i = err = 0; i < nr_objects; i++) { - unsigned char sha1[20]; + const unsigned char *sha1; void *data; char type[20]; unsigned long size, offset; - if (nth_packed_object_sha1(p, i, sha1)) + sha1 = nth_packed_object_sha1(p, i); + if (!sha1) die("internal error pack-check nth-packed-object"); offset = find_pack_entry_one(sha1, p); if (!offset) @@ -93,14 +94,16 @@ static void show_pack_info(struct packed_git *p) memset(chain_histogram, 0, sizeof(chain_histogram)); for (i = 0; i < nr_objects; i++) { - unsigned char sha1[20], base_sha1[20]; + const unsigned char *sha1; + unsigned char base_sha1[20]; char type[20]; unsigned long size; unsigned long store_size; unsigned long offset; unsigned int delta_chain_length; - if (nth_packed_object_sha1(p, i, sha1)) + sha1 = nth_packed_object_sha1(p, i); + if (!sha1) die("internal error pack-check nth-packed-object"); offset = find_pack_entry_one(sha1, p); if (!offset) diff --git a/sha1_file.c b/sha1_file.c index df31462a1..b4c5209d6 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1177,15 +1177,14 @@ int num_packed_objects(const struct packed_git *p) return (p->index_size - 20 - 20 - 4*256) / 24; } -int nth_packed_object_sha1(const struct packed_git *p, int n, - unsigned char* sha1) +const unsigned char *nth_packed_object_sha1(const struct packed_git *p, + unsigned int n) { const unsigned char *index = p->index_data; index += 4 * 256; - if (n < 0 || num_packed_objects(p) <= n) - return -1; - hashcpy(sha1, index + 24 * n + 4); - return 0; + if (num_packed_objects(p) <= n) + return NULL; + return index + 24 * n + 4; } unsigned long find_pack_entry_one(const unsigned char *sha1, diff --git a/sha1_name.c b/sha1_name.c index 6d7cd7838..d083096e2 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -71,7 +71,7 @@ static int match_sha(unsigned len, const unsigned char *a, const unsigned char * static int find_short_packed_object(int len, const unsigned char *match, unsigned char *sha1) { struct packed_git *p; - unsigned char found_sha1[20]; + const unsigned char *found_sha1 = NULL; int found = 0; prepare_packed_git(); @@ -80,10 +80,10 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne unsigned first = 0, last = num; while (first < last) { unsigned mid = (first + last) / 2; - unsigned char now[20]; + const unsigned char *now; int cmp; - nth_packed_object_sha1(p, mid, now); + now = nth_packed_object_sha1(p, mid); cmp = hashcmp(match, now); if (!cmp) { first = mid; @@ -96,14 +96,14 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne last = mid; } if (first < num) { - unsigned char now[20], next[20]; - nth_packed_object_sha1(p, first, now); + const unsigned char *now, *next; + now = nth_packed_object_sha1(p, first); if (match_sha(len, match, now)) { - if (nth_packed_object_sha1(p, first+1, next) || - !match_sha(len, match, next)) { + next = nth_packed_object_sha1(p, first+1); + if (!next|| !match_sha(len, match, next)) { /* unique within this pack */ if (!found) { - hashcpy(found_sha1, now); + found_sha1 = now; found++; } else if (hashcmp(found_sha1, now)) {