Browse Source

Make sure get_sha1 does not accept ambiguous sha1 prefix (again).

The earlier fix incorrectly dropped the code the original had to
ensure the found SHA1 is at least unique within the same pack.
Restore the check.

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 20 years ago
parent
commit
0bc4589020
  1. 21
      sha1_name.c

21
sha1_name.c

@ -91,14 +91,23 @@ static int find_short_packed_object(int len, const unsigned char *match, unsigne @@ -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, @@ -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;

Loading…
Cancel
Save