mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-11 10:25:14 +00:00
pack: move the object header function here
This commit is contained in:
parent
cf0582b43c
commit
51e82492ef
@ -228,40 +228,6 @@ int git_packbuilder_insert(git_packbuilder *pb, const git_oid *oid,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The per-object header is a pretty dense thing, which is
|
||||
* - first byte: low four bits are "size",
|
||||
* then three bits of "type",
|
||||
* with the high bit being "size continues".
|
||||
* - each byte afterwards: low seven bits are size continuation,
|
||||
* with the high bit being "size continues"
|
||||
*/
|
||||
static int gen_pack_object_header(
|
||||
unsigned char *hdr,
|
||||
unsigned long size,
|
||||
git_otype type)
|
||||
{
|
||||
unsigned char *hdr_base;
|
||||
unsigned char c;
|
||||
|
||||
assert(type >= GIT_OBJ_COMMIT && type <= GIT_OBJ_REF_DELTA);
|
||||
|
||||
/* TODO: add support for chunked objects; see git.git 6c0d19b1 */
|
||||
|
||||
c = (unsigned char)((type << 4) | (size & 15));
|
||||
size >>= 4;
|
||||
hdr_base = hdr;
|
||||
|
||||
while (size) {
|
||||
*hdr++ = c | 0x80;
|
||||
c = size & 0x7f;
|
||||
size >>= 7;
|
||||
}
|
||||
*hdr++ = c;
|
||||
|
||||
return (int)(hdr - hdr_base);
|
||||
}
|
||||
|
||||
static int get_delta(void **out, git_odb *odb, git_pobject *po)
|
||||
{
|
||||
git_odb_object *src = NULL, *trg = NULL;
|
||||
@ -323,7 +289,7 @@ static int write_object(git_buf *buf, git_packbuilder *pb, git_pobject *po)
|
||||
}
|
||||
|
||||
/* Write header */
|
||||
hdr_len = gen_pack_object_header(hdr, size, type);
|
||||
hdr_len = git_packfile__object_header(hdr, size, type);
|
||||
|
||||
if (git_buf_put(buf, (char *)hdr, hdr_len) < 0)
|
||||
goto on_error;
|
||||
|
32
src/pack.c
32
src/pack.c
@ -364,6 +364,38 @@ static unsigned char *pack_window_open(
|
||||
return git_mwindow_open(&p->mwf, w_cursor, offset, 20, left);
|
||||
}
|
||||
|
||||
/*
|
||||
* The per-object header is a pretty dense thing, which is
|
||||
* - first byte: low four bits are "size",
|
||||
* then three bits of "type",
|
||||
* with the high bit being "size continues".
|
||||
* - each byte afterwards: low seven bits are size continuation,
|
||||
* with the high bit being "size continues"
|
||||
*/
|
||||
int git_packfile__object_header(unsigned char *hdr, unsigned long size, git_otype type)
|
||||
{
|
||||
unsigned char *hdr_base;
|
||||
unsigned char c;
|
||||
|
||||
assert(type >= GIT_OBJ_COMMIT && type <= GIT_OBJ_REF_DELTA);
|
||||
|
||||
/* TODO: add support for chunked objects; see git.git 6c0d19b1 */
|
||||
|
||||
c = (unsigned char)((type << 4) | (size & 15));
|
||||
size >>= 4;
|
||||
hdr_base = hdr;
|
||||
|
||||
while (size) {
|
||||
*hdr++ = c | 0x80;
|
||||
c = size & 0x7f;
|
||||
size >>= 7;
|
||||
}
|
||||
*hdr++ = c;
|
||||
|
||||
return (int)(hdr - hdr_base);
|
||||
}
|
||||
|
||||
|
||||
static int packfile_unpack_header1(
|
||||
unsigned long *usedp,
|
||||
size_t *sizep,
|
||||
|
@ -112,6 +112,8 @@ typedef struct git_packfile_stream {
|
||||
git_mwindow *mw;
|
||||
} git_packfile_stream;
|
||||
|
||||
int git_packfile__object_header(unsigned char *hdr, unsigned long size, git_otype type);
|
||||
|
||||
int git_packfile_unpack_header(
|
||||
size_t *size_p,
|
||||
git_otype *type_p,
|
||||
|
Loading…
Reference in New Issue
Block a user