Skip to content

Commit

Permalink
[PATCH] Check packs and then files.
Browse files Browse the repository at this point in the history
This reverses the order of object lookup, to check pack index first and
then go to the filesystem to find .git/objects/??/ hierarchy.

When most of the objects are packed, this saves quite many stat() calls
and negative dcache entries; while the price this approach has to pay is
negligible, even when most of the objects are outside pack, because
checking pack index file is quite cheap.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Junio C Hamano authored and Linus Torvalds committed Jul 11, 2005
1 parent 013aab8 commit ab90ea5
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -1035,14 +1035,17 @@ void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size
{
unsigned long mapsize;
void *map, *buf;
struct pack_entry e;

if (find_pack_entry(sha1, &e))
return read_packed_sha1(sha1, type, size);
map = map_sha1_file_internal(sha1, &mapsize);
if (map) {
buf = unpack_sha1_file(map, mapsize, type, size);
munmap(map, mapsize);
return buf;
}
return read_packed_sha1(sha1, type, size);
return NULL;
}

void *read_object_with_reference(const unsigned char *sha1,
Expand Down Expand Up @@ -1343,9 +1346,9 @@ int has_sha1_file(const unsigned char *sha1)
struct stat st;
struct pack_entry e;

if (find_sha1_file(sha1, &st))
if (find_pack_entry(sha1, &e))
return 1;
return find_pack_entry(sha1, &e);
return find_sha1_file(sha1, &st) ? 1 : 0;
}

int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object, const char *type)
Expand Down

0 comments on commit ab90ea5

Please sign in to comment.