return parse_sha1_header_extended(hdr, &oi, 0);
}
-static int fill_pack_entry(const unsigned char *sha1,
- struct pack_entry *e,
- struct packed_git *p)
-{
- off_t offset;
-
- if (p->num_bad_objects) {
- unsigned i;
- for (i = 0; i < p->num_bad_objects; i++)
- if (!hashcmp(sha1, p->bad_object_sha1 + 20 * i))
- return 0;
- }
-
- offset = find_pack_entry_one(sha1, p);
- if (!offset)
- return 0;
-
- /*
- * We are about to tell the caller where they can locate the
- * requested object. We better make sure the packfile is
- * still here and can be accessed before supplying that
- * answer, as it may have been deleted since the index was
- * loaded!
- */
- if (!is_pack_valid(p))
- return 0;
- e->offset = offset;
- e->p = p;
- hashcpy(e->sha1, sha1);
- return 1;
-}
-
-/*
- * Iff a pack file contains the object named by sha1, return true and
- * store its location to e.
- */
-static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e)
-{
- struct mru_entry *p;
-
- prepare_packed_git();
- if (!packed_git)
- return 0;
-
- for (p = packed_git_mru->head; p; p = p->next) {
- if (fill_pack_entry(sha1, e, p->item)) {
- mru_mark(packed_git_mru, p);
- return 1;
- }
- }
- return 0;
-}
-
-struct packed_git *find_sha1_pack(const unsigned char *sha1,
- struct packed_git *packs)
-{
- struct packed_git *p;
-
- for (p = packs; p; p = p->next) {
- if (find_pack_entry_one(sha1, p))
- return p;
- }
- return NULL;
-
-}
-
static int sha1_loose_object_info(const unsigned char *sha1,
struct object_info *oi,
int flags)
return ret;
}
-int has_pack_index(const unsigned char *sha1)
-{
- struct stat st;
- if (stat(sha1_pack_index_name(sha1), &st))
- return 0;
- return 1;
-}
-
-int has_sha1_pack(const unsigned char *sha1)
-{
- struct pack_entry e;
- return find_pack_entry(sha1, &e);
-}
-
int has_sha1_file_with_flags(const unsigned char *sha1, int flags)
{
if (!startup_info->have_repository)
return foreach_alt_odb(loose_from_alt_odb, &alt);
}
-static int for_each_object_in_pack(struct packed_git *p, each_packed_object_fn cb, void *data)
-{
- uint32_t i;
- int r = 0;
-
- for (i = 0; i < p->num_objects; i++) {
- struct object_id oid;
-
- if (!nth_packed_object_oid(&oid, p, i))
- return error("unable to get sha1 of object %u in %s",
- i, p->pack_name);
-
- r = cb(&oid, p, i, data);
- if (r)
- break;
- }
- return r;
-}
-
-int for_each_packed_object(each_packed_object_fn cb, void *data, unsigned flags)
-{
- struct packed_git *p;
- int r = 0;
- int pack_errors = 0;
-
- prepare_packed_git();
- for (p = packed_git; p; p = p->next) {
- if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local)
- continue;
- if (open_pack_index(p)) {
- pack_errors = 1;
- continue;
- }
- r = for_each_object_in_pack(p, cb, data);
- if (r)
- break;
- }
- return r ? r : pack_errors;
-}
-
static int check_stream_sha1(git_zstream *stream,
const char *hdr,
unsigned long size,