aboutsummaryrefslogtreecommitdiff
path: root/pack-write.c
diff options
context:
space:
mode:
authorNicolas Pitre <nico@fluxnic.net>2010-02-23 15:02:37 -0500
committerJunio C Hamano <gitster@pobox.com>2010-02-23 13:10:56 -0800
commitf965c525a4d04837b1b7ed43e3fa2dc8c0df4e2b (patch)
tree7b8cf530834827b86b3bd7ab45e827ab24ce9be7 /pack-write.c
parent1b22b6c897efa8aec6eeb51f72a73d507d5e336f (diff)
downloadgit-f965c525a4d04837b1b7ed43e3fa2dc8c0df4e2b.tar.gz
git-f965c525a4d04837b1b7ed43e3fa2dc8c0df4e2b.tar.xz
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.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/pack-write.c b/pack-write.c
index 9f47cf996..a905ca448 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;
+}