Code

[PATCH] Check packs and then files.
authorJunio C Hamano <junkio@cox.net>
Mon, 11 Jul 2005 07:00:55 +0000 (00:00 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 11 Jul 2005 17:13:09 +0000 (10:13 -0700)
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>
sha1_file.c

index 6b9462cfba60764abf3956de45185e0e418ff82a..5ec5598d7d6cd56ebb40b21c497c0ae3db1dca57 100644 (file)
@@ -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,
@@ -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)