From bb6b8e4f877e8b59b3756960e29d1955072dab56 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 17 Jul 2006 15:04:47 -0700 Subject: sha1_file.c: expose map_sha1_file() interface. This exposes map_sha1_file() interface to mmap a loose object file, and legacy_loose_object() function, split from unpack_sha1_header(). They will be used in the next patch to reuse the deflated data from new-style loose object files when generating packs. Signed-off-by: Junio C Hamano --- cache.h | 2 ++ sha1_file.c | 35 ++++++++++++++++++++++------------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/cache.h b/cache.h index eee5fc9f8..01835ef43 100644 --- a/cache.h +++ b/cache.h @@ -240,6 +240,8 @@ extern int move_temp_to_file(const char *tmpfile, char *filename); extern int has_sha1_pack(const unsigned char *sha1); extern int has_sha1_file(const unsigned char *sha1); +extern void *map_sha1_file(const unsigned char *sha1, unsigned long *); +extern int legacy_loose_object(unsigned char *); extern int has_pack_file(const unsigned char *sha1); extern int has_pack_index(const unsigned char *sha1); diff --git a/sha1_file.c b/sha1_file.c index 43bc2ea0c..51e07d5a4 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -646,8 +646,7 @@ int check_sha1_signature(const unsigned char *sha1, void *map, unsigned long siz return memcmp(sha1, real_sha1, 20) ? -1 : 0; } -static void *map_sha1_file_internal(const unsigned char *sha1, - unsigned long *size) +void *map_sha1_file(const unsigned char *sha1, unsigned long *size) { struct stat st; void *map; @@ -684,10 +683,26 @@ static void *map_sha1_file_internal(const unsigned char *sha1, return map; } +int legacy_loose_object(unsigned char *map) +{ + unsigned int word; + + /* + * Is it a zlib-compressed buffer? If so, the first byte + * must be 0x78 (15-bit window size, deflated), and the + * first 16-bit word is evenly divisible by 31 + */ + word = (map[0] << 8) + map[1]; + if (map[0] == 0x78 && !(word % 31)) + return 1; + else + return 0; +} + static int unpack_sha1_header(z_stream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz) { unsigned char c; - unsigned int word, bits; + unsigned int bits; unsigned long size; static const char *typename[8] = { NULL, /* OBJ_EXT */ @@ -703,13 +718,7 @@ static int unpack_sha1_header(z_stream *stream, unsigned char *map, unsigned lon stream->next_out = buffer; stream->avail_out = bufsiz; - /* - * Is it a zlib-compressed buffer? If so, the first byte - * must be 0x78 (15-bit window size, deflated), and the - * first 16-bit word is evenly divisible by 31 - */ - word = (map[0] << 8) + map[1]; - if (map[0] == 0x78 && !(word % 31)) { + if (legacy_loose_object(map)) { inflateInit(stream); return inflate(stream, 0); } @@ -1246,7 +1255,7 @@ int sha1_object_info(const unsigned char *sha1, char *type, unsigned long *sizep z_stream stream; char hdr[128]; - map = map_sha1_file_internal(sha1, &mapsize); + map = map_sha1_file(sha1, &mapsize); if (!map) { struct pack_entry e; @@ -1291,7 +1300,7 @@ void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size if (find_pack_entry(sha1, &e)) return read_packed_sha1(sha1, type, size); - map = map_sha1_file_internal(sha1, &mapsize); + map = map_sha1_file(sha1, &mapsize); if (map) { buf = unpack_sha1_file(map, mapsize, type, size); munmap(map, mapsize); @@ -1629,7 +1638,7 @@ int write_sha1_to_fd(int fd, const unsigned char *sha1) { int retval; unsigned long objsize; - void *buf = map_sha1_file_internal(sha1, &objsize); + void *buf = map_sha1_file(sha1, &objsize); if (buf) { retval = write_buffer(fd, buf, objsize); -- cgit v1.2.1 From ceec1361ebbc4613813ba42976503f5e304cfacf Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 17 Jul 2006 15:06:23 -0700 Subject: pack-objects: reuse deflated data from new-style loose objects. When packing an object without deltifying, if the data is stored in a loose object that is encoded with a new style header, copy it without inflating and deflating. Signed-off-by: Junio C Hamano --- pack-objects.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pack-objects.c b/pack-objects.c index 861c7f08f..e52e9774e 100644 --- a/pack-objects.c +++ b/pack-objects.c @@ -269,6 +269,22 @@ static unsigned long write_object(struct sha1file *f, * and we do not need to deltify it. */ + if (!entry->in_pack && !entry->delta) { + unsigned char *map; + unsigned long mapsize; + map = map_sha1_file(entry->sha1, &mapsize); + if (map && !legacy_loose_object(map)) { + /* We can copy straight into the pack file */ + sha1write(f, map, mapsize); + munmap(map, mapsize); + written++; + reused++; + return mapsize; + } + if (map) + munmap(map, mapsize); + } + if (! to_reuse) { buf = read_sha1_file(entry->sha1, type, &size); if (!buf) -- cgit v1.2.1 From 8e27364128b091e76059229d4f009bc7f869fa9f Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 17 Jul 2006 15:10:10 -0700 Subject: unpack-objects: read configuration data upon startup. With this, unpack-objects will write out the loose objects with new-style headers when core.legacyheaders configuration is set to false. One unfortunate thing is that we still need inflate/deflate cycle when unpacking, even for objects in the pack stream that are not deltified, because it is not possible to determine the boundary of objects in the encoded stream cheaply without inflating it first. Signed-off-by: Junio C Hamano --- unpack-objects.c | 1 + 1 file changed, 1 insertion(+) diff --git a/unpack-objects.c b/unpack-objects.c index 48c1ee796..b23fe58ce 100644 --- a/unpack-objects.c +++ b/unpack-objects.c @@ -266,6 +266,7 @@ int main(int argc, char **argv) unsigned char sha1[20]; setup_git_directory(); + git_config(git_default_config); quiet = !isatty(2); -- cgit v1.2.1