+static int unique_in_pack(int len,
+ const unsigned char *match,
+ struct packed_git *p,
+ const unsigned char **found_sha1,
+ int seen_so_far)
+{
+ uint32_t num, last, i, first = 0;
+ const unsigned char *current = NULL;
+
+ open_pack_index(p);
+ num = p->num_objects;
+ last = num;
+ while (first < last) {
+ uint32_t mid = (first + last) / 2;
+ const unsigned char *current;
+ int cmp;
+
+ current = nth_packed_object_sha1(p, mid);
+ cmp = hashcmp(match, current);
+ if (!cmp) {
+ first = mid;
+ break;
+ }
+ if (cmp > 0) {
+ first = mid+1;
+ continue;
+ }
+ last = mid;
+ }
+
+ /*
+ * At this point, "first" is the location of the lowest object
+ * with an object name that could match "match". See if we have
+ * 0, 1 or more objects that actually match(es).
+ */
+ for (i = first; i < num; i++) {
+ current = nth_packed_object_sha1(p, first);
+ if (!match_sha(len, match, current))
+ break;
+
+ /* current matches */
+ if (!seen_so_far) {
+ *found_sha1 = current;
+ seen_so_far++;
+ } else if (seen_so_far) {
+ /* is it the same as the one previously found elsewhere? */
+ if (hashcmp(*found_sha1, current))
+ return 2; /* definitely not unique */
+ }
+ }
+ return seen_so_far;
+}
+