Browse Source

Merge branch 'jc/legacy-loose-object'

* jc/legacy-loose-object:
  sha1_file.c: "legacy" is really the current format
maint
Junio C Hamano 14 years ago
parent
commit
5f2e448370
  1. 62
      sha1_file.c

62
sha1_file.c

@ -1205,20 +1205,29 @@ void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
return map; 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; unsigned int word;


/* /*
* Is it a zlib-compressed buffer? If so, the first byte * Is it a zlib-compressed buffer? If so, the first byte
* must be 0x78 (15-bit window size, deflated), and the * 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]; word = (map[0] << 8) + map[1];
if (map[0] == 0x78 && !(word % 31)) if (map[0] == 0x78 && !(word % 31))
return 1;
else
return 0; return 0;
else
return 1;
} }


unsigned long unpack_object_header_buffer(const unsigned char *buf, 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->next_out = buffer;
stream->avail_out = bufsiz; stream->avail_out = bufsiz;


if (legacy_loose_object(map)) { if (experimental_loose_object(map)) {
git_inflate_init(stream); /*
return git_inflate(stream, 0); * 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;


/* /* Set up the stream for the rest.. */
* There used to be a second loose object header format which stream->next_in = map;
* was meant to mimic the in-pack format, allowing for direct stream->avail_in = mapsize;
* copy of the object data. This format turned up not to be git_inflate_init(stream);
* 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.. */ /* And generate the fake traditional header */
stream->next_in = map; stream->total_out = 1 + snprintf(buffer, bufsiz, "%s %lu",
stream->avail_in = mapsize; typename(type), size);
return 0;
}
git_inflate_init(stream); git_inflate_init(stream);

return git_inflate(stream, 0);
/* And generate the fake traditional header */
stream->total_out = 1 + snprintf(buffer, bufsiz, "%s %lu",
typename(type), size);
return 0;
} }


static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size, const unsigned char *sha1) static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size, const unsigned char *sha1)

Loading…
Cancel
Save