X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=pack-write.c;h=a905ca4486754f099a30f90a2fcd22d0c771a070;hb=452c6d506b1a6dcf24d4ceaa592afc39c1c1a60e;hp=741efcd93bd2a2c105bfe2d771d32857ce2ae816;hpb=a42332c21723fde9f36b579f6b39a23aa1aac137;p=git.git diff --git a/pack-write.c b/pack-write.c index 741efcd93..a905ca448 100644 --- a/pack-write.c +++ b/pack-write.c @@ -17,8 +17,8 @@ static int sha1_compare(const void *_a, const void *_b) * the SHA1 hash of sorted object names. The objects array passed in * will be sorted by SHA1 on exit. */ -char *write_idx_file(char *index_name, struct pack_idx_entry **objects, - int nr_objects, unsigned char *sha1) +const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects, + int nr_objects, unsigned char *sha1) { struct sha1file *f; struct pack_idx_entry **sorted_by_sha, **list, **last; @@ -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; +}