From e17fe79fbae7d12d5a969858b1fbc17f42060a75 Mon Sep 17 00:00:00 2001 From: Tian Yuchen Date: Fri, 24 Jul 2026 20:57:48 +0800 Subject: [PATCH 1/2] environment: migrate minimum_abbrev and default_abbrev Move the global 'minimum_abbrev' and 'default_abbrev' configurations into the repository-specific 'repo_config_values' struct. To ensure code readability, the getter functions 'repo_minimum_abbrev()' and 'repo_default_abbrev()' have been introduced. The existing MINIMUM_ABBREV and DEFAULT_ABBREV macros are redefined to the corresponding getters. Additionally, some subsystems forbid the direct use of 'the_repository' and must pass their own local 'repo'. Let the getters explicitly intercept these instances. Mentored-by: Christian Couder Mentored-by: Ayush Chandekar Mentored-by: Olamide Caleb Bello Signed-off-by: Tian Yuchen --- environment.c | 31 ++++++++++++++++++++++++++----- environment.h | 6 +++++- merge-ort.c | 7 ++++--- object-name.h | 4 ++-- replay.c | 2 +- sequencer.c | 5 +++-- 6 files changed, 41 insertions(+), 14 deletions(-) diff --git a/environment.c b/environment.c index c663113e8a6dcc..2b44778b5029bf 100644 --- a/environment.c +++ b/environment.c @@ -43,7 +43,6 @@ static int zlib_compression_seen; int trust_executable_bit = 1; int has_symlinks = 1; -int minimum_abbrev = 4, default_abbrev = -1; int assume_unchanged; char *git_commit_encoding; char *git_log_output_encoding; @@ -148,6 +147,26 @@ int repo_ignore_case(struct repository *repo) 0; } +int repo_minimum_abbrev(struct repository *repo) +{ + if (repo != the_repository) + repo = the_repository; + + return repo->initialized + ? repo_config_values(repo)->minimum_abbrev + : 4; +} + +int repo_default_abbrev(struct repository *repo) +{ + if (repo != the_repository) + repo = the_repository; + + return repo->initialized + ? repo_config_values(repo)->default_abbrev + : -1; +} + int have_git_dir(void) { return startup_info->have_repository @@ -364,14 +383,14 @@ int git_default_core_config(const char *var, const char *value, if (!value) return config_error_nonbool(var); if (!strcasecmp(value, "auto")) - default_abbrev = -1; + cfg->default_abbrev = -1; else if (!git_parse_maybe_bool_text(value)) - default_abbrev = GIT_MAX_HEXSZ; + cfg->default_abbrev = GIT_MAX_HEXSZ; else { int abbrev = git_config_int(var, value, ctx->kvi); - if (abbrev < minimum_abbrev) + if (abbrev < cfg->minimum_abbrev) return error(_("abbrev length out of range: %d"), abbrev); - default_abbrev = abbrev; + cfg->default_abbrev = abbrev; } return 0; } @@ -738,6 +757,8 @@ void repo_config_values_init(struct repo_config_values *cfg) cfg->check_stat = 1; cfg->zlib_compression_level = Z_BEST_SPEED; cfg->pack_compression_level = Z_DEFAULT_COMPRESSION; + cfg->minimum_abbrev = 4; + cfg->default_abbrev = -1; cfg->precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */ cfg->core_sparse_checkout_cone = 0; cfg->sparse_expect_files_outside_of_patterns = 0; diff --git a/environment.h b/environment.h index acfb670be107a0..c5905d8b01cc44 100644 --- a/environment.h +++ b/environment.h @@ -95,6 +95,8 @@ struct repo_config_values { int check_stat; int zlib_compression_level; int pack_compression_level; + int minimum_abbrev; + int default_abbrev; int precomposed_unicode; int core_sparse_checkout_cone; int warn_on_object_refname_ambiguity; @@ -151,6 +153,9 @@ int repo_protect_ntfs(struct repository *repo); */ int repo_ignore_case(struct repository *repo); +int repo_minimum_abbrev(struct repository *repo); +int repo_default_abbrev(struct repository *repo); + void repo_config_values_init(struct repo_config_values *cfg); int is_bare_repository(struct repository *repo); @@ -180,7 +185,6 @@ int have_git_dir(void); /* Environment bits from configuration mechanism */ extern int trust_executable_bit; extern int has_symlinks; -extern int minimum_abbrev, default_abbrev; extern int assume_unchanged; extern char *apply_default_whitespace; extern char *apply_default_ignorewhitespace; diff --git a/merge-ort.c b/merge-ort.c index c410a5d353234c..b94ebcc2de5d68 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -777,7 +777,7 @@ static void format_commit(struct strbuf *sb, { struct merge_remote_desc *desc; struct pretty_print_context ctx = {0}; - ctx.abbrev = DEFAULT_ABBREV; + ctx.abbrev = repo_default_abbrev(repo); strbuf_addchars(sb, ' ', indent); desc = merge_remote_util(commit); @@ -2035,7 +2035,8 @@ static int merge_submodule(struct merge_options *opt, util->flag = sub_flag; util->abbrev = NULL; if (!sub_not_initialized) { - abbrev = repo_find_unique_abbrev(&subrepo, b, DEFAULT_ABBREV); + abbrev = repo_find_unique_abbrev(&subrepo, b, + repo_default_abbrev(opt->repo)); util->abbrev = xstrdup(abbrev); } string_list_append(csub, path)->util = util; @@ -5348,7 +5349,7 @@ static void merge_ort_internal(struct merge_options *opt, } else { strbuf_add_unique_abbrev(&merge_base_abbrev, &merged_merge_bases->object.oid, - DEFAULT_ABBREV); + repo_default_abbrev(opt->repo)); ancestor_name = merge_base_abbrev.buf; } diff --git a/object-name.h b/object-name.h index 167a9154ea2d67..a6d7206ed83304 100644 --- a/object-name.h +++ b/object-name.h @@ -133,8 +133,8 @@ struct object *repo_peel_to_type(struct repository *r, struct object *o, enum object_type); /* Convert to/from hex/sha1 representation */ -#define MINIMUM_ABBREV minimum_abbrev -#define DEFAULT_ABBREV default_abbrev +#define MINIMUM_ABBREV repo_minimum_abbrev(the_repository) +#define DEFAULT_ABBREV repo_default_abbrev(the_repository) /* used when the code does not know or care what the default abbrev is */ #define FALLBACK_DEFAULT_ABBREV 7 diff --git a/replay.c b/replay.c index 463c900d6c7c56..cd41c7f5076c40 100644 --- a/replay.c +++ b/replay.c @@ -27,7 +27,7 @@ static const char *short_commit_name(struct repository *repo, struct commit *commit) { return repo_find_unique_abbrev(repo, &commit->object.oid, - DEFAULT_ABBREV); + repo_default_abbrev(repo)); } static struct commit *peel_committish(struct repository *repo, diff --git a/sequencer.c b/sequencer.c index 1355a99a092268..2426c5e422299b 100644 --- a/sequencer.c +++ b/sequencer.c @@ -5813,7 +5813,7 @@ static const char *label_oid(struct object_id *oid, const char *label, label = p = state->buf.buf; repo_find_unique_abbrev_r(the_repository, p, oid, - default_abbrev); + repo_default_abbrev(the_repository)); /* * We may need to extend the abbreviated hash so that there is @@ -5875,7 +5875,8 @@ static const char *label_oid(struct object_id *oid, const char *label, strbuf_addch(buf, '-'); if (!buf->len) { strbuf_addstr(buf, "rev-"); - strbuf_add_unique_abbrev(buf, oid, default_abbrev); + strbuf_add_unique_abbrev(buf, oid, + repo_default_abbrev(the_repository)); } label = buf->buf; From 437d481b5765eb26345aecefb2599f1c43044d6d Mon Sep 17 00:00:00 2001 From: Tian Yuchen Date: Sat, 25 Jul 2026 09:18:39 +0800 Subject: [PATCH 2/2] environment: migrate pack_size_limit_cfg into repo_config_values Move the global 'pack_size_limit_cfg' configuration into the repository-specific 'repo_config_values' struct. We do not introduce a getter for it because the callers are limited. Mentored-by: Christian Couder Mentored-by: Ayush Chandekar Mentored-by: Olamide Caleb Bello Signed-off-by: Tian Yuchen --- builtin/pack-objects.c | 2 +- environment.c | 4 ++-- environment.h | 2 +- object-file.c | 5 +++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 3673b14b89b275..4ebcaccb09b5ee 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -5328,7 +5328,7 @@ int cmd_pack_objects(int argc, if (!HAVE_THREADS && delta_search_threads != 1) warning(_("no threads support, ignoring --threads")); if (!pack_to_stdout && !pack_size_limit) - pack_size_limit = pack_size_limit_cfg; + pack_size_limit = cfg->pack_size_limit_cfg; if (pack_to_stdout && pack_size_limit) die(_("--max-pack-size cannot be used to build a pack for transfer")); if (pack_size_limit && pack_size_limit < 1024*1024) { diff --git a/environment.c b/environment.c index 2b44778b5029bf..9a676980513fee 100644 --- a/environment.c +++ b/environment.c @@ -66,7 +66,6 @@ enum push_default_type push_default = PUSH_DEFAULT_UNSPECIFIED; #endif enum object_creation_mode object_creation_mode = OBJECT_CREATION_MODE; int grafts_keep_true_parents; -unsigned long pack_size_limit_cfg; #ifndef PROTECT_HFS_DEFAULT #define PROTECT_HFS_DEFAULT 0 @@ -723,7 +722,7 @@ int git_default_config(const char *var, const char *value, } if (!strcmp(var, "pack.packsizelimit")) { - pack_size_limit_cfg = git_config_ulong(var, value, ctx->kvi); + cfg->pack_size_limit_cfg = git_config_ulong(var, value, ctx->kvi); return 0; } @@ -759,6 +758,7 @@ void repo_config_values_init(struct repo_config_values *cfg) cfg->pack_compression_level = Z_DEFAULT_COMPRESSION; cfg->minimum_abbrev = 4; cfg->default_abbrev = -1; + cfg->pack_size_limit_cfg = 0; cfg->precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */ cfg->core_sparse_checkout_cone = 0; cfg->sparse_expect_files_outside_of_patterns = 0; diff --git a/environment.h b/environment.h index c5905d8b01cc44..d2a5698a058c9f 100644 --- a/environment.h +++ b/environment.h @@ -97,6 +97,7 @@ struct repo_config_values { int pack_compression_level; int minimum_abbrev; int default_abbrev; + unsigned long pack_size_limit_cfg; int precomposed_unicode; int core_sparse_checkout_cone; int warn_on_object_refname_ambiguity; @@ -188,7 +189,6 @@ extern int has_symlinks; extern int assume_unchanged; extern char *apply_default_whitespace; extern char *apply_default_ignorewhitespace; -extern unsigned long pack_size_limit_cfg; enum rebase_setup_type { AUTOREBASE_NEVER = 0, diff --git a/object-file.c b/object-file.c index 7ff2b730ac0ead..be68eead631e64 100644 --- a/object-file.c +++ b/object-file.c @@ -1273,6 +1273,7 @@ static int odb_transaction_files_write_object_stream(struct odb_transaction *bas size_t size, struct object_id *result_oid) { + struct repo_config_values *cfg = repo_config_values(the_repository); struct odb_transaction_files *transaction = container_of(base, struct odb_transaction_files, base); @@ -1298,8 +1299,8 @@ static int odb_transaction_files_write_object_stream(struct odb_transaction *bas * the difference between the inflated and on-disk size is limited * to zlib compression and is sufficient for this check. */ - if (state->nr_written && pack_size_limit_cfg && - pack_size_limit_cfg < state->offset + size) + if (state->nr_written && cfg->pack_size_limit_cfg && + cfg->pack_size_limit_cfg < state->offset + size) flush_packfile_transaction(transaction); CALLOC_ARRAY(idx, 1);