[PATCH v2 1/7] bulk-checkin: factor out `format_object_header_hash()`
- From
Taylor Blau <me@ttaylorr.com>
- Date
- Oct 17, 2023, 16:31 UTC
- Message-ID
- <edf1cbafc166bce619541cadc1d6fc2c1d9b84d6.1697560266.git.me@ttaylorr.com>
- In-Reply-To
- <cover.1697560266.git.me@ttaylorr.com>
Before deflating a blob into a pack, the bulk-checkin mechanism prepares the pack object header by calling `format_object_header()`, and writing into a scratch buffer, the contents of which eventually makes its way into the pack.
Future commits will add support for deflating multiple kinds of objects into a pack, and will likewise need to perform a similar operation as below.
This is a mostly straightforward extraction, with one notable exception. Instead of hard-coding `the_hash_algo`, pass it in to the new function as an argument. This isn't strictly necessary for our immediate purposes here, but will prove useful in the future if/when the bulk-checkin mechanism grows support for the hash transition plan.
Signed-off-by: Taylor Blau <me@ttaylorr.com> --- bulk-checkin.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-)
diff --git a/bulk-checkin.c b/bulk-checkin.c index 6ce62999e5..fd3c110d1c 100644 --- a/bulk-checkin.c +++ b/bulk-checkin.c @@ -247,6 +247,22 @@ static void prepare_to_stream(struct bulk_checkin_packfile *state, die_errno("unable to write pack header"); } +static void format_object_header_hash(const struct git_hash_algo *algop, + git_hash_ctx *ctx, + struct hashfile_checkpoint *checkpoint, + enum object_type type, + size_t size) +{ + unsigned char header[16384]; + unsigned header_len = format_object_header((char *)header, + sizeof(header), + type, size); + + algop->init_fn(ctx); + algop->update_fn(ctx, header, header_len); + algop->init_fn(&checkpoint->ctx); +} + static int deflate_blob_to_pack(struct bulk_checkin_packfile *state, struct object_id *result_oid, int fd, size_t size, @@ -254,8 +270,6 @@ static int deflate_blob_to_pack(struct bulk_checkin_packfile *state, { off_t seekback, already_hashed_to; git_hash_ctx ctx; - unsigned char obuf[16384]; - unsigned header_len; struct hashfile_checkpoint checkpoint = {0}; struct pack_idx_entry *idx = NULL; @@ -263,11 +277,8 @@ static int deflate_blob_to_pack(struct bulk_checkin_packfile *state, if (seekback == (off_t) -1) return error("cannot find the current offset"); - header_len = format_object_header((char *)obuf, sizeof(obuf), - OBJ_BLOB, size); - the_hash_algo->init_fn(&ctx); - the_hash_algo->update_fn(&ctx, obuf, header_len); - the_hash_algo->init_fn(&checkpoint.ctx); + format_object_header_hash(the_hash_algo, &ctx, &checkpoint, OBJ_BLOB, + size); /* Note: idx is non-NULL when we are writing */ if ((flags & HASH_WRITE_OBJECT) != 0)
-- 2.42.0.405.gdb2a2f287e