The bulk-checkin subsystem depends on `the_repository`. Adapt functions and call sites to wire the repository variable where needed. The `USE_THE_REPOSITORY_VARIBALE` is still required as the `pack_compression_level` and `pack_size_limit_cfg` globals are still used. Signed-off-by: Justin Tobler <jltobler@xxxxxxxxx> --- bulk-checkin.c | 58 ++++++++++++++++++++++++++++---------------------- bulk-checkin.h | 3 ++- object-file.c | 3 ++- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/bulk-checkin.c b/bulk-checkin.c index 53a20a2d92f..a1185883837 100644 --- a/bulk-checkin.c +++ b/bulk-checkin.c @@ -38,7 +38,8 @@ struct odb_transaction { struct bulk_checkin_packfile packfile; }; -static void finish_tmp_packfile(struct strbuf *basename, +static void finish_tmp_packfile(struct repository *repo, + struct strbuf *basename, const char *pack_tmp_name, struct pack_idx_entry **written_list, uint32_t nr_written, @@ -47,15 +48,16 @@ static void finish_tmp_packfile(struct strbuf *basename, { char *idx_tmp_name = NULL; - stage_tmp_packfiles(the_repository, basename, pack_tmp_name, + stage_tmp_packfiles(repo, basename, pack_tmp_name, written_list, nr_written, NULL, pack_idx_opts, hash, &idx_tmp_name); - rename_tmp_packfile_idx(the_repository, basename, &idx_tmp_name); + rename_tmp_packfile_idx(repo, basename, &idx_tmp_name); free(idx_tmp_name); } -static void flush_bulk_checkin_packfile(struct bulk_checkin_packfile *state) +static void flush_bulk_checkin_packfile(struct bulk_checkin_packfile *state, + struct repository *repo) { unsigned char hash[GIT_MAX_RAWSZ]; struct strbuf packname = STRBUF_INIT; @@ -73,15 +75,15 @@ static void flush_bulk_checkin_packfile(struct bulk_checkin_packfile *state) CSUM_HASH_IN_STREAM | CSUM_FSYNC | CSUM_CLOSE); } else { int fd = finalize_hashfile(state->f, hash, FSYNC_COMPONENT_PACK, 0); - fixup_pack_header_footer(the_hash_algo, fd, hash, state->pack_tmp_name, + fixup_pack_header_footer(repo->hash_algo, fd, hash, state->pack_tmp_name, state->nr_written, hash, state->offset); close(fd); } - strbuf_addf(&packname, "%s/pack/pack-%s.", repo_get_object_directory(the_repository), - hash_to_hex(hash)); - finish_tmp_packfile(&packname, state->pack_tmp_name, + strbuf_addf(&packname, "%s/pack/pack-%s.", repo_get_object_directory(repo), + hash_to_hex_algop(hash, repo->hash_algo)); + finish_tmp_packfile(repo, &packname, state->pack_tmp_name, state->written, state->nr_written, &state->pack_idx_opts, hash); for (uint32_t i = 0; i < state->nr_written; i++) @@ -94,7 +96,7 @@ static void flush_bulk_checkin_packfile(struct bulk_checkin_packfile *state) strbuf_release(&packname); /* Make objects we just wrote available to ourselves */ - reprepare_packed_git(the_repository); + reprepare_packed_git(repo); } /* @@ -117,7 +119,8 @@ static void flush_batch_fsync(struct odb_transaction *transaction) * to ensure that the data in each new object file is durable before * the final name is visible. */ - strbuf_addf(&temp_path, "%s/bulk_fsync_XXXXXX", repo_get_object_directory(the_repository)); + strbuf_addf(&temp_path, "%s/bulk_fsync_XXXXXX", + repo_get_object_directory(transaction->odb->repo)); temp = xmks_tempfile(temp_path.buf); fsync_or_die(get_tempfile_fd(temp), get_tempfile_path(temp)); delete_tempfile(&temp); @@ -131,10 +134,11 @@ static void flush_batch_fsync(struct odb_transaction *transaction) transaction->objdir = NULL; } -static int already_written(struct bulk_checkin_packfile *state, struct object_id *oid) +static int already_written(struct bulk_checkin_packfile *state, + struct repository *repo, struct object_id *oid) { /* The object may already exist in the repository */ - if (odb_has_object(the_repository->objects, oid, + if (odb_has_object(repo->objects, oid, HAS_OBJECT_RECHECK_PACKED | HAS_OBJECT_FETCH_PROMISOR)) return 1; @@ -240,12 +244,13 @@ static int stream_blob_to_pack(struct bulk_checkin_packfile *state, /* Lazily create backing packfile for the state */ static void prepare_to_stream(struct bulk_checkin_packfile *state, + struct repository *repo, unsigned flags) { if (!(flags & INDEX_WRITE_OBJECT) || state->f) return; - state->f = create_tmp_packfile(the_repository, &state->pack_tmp_name); + state->f = create_tmp_packfile(repo, &state->pack_tmp_name); reset_pack_idx_option(&state->pack_idx_opts); /* Pretend we are going to write only one object */ @@ -255,6 +260,7 @@ static void prepare_to_stream(struct bulk_checkin_packfile *state, } static int deflate_blob_to_pack(struct bulk_checkin_packfile *state, + struct repository *repo, struct object_id *result_oid, int fd, size_t size, const char *path, unsigned flags) @@ -272,21 +278,21 @@ static int deflate_blob_to_pack(struct bulk_checkin_packfile *state, header_len = format_object_header((char *)obuf, sizeof(obuf), OBJ_BLOB, size); - the_hash_algo->init_fn(&ctx); + repo->hash_algo->init_fn(&ctx); git_hash_update(&ctx, obuf, header_len); /* Note: idx is non-NULL when we are writing */ if ((flags & INDEX_WRITE_OBJECT) != 0) { CALLOC_ARRAY(idx, 1); - prepare_to_stream(state, flags); + prepare_to_stream(state, repo, flags); hashfile_checkpoint_init(state->f, &checkpoint); } already_hashed_to = 0; while (1) { - prepare_to_stream(state, flags); + prepare_to_stream(state, repo, flags); if (idx) { hashfile_checkpoint(state->f, &checkpoint); idx->offset = state->offset; @@ -304,7 +310,7 @@ static int deflate_blob_to_pack(struct bulk_checkin_packfile *state, BUG("should not happen"); hashfile_truncate(state->f, &checkpoint); state->offset = checkpoint.offset; - flush_bulk_checkin_packfile(state); + flush_bulk_checkin_packfile(state, repo); if (lseek(fd, seekback, SEEK_SET) == (off_t) -1) return error("cannot seek back"); } @@ -313,7 +319,7 @@ static int deflate_blob_to_pack(struct bulk_checkin_packfile *state, return 0; idx->crc32 = crc32_end(state->f); - if (already_written(state, result_oid)) { + if (already_written(state, repo, result_oid)) { hashfile_truncate(state->f, &checkpoint); state->offset = checkpoint.offset; free(idx); @@ -338,7 +344,7 @@ void prepare_loose_object_bulk_checkin(struct odb_transaction *transaction) if (!transaction || transaction->objdir) return; - transaction->objdir = tmp_objdir_create(the_repository, "bulk-fsync"); + transaction->objdir = tmp_objdir_create(transaction->odb->repo, "bulk-fsync"); if (transaction->objdir) tmp_objdir_replace_primary_odb(transaction->objdir, 0); } @@ -361,20 +367,21 @@ void fsync_loose_object_bulk_checkin(struct odb_transaction *transaction, } } -int index_blob_bulk_checkin(struct odb_transaction *transaction, +int index_blob_bulk_checkin(struct repository *repo, + struct odb_transaction *transaction, struct object_id *oid, int fd, size_t size, const char *path, unsigned flags) { int status; if (transaction) { - status = deflate_blob_to_pack(&transaction->packfile, oid, fd, - size, path, flags); + status = deflate_blob_to_pack(&transaction->packfile, + repo, oid, fd, size, path, flags); } else { struct bulk_checkin_packfile state = { 0 }; - status = deflate_blob_to_pack(&state, oid, fd, size, path, flags); - flush_bulk_checkin_packfile(&state); + status = deflate_blob_to_pack(&state, repo, oid, fd, size, path, flags); + flush_bulk_checkin_packfile(&state, repo); } return status; @@ -398,7 +405,8 @@ void flush_odb_transaction(struct odb_transaction *transaction) return; flush_batch_fsync(transaction); - flush_bulk_checkin_packfile(&transaction->packfile); + flush_bulk_checkin_packfile(&transaction->packfile, + transaction->odb->repo); } void end_odb_transaction(struct odb_transaction *transaction) diff --git a/bulk-checkin.h b/bulk-checkin.h index 16254ce6a70..ac8dbf3523f 100644 --- a/bulk-checkin.h +++ b/bulk-checkin.h @@ -28,7 +28,8 @@ void fsync_loose_object_bulk_checkin(struct odb_transaction *transaction, * binary blobs, they generally do not want to get any conversion, and * callers should avoid this code path when filters are requested. */ -int index_blob_bulk_checkin(struct odb_transaction *transaction, +int index_blob_bulk_checkin(struct repository *repo, + struct odb_transaction *transaction, struct object_id *oid, int fd, size_t size, const char *path, unsigned flags); diff --git a/object-file.c b/object-file.c index 1740aa2b2e3..35f33e466c2 100644 --- a/object-file.c +++ b/object-file.c @@ -1263,7 +1263,8 @@ int index_fd(struct index_state *istate, struct object_id *oid, ret = index_core(istate, oid, fd, xsize_t(st->st_size), type, path, flags); else - ret = index_blob_bulk_checkin(the_repository->objects->transaction, + ret = index_blob_bulk_checkin(the_repository, + the_repository->objects->transaction, oid, fd, xsize_t(st->st_size), path, flags); close(fd); -- 2.51.0