Skip to content

Commit

Permalink
sha1_file.c: move the core logic of find_pack_entry() into fill_pack_…
Browse files Browse the repository at this point in the history
…entry()

The new helper function implements the logic to find the offset for the
object in one pack and fill a pack_entry structure. The next patch will
restructure the loop and will call the helper from two places.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Acked-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Nguyễn Thái Ngọc Duy authored and Junio C Hamano committed Feb 1, 2012
1 parent 828ea97 commit 9509973
Showing 1 changed file with 35 additions and 26 deletions.
61 changes: 35 additions & 26 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -2010,47 +2010,56 @@ int is_pack_valid(struct packed_git *p)
return !open_packed_git(p);
}

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)) {
warning("packfile %s cannot be accessed", p->pack_name);
return 0;
}
e->offset = offset;
e->p = p;
hashcpy(e->sha1, sha1);
return 1;
}

static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e)
{
static struct packed_git *last_found = (void *)1;
struct packed_git *p;
off_t offset;

prepare_packed_git();
if (!packed_git)
return 0;
p = (last_found == (void *)1) ? packed_git : last_found;

do {
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))
goto next;
}

offset = find_pack_entry_one(sha1, p);
if (offset) {
/*
* 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)) {
warning("packfile %s cannot be accessed", p->pack_name);
goto next;
}
e->offset = offset;
e->p = p;
hashcpy(e->sha1, sha1);
if (fill_pack_entry(sha1, e, p)) {
last_found = p;
return 1;
}

next:
if (p == last_found)
p = packed_git;
else
Expand Down

0 comments on commit 9509973

Please sign in to comment.