X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=sha1_name.c;h=2d727d54dc43c23cb2fe19369d58e57e2a020ca9;hb=5701115aa7cfe7edd57c2483085456a37e27a5ba;hp=bede0e5b0659db31a1dfdaab3d17627199150ea7;hpb=2603fa5fb358ee7834bc9e1a2e391f69d8fce815;p=git.git diff --git a/sha1_name.c b/sha1_name.c index bede0e5b0..2d727d54d 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -71,19 +71,22 @@ 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(); for (p = packed_git; p && found < 2; p = p->next) { - uint32_t num = num_packed_objects(p); - uint32_t first = 0, last = num; + uint32_t num, last; + uint32_t first = 0; + open_pack_index(p); + num = p->num_objects; + last = num; while (first < last) { uint32_t 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 +99,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)) { @@ -133,6 +136,7 @@ static int find_unique_short_object(int len, char *canonical, int has_unpacked, has_packed; unsigned char unpacked_sha1[20], packed_sha1[20]; + prepare_alt_odb(); has_unpacked = find_short_object_filename(len, canonical, unpacked_sha1); has_packed = find_short_packed_object(len, res, packed_sha1); if (!has_unpacked && !has_packed) @@ -366,7 +370,7 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1) fprintf(stderr, "warning: Log for '%.*s' only goes " "back to %s.\n", len, str, - show_rfc2822_date(co_time, co_tz)); + show_date(co_time, co_tz, DATE_RFC2822)); else fprintf(stderr, "warning: Log for '%.*s' only has " @@ -643,12 +647,17 @@ static int get_sha1_oneline(const char *prefix, unsigned char *sha1) */ int get_sha1(const char *name, unsigned char *sha1) { - int ret, bracket_depth; unsigned unused; + return get_sha1_with_mode(name, sha1, &unused); +} + +int get_sha1_with_mode(const char *name, unsigned char *sha1, unsigned *mode) +{ + int ret, bracket_depth; int namelen = strlen(name); const char *cp; - prepare_alt_odb(); + *mode = S_IFINVALID; ret = get_sha1_1(name, namelen, sha1); if (!ret) return ret; @@ -673,8 +682,6 @@ int get_sha1(const char *name, unsigned char *sha1) namelen = namelen - (cp - name); if (!active_cache) read_cache(); - if (active_nr < 0) - return -1; pos = cache_name_pos(cp, namelen); if (pos < 0) pos = -pos - 1; @@ -685,6 +692,7 @@ int get_sha1(const char *name, unsigned char *sha1) break; if (ce_stage(ce) == stage) { hashcpy(sha1, ce->sha1); + *mode = ntohl(ce->ce_mode); return 0; } pos++; @@ -703,7 +711,7 @@ int get_sha1(const char *name, unsigned char *sha1) unsigned char tree_sha1[20]; if (!get_sha1_1(name, cp-name, tree_sha1)) return get_tree_entry(tree_sha1, cp+1, sha1, - &unused); + mode); } return ret; }