]> git.ipfire.org Git - thirdparty/git.git/commitdiff
environment: move "pack_compression_level" into `struct repo_config_values`
authorOlamide Caleb Bello <belkid98@gmail.com>
Thu, 23 Apr 2026 16:54:28 +0000 (17:54 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sat, 25 Apr 2026 10:35:41 +0000 (19:35 +0900)
The `pack_compression_level` configuration is currently stored in the
global variable `pack_compression_level`, which makes it shared across
repository instances within a single process.

Store it instead in `repo_config_values`, where eagerly‑parsed
repository configuration lives. `pack_compression_level` is parsed
eagerly because it influences packfile compression, a core operation
where a lazy parse could cause inconsistent behavior and hamper
libification. This preserves the existing eager‑parsing behavior while
tying the value to the repository from which it was read, avoiding
cross‑repository state leakage and continuing the effort to reduce
reliance on global configuration state.

The type remains `int` as it represents a numeric compression level,
not a boolean toggle.

Update all references to use `repo_config_values()`.

Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Usman Akinyemi <usmanakinyemi202@gmail.com>
Signed-off-by: Olamide Caleb Bello <belkid98@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fast-import.c
builtin/pack-objects.c
environment.c
environment.h
object-file.c

index 82bc6dcc003723615af11e638deaea45278b6729..070a5af3e48c929106b571f8948f029b51b4c002 100644 (file)
@@ -965,6 +965,7 @@ static int store_object(
        unsigned long hdrlen, deltalen;
        struct git_hash_ctx c;
        git_zstream s;
+       struct repo_config_values *cfg = repo_config_values(the_repository);
 
        hdrlen = format_object_header((char *)hdr, sizeof(hdr), type,
                                      dat->len);
@@ -1005,7 +1006,7 @@ static int store_object(
        } else
                delta = NULL;
 
-       git_deflate_init(&s, pack_compression_level);
+       git_deflate_init(&s, cfg->pack_compression_level);
        if (delta) {
                s.next_in = delta;
                s.avail_in = deltalen;
@@ -1032,7 +1033,7 @@ static int store_object(
                if (delta) {
                        FREE_AND_NULL(delta);
 
-                       git_deflate_init(&s, pack_compression_level);
+                       git_deflate_init(&s, cfg->pack_compression_level);
                        s.next_in = (void *)dat->buf;
                        s.avail_in = dat->len;
                        s.avail_out = git_deflate_bound(&s, s.avail_in);
@@ -1115,6 +1116,7 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark)
        struct git_hash_ctx c;
        git_zstream s;
        struct hashfile_checkpoint checkpoint;
+       struct repo_config_values *cfg = repo_config_values(the_repository);
        int status = Z_OK;
 
        /* Determine if we should auto-checkpoint. */
@@ -1134,7 +1136,7 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark)
 
        crc32_begin(pack_file);
 
-       git_deflate_init(&s, pack_compression_level);
+       git_deflate_init(&s, cfg->pack_compression_level);
 
        hdrlen = encode_in_pack_object_header(out_buf, out_sz, OBJ_BLOB, len);
 
index dd2480a73d2edf0eca3be11029e49650877d6ab3..8ccbe7e17832cd1a5387bd697f559ab57325d77a 100644 (file)
@@ -386,8 +386,9 @@ static unsigned long do_compress(void **pptr, unsigned long size)
        git_zstream stream;
        void *in, *out;
        unsigned long maxsize;
+       struct repo_config_values *cfg = repo_config_values(the_repository);
 
-       git_deflate_init(&stream, pack_compression_level);
+       git_deflate_init(&stream, cfg->pack_compression_level);
        maxsize = git_deflate_bound(&stream, size);
 
        in = *pptr;
@@ -413,8 +414,9 @@ static unsigned long write_large_blob_data(struct odb_read_stream *st, struct ha
        unsigned char ibuf[1024 * 16];
        unsigned char obuf[1024 * 16];
        unsigned long olen = 0;
+       struct repo_config_values *cfg = repo_config_values(the_repository);
 
-       git_deflate_init(&stream, pack_compression_level);
+       git_deflate_init(&stream, cfg->pack_compression_level);
 
        for (;;) {
                ssize_t readlen;
@@ -5003,6 +5005,7 @@ int cmd_pack_objects(int argc,
        struct string_list keep_pack_list = STRING_LIST_INIT_NODUP;
        struct list_objects_filter_options filter_options =
                LIST_OBJECTS_FILTER_INIT;
+       struct repo_config_values *cfg = repo_config_values(the_repository);
 
        struct option pack_objects_options[] = {
                OPT_CALLBACK_F('q', "quiet", &progress, NULL,
@@ -5084,7 +5087,7 @@ int cmd_pack_objects(int argc,
                         N_("ignore packs that have companion .keep file")),
                OPT_STRING_LIST(0, "keep-pack", &keep_pack_list, N_("name"),
                                N_("ignore this pack")),
-               OPT_INTEGER(0, "compression", &pack_compression_level,
+               OPT_INTEGER(0, "compression", &cfg->pack_compression_level,
                            N_("pack compression level")),
                OPT_BOOL(0, "keep-true-parents", &grafts_keep_true_parents,
                         N_("do not hide commits by grafts")),
@@ -5243,10 +5246,10 @@ int cmd_pack_objects(int argc,
 
        if (!reuse_object)
                reuse_delta = 0;
-       if (pack_compression_level == -1)
-               pack_compression_level = Z_DEFAULT_COMPRESSION;
-       else if (pack_compression_level < 0 || pack_compression_level > Z_BEST_COMPRESSION)
-               die(_("bad pack compression level %d"), pack_compression_level);
+       if (cfg->pack_compression_level == -1)
+               cfg->pack_compression_level = Z_DEFAULT_COMPRESSION;
+       else if (cfg->pack_compression_level < 0 || cfg->pack_compression_level > Z_BEST_COMPRESSION)
+               die(_("bad pack compression level %d"), cfg->pack_compression_level);
 
        if (!delta_search_threads)      /* --threads=0 means autodetect */
                delta_search_threads = online_cpus();
index 5b0e88b65cf420fab9cfa48ac63007a1cb0797fb..d0d3a4b7d29e7ee33680af38d2fd63f2c09c9888 100644 (file)
@@ -52,7 +52,6 @@ char *git_commit_encoding;
 char *git_log_output_encoding;
 char *apply_default_whitespace;
 char *apply_default_ignorewhitespace;
-int pack_compression_level = Z_DEFAULT_COMPRESSION;
 int fsync_object_files = -1;
 int use_fsync = -1;
 enum fsync_method fsync_method = FSYNC_METHOD_DEFAULT;
@@ -390,7 +389,7 @@ int git_default_core_config(const char *var, const char *value,
                if (!zlib_compression_seen)
                        cfg->zlib_compression_level = level;
                if (!pack_compression_seen)
-                       pack_compression_level = level;
+                       cfg->pack_compression_level = level;
                return 0;
        }
 
@@ -662,6 +661,8 @@ static int git_default_attr_config(const char *var, const char *value)
 int git_default_config(const char *var, const char *value,
                       const struct config_context *ctx, void *cb)
 {
+       struct repo_config_values *cfg = repo_config_values(the_repository);
+
        if (starts_with(var, "core."))
                return git_default_core_config(var, value, ctx, cb);
 
@@ -701,7 +702,7 @@ int git_default_config(const char *var, const char *value,
                        level = Z_DEFAULT_COMPRESSION;
                else if (level < 0 || level > Z_BEST_COMPRESSION)
                        die(_("bad pack compression level %d"), level);
-               pack_compression_level = level;
+               cfg->pack_compression_level = level;
                pack_compression_seen = 1;
                return 0;
        }
@@ -721,4 +722,5 @@ void repo_config_values_init(struct repo_config_values *cfg)
        cfg->trust_ctime = 1;
        cfg->check_stat = 1;
        cfg->zlib_compression_level = Z_BEST_SPEED;
+       cfg->pack_compression_level = Z_DEFAULT_COMPRESSION;
 }
index 93201620afc302b4c6d8b11d6f0194b4efcb957d..514576b67a2741b7e8d6b57bb06a97892c584e2a 100644 (file)
@@ -94,6 +94,7 @@ struct repo_config_values {
        int trust_ctime;
        int check_stat;
        int zlib_compression_level;
+       int pack_compression_level;
 
        /* section "branch" config values */
        enum branch_track branch_track;
@@ -171,7 +172,6 @@ extern int assume_unchanged;
 extern int warn_on_object_refname_ambiguity;
 extern char *apply_default_whitespace;
 extern char *apply_default_ignorewhitespace;
-extern int pack_compression_level;
 extern unsigned long pack_size_limit_cfg;
 
 extern int precomposed_unicode;
index 7c122ac419829a239b29ffec78e30427f0e0b416..37def5cc5907841418b2294a87950189d8ada125 100644 (file)
@@ -1437,8 +1437,9 @@ static int stream_blob_to_pack(struct transaction_packfile *state,
        int status = Z_OK;
        int write_object = (flags & INDEX_WRITE_OBJECT);
        off_t offset = 0;
+       struct repo_config_values *cfg = repo_config_values(the_repository);
 
-       git_deflate_init(&s, pack_compression_level);
+       git_deflate_init(&s, cfg->pack_compression_level);
 
        hdrlen = encode_in_pack_object_header(obuf, sizeof(obuf), OBJ_BLOB, size);
        s.next_out = obuf + hdrlen;