diff options
author | Nicolas Pitre <nico@fluxnic.net> | 2010-02-23 15:02:37 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-02-23 13:10:56 -0800 |
commit | f965c525a4d04837b1b7ed43e3fa2dc8c0df4e2b (patch) | |
tree | 7b8cf530834827b86b3bd7ab45e827ab24ce9be7 /pack-write.c | |
parent | 1b22b6c897efa8aec6eeb51f72a73d507d5e336f (diff) | |
download | git-f965c525a4d04837b1b7ed43e3fa2dc8c0df4e2b.tar.gz |
move encode_in_pack_object_header() to a better place
Commit 1b22b6c897 made duplicated versions of encode_header() into a
common version called encode_in_pack_object_header(). There is however
a better location that sha1_file.c for such a function though, as
sha1_file.c contains nothing related to the creation of packs, and
it is quite populated already.
Also the comment that was moved to the header file should really remain
near the function as it covers implementation details and provides no
information about the actual function interface.
Signed-off-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'pack-write.c')
-rw-r--r-- | pack-write.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/pack-write.c b/pack-write.c index 9f47cf9961..a905ca4486 100644 --- a/pack-write.c +++ b/pack-write.c @@ -253,3 +253,30 @@ char *index_pack_lockfile(int ip_out) } return NULL; } + +/* + * The per-object header is a pretty dense thing, which is + * - first byte: low four bits are "size", then three bits of "type", + * and the high bit is "size continues". + * - each byte afterwards: low seven bits are size continuation, + * with the high bit being "size continues" + */ +int encode_in_pack_object_header(enum object_type type, uintmax_t size, unsigned char *hdr) +{ + int n = 1; + unsigned char c; + + if (type < OBJ_COMMIT || type > OBJ_REF_DELTA) + die("bad type %d", type); + + c = (type << 4) | (size & 15); + size >>= 4; + while (size) { + *hdr++ = c | 0x80; + c = size & 0x7f; + size >>= 7; + n++; + } + *hdr = c; + return n; +} |