mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-12 12:00:29 +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;
|
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)
|
static int get_delta(void **out, git_odb *odb, git_pobject *po)
|
||||||
{
|
{
|
||||||
git_odb_object *src = NULL, *trg = NULL;
|
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 */
|
/* 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)
|
if (git_buf_put(buf, (char *)hdr, hdr_len) < 0)
|
||||||
goto on_error;
|
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);
|
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(
|
static int packfile_unpack_header1(
|
||||||
unsigned long *usedp,
|
unsigned long *usedp,
|
||||||
size_t *sizep,
|
size_t *sizep,
|
||||||
|
@ -112,6 +112,8 @@ typedef struct git_packfile_stream {
|
|||||||
git_mwindow *mw;
|
git_mwindow *mw;
|
||||||
} git_packfile_stream;
|
} git_packfile_stream;
|
||||||
|
|
||||||
|
int git_packfile__object_header(unsigned char *hdr, unsigned long size, git_otype type);
|
||||||
|
|
||||||
int git_packfile_unpack_header(
|
int git_packfile_unpack_header(
|
||||||
size_t *size_p,
|
size_t *size_p,
|
||||||
git_otype *type_p,
|
git_otype *type_p,
|
||||||
|
Loading…
Reference in New Issue
Block a user