diff options
author | Junio C Hamano <gitster@pobox.com> | 2011-07-13 14:31:34 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-07-13 14:31:34 -0700 |
commit | 5f2e448370e7c436b9ad7e7c495f4c96630f3e3c (patch) | |
tree | b0a5fd528b996586163a905579f419baea6c6929 /sha1_file.c | |
parent | 3b1d3664f5bec42ea70e71f5c20cb2a64fc1f06b (diff) | |
parent | cc5c54e78b18c2edc42228c06dab22002fa304fa (diff) | |
download | git-5f2e448370e7c436b9ad7e7c495f4c96630f3e3c.tar.gz |
Merge branch 'jc/legacy-loose-object'
* jc/legacy-loose-object:
sha1_file.c: "legacy" is really the current format
Diffstat (limited to 'sha1_file.c')
-rw-r--r-- | sha1_file.c | 62 |
1 files changed, 33 insertions, 29 deletions
diff --git a/sha1_file.c b/sha1_file.c index 8a85217996..bd6fb2f95d 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1205,20 +1205,29 @@ void *map_sha1_file(const unsigned char *sha1, unsigned long *size) return map; } -static int legacy_loose_object(unsigned char *map) +/* + * There used to be a second loose object header format which + * was meant to mimic the in-pack format, allowing for direct + * copy of the object data. This format turned up not to be + * really worth it and we no longer write loose objects in that + * format. + */ +static int experimental_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 + * first 16-bit word is evenly divisible by 31. If so, + * we are looking at the official format, not the experimental + * one. */ word = (map[0] << 8) + map[1]; if (map[0] == 0x78 && !(word % 31)) - return 1; - else return 0; + else + return 1; } unsigned long unpack_object_header_buffer(const unsigned char *buf, @@ -1262,34 +1271,29 @@ int unpack_sha1_header(z_stream *stream, unsigned char *map, unsigned long mapsi stream->next_out = buffer; stream->avail_out = bufsiz; - if (legacy_loose_object(map)) { - git_inflate_init(stream); - return git_inflate(stream, 0); - } - + if (experimental_loose_object(map)) { + /* + * The old experimental format we no longer produce; + * we can still read it. + */ + used = unpack_object_header_buffer(map, mapsize, &type, &size); + if (!used || !valid_loose_object_type[type]) + return -1; + map += used; + mapsize -= used; - /* - * There used to be a second loose object header format which - * was meant to mimic the in-pack format, allowing for direct - * copy of the object data. This format turned up not to be - * really worth it and we don't write it any longer. But we - * can still read it. - */ - used = unpack_object_header_buffer(map, mapsize, &type, &size); - if (!used || !valid_loose_object_type[type]) - return -1; - map += used; - mapsize -= used; + /* Set up the stream for the rest.. */ + stream->next_in = map; + stream->avail_in = mapsize; + git_inflate_init(stream); - /* Set up the stream for the rest.. */ - stream->next_in = map; - stream->avail_in = mapsize; + /* And generate the fake traditional header */ + stream->total_out = 1 + snprintf(buffer, bufsiz, "%s %lu", + typename(type), size); + return 0; + } git_inflate_init(stream); - - /* And generate the fake traditional header */ - stream->total_out = 1 + snprintf(buffer, bufsiz, "%s %lu", - typename(type), size); - return 0; + return git_inflate(stream, 0); } static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size, const unsigned char *sha1) |