X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=sha1_name.c;h=f64755fbceea617c424b9b83999eeaa91bf76af1;hb=230f13225df8b7e7eb0acc91a8c630f9e84967c1;hp=8920de1c45ce0a094fbc0b5ea2ca744ef27c6393;hpb=17222001273b817aa9655744a0033619134b1a2c;p=git.git diff --git a/sha1_name.c b/sha1_name.c index 8920de1c..f64755fb 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -91,14 +91,23 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne last = mid; } if (first < num) { - unsigned char now[20]; + unsigned char now[20], next[20]; nth_packed_object_sha1(p, first, now); if (match_sha(len, match, now)) { - if (!found) { - memcpy(found_sha1, now, 20); - found++; + if (nth_packed_object_sha1(p, first+1, next) || + !match_sha(len, match, next)) { + /* unique within this pack */ + if (!found) { + memcpy(found_sha1, now, 20); + found++; + } + else if (memcmp(found_sha1, now, 20)) { + found = 2; + break; + } } - else if (memcmp(found_sha1, now, 20)) { + else { + /* not even unique within this pack */ found = 2; break; } @@ -121,7 +130,7 @@ static int find_unique_short_object(int len, char *canonical, if (!has_unpacked && !has_packed) return -1; if (1 < has_unpacked || 1 < has_packed) - return -1; + return error("short SHA1 %.*s is ambiguous.", len, canonical); if (has_unpacked != has_packed) { memcpy(sha1, (has_packed ? packed_sha1 : unpacked_sha1), 20); return 0;