{"thread":{"id":"65087","subject":"[PATCH] repo-settings: move warn_on_object_refname_ambiguity to repo_settings","startedAt":"2026-02-27T12:59:19Z","lastAt":"2026-02-28T14:03:10Z","messageCount":3,"participants":["drona","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"537286","messageId":"20260227125654.249676-1-dronarajgyawali@gmail.com","threadId":"65087","inReplyTo":null,"subject":"[PATCH] repo-settings: move warn_on_object_refname_ambiguity to repo_settings","fromName":"drona","fromEmail":"dronarajgyawali@gmail.com","sentAt":"2026-02-27T12:56:52Z","receivedAt":"2026-02-27T12:59:19Z","isPatch":true,"sender":{"key":"dronarajgyawali@gmail.com","avatar":null},"body":"From: Dorna Raj Gyawali <dronarajgyawali@gmail.com>\n\nThis flag (default: true) controls whether warnings are printed when\ndisambiguating object names that match multiple refname prefixes.\nMove it from a global variable in environment.c to struct repo_settings\nto reduce global state.\n\n- Added field and default value to repo-settings.h\n- Added getter and setter helpers in repo-settings.[ch]\n- Updated all call sites in object-name.c, submodule.c, revision.c,\n  builtin/cat-file.c and builtin/pack-objects.c\n- Removed the old global from environment.[ch]\n\nNo functional change intended.\n\nThe USE_THE_REPOSITORY_VARIABLE macros are kept in this version.\nWill remove them in v2 if requested.\n\nSigned-off-by: drona <dronarajgyawali@gmail.com>\nSigned-off-by: Dorna Raj Gyawali <dronarajgyawali@gmail.com>\n---\n builtin/cat-file.c     |  6 +++---\n builtin/pack-objects.c |  6 +++---\n environment.c          |  1 -\n environment.h          |  1 -\n object-name.c          |  2 +-\n repo-settings.c        | 10 ++++++++++\n repo-settings.h        |  7 ++++++-\n revision.c             |  6 +++---\n submodule.c            |  6 +++---\n 9 files changed, 29 insertions(+), 16 deletions(-)\n\ndiff --git a/builtin/cat-file.c b/builtin/cat-file.c\nindex df8e87a81f..bc48ae9f1e 100644\n--- a/builtin/cat-file.c\n+++ b/builtin/cat-file.c\n@@ -947,8 +947,8 @@ static int batch_objects(struct batch_options *opt)\n \t * warn) ends up dwarfing the actual cost of the object lookups\n \t * themselves. We can work around it by just turning off the warning.\n \t */\n-\tsave_warning = warn_on_object_refname_ambiguity;\n-\twarn_on_object_refname_ambiguity = 0;\n+\tsave_warning = repo_settings_get_warn_on_object_refname_ambiguity(the_repository);\n+\trepo_settings_set_warn_on_object_refname_ambiguity(the_repository, 0);\n \n \tif (opt->batch_mode == BATCH_MODE_QUEUE_AND_DISPATCH) {\n \t\tbatch_objects_command(opt, &output, &data);\n@@ -976,7 +976,7 @@ static int batch_objects(struct batch_options *opt)\n  cleanup:\n \tstrbuf_release(&input);\n \tstrbuf_release(&output);\n-\twarn_on_object_refname_ambiguity = save_warning;\n+\trepo_settings_set_warn_on_object_refname_ambiguity(the_repository, save_warning);\n \treturn retval;\n }\n \ndiff --git a/builtin/pack-objects.c b/builtin/pack-objects.c\nindex cfb03d4c09..da008c7e98 100644\n--- a/builtin/pack-objects.c\n+++ b/builtin/pack-objects.c\n@@ -4679,8 +4679,8 @@ static void get_object_list(struct rev_info *revs, struct strvec *argv)\n \t/* make sure shallows are read */\n \tis_repository_shallow(the_repository);\n \n-\tsave_warning = warn_on_object_refname_ambiguity;\n-\twarn_on_object_refname_ambiguity = 0;\n+\tsave_warning = repo_settings_get_warn_on_object_refname_ambiguity(the_repository);\n+\trepo_settings_set_warn_on_object_refname_ambiguity(the_repository, 0);\n \n \twhile (fgets(line, sizeof(line), stdin) != NULL) {\n \t\tint len = strlen(line);\n@@ -4708,7 +4708,7 @@ static void get_object_list(struct rev_info *revs, struct strvec *argv)\n \t\t\tdie(_(\"bad revision '%s'\"), line);\n \t}\n \n-\twarn_on_object_refname_ambiguity = save_warning;\n+\trepo_settings_set_warn_on_object_refname_ambiguity(the_repository, save_warning);\n \n \tif (use_bitmap_index && !get_object_list_from_bitmap(revs))\n \t\treturn;\ndiff --git a/environment.c b/environment.c\nindex 0026eb2274..c76adc02c1 100644\n--- a/environment.c\n+++ b/environment.c\n@@ -49,7 +49,6 @@ int minimum_abbrev = 4, default_abbrev = -1;\n int ignore_case;\n int assume_unchanged;\n int is_bare_repository_cfg = -1; /* unspecified */\n-int warn_on_object_refname_ambiguity = 1;\n char *git_commit_encoding;\n char *git_log_output_encoding;\n char *apply_default_whitespace;\ndiff --git a/environment.h b/environment.h\nindex 27f657af04..f2438634ce 100644\n--- a/environment.h\n+++ b/environment.h\n@@ -151,7 +151,6 @@ extern int has_symlinks;\n extern int minimum_abbrev, default_abbrev;\n extern int ignore_case;\n extern int assume_unchanged;\n-extern int warn_on_object_refname_ambiguity;\n extern char *apply_default_whitespace;\n extern char *apply_default_ignorewhitespace;\n extern char *git_attributes_file;\ndiff --git a/object-name.c b/object-name.c\nindex 7b14c3bf9b..e420152064 100644\n--- a/object-name.c\n+++ b/object-name.c\n@@ -973,7 +973,7 @@ static int get_oid_basic(struct repository *r, const char *str, int len,\n \tif (len == r->hash_algo->hexsz && !get_oid_hex(str, oid)) {\n \t\tif (!(flags & GET_OID_SKIP_AMBIGUITY_CHECK) &&\n \t\t    repo_settings_get_warn_ambiguous_refs(r) &&\n-\t\t    warn_on_object_refname_ambiguity) {\n+\t\t    repo_settings_get_warn_on_object_refname_ambiguity(r)) {\n \t\t\trefs_found = repo_dwim_ref(r, str, len, &tmp_oid, &real_ref, 0);\n \t\t\tif (refs_found > 0) {\n \t\t\t\twarning(warn_msg, len, str);\ndiff --git a/repo-settings.c b/repo-settings.c\nindex 208e09ff17..c415779b9b 100644\n--- a/repo-settings.c\n+++ b/repo-settings.c\n@@ -233,3 +233,13 @@ void repo_settings_reset_shared_repository(struct repository *repo)\n {\n \trepo->settings.shared_repository_initialized = 0;\n }\n+\n+int repo_settings_get_warn_on_object_refname_ambiguity(struct repository *repo)\n+{\n+    return repo->settings.warn_on_object_refname_ambiguity;\n+}\n+\n+void repo_settings_set_warn_on_object_refname_ambiguity(struct repository *repo, int value)\n+{\n+    repo->settings.warn_on_object_refname_ambiguity = value;\n+}\n\\ No newline at end of file\ndiff --git a/repo-settings.h b/repo-settings.h\nindex cad9c3f0cc..f74d6b1a6b 100644\n--- a/repo-settings.h\n+++ b/repo-settings.h\n@@ -61,7 +61,7 @@ struct repo_settings {\n \n \tint core_multi_pack_index;\n \tint warn_ambiguous_refs; /* lazily loaded via accessor */\n-\n+\tint warn_on_object_refname_ambiguity;\n \tsize_t delta_base_cache_limit;\n \tsize_t packed_git_window_size;\n \tsize_t packed_git_limit;\n@@ -77,6 +77,7 @@ struct repo_settings {\n \t.core_untracked_cache = UNTRACKED_CACHE_KEEP, \\\n \t.fetch_negotiation_algorithm = FETCH_NEGOTIATION_CONSECUTIVE, \\\n \t.warn_ambiguous_refs = -1, \\\n+\t.warn_on_object_refname_ambiguity = 1, \\\n \t.delta_base_cache_limit = DEFAULT_DELTA_BASE_CACHE_LIMIT, \\\n \t.packed_git_window_size = DEFAULT_PACKED_GIT_WINDOW_SIZE, \\\n \t.packed_git_limit = DEFAULT_PACKED_GIT_LIMIT, \\\n@@ -102,4 +103,8 @@ int repo_settings_get_shared_repository(struct repository *repo);\n void repo_settings_set_shared_repository(struct repository *repo, int value);\n void repo_settings_reset_shared_repository(struct repository *repo);\n \n+/* Read the value for \"warn_on_object_refname_ambiguity\" (internal flag) */\n+int repo_settings_get_warn_on_object_refname_ambiguity(struct repository *repo);\n+void repo_settings_set_warn_on_object_refname_ambiguity(struct repository *repo, int value);\n+\n #endif /* REPO_SETTINGS_H */\ndiff --git a/revision.c b/revision.c\nindex 047ff7e458..7072f9c331 100644\n--- a/revision.c\n+++ b/revision.c\n@@ -2905,8 +2905,8 @@ static void read_revisions_from_stdin(struct rev_info *revs,\n \tint save_warning;\n \tint flags = 0;\n \n-\tsave_warning = warn_on_object_refname_ambiguity;\n-\twarn_on_object_refname_ambiguity = 0;\n+\tsave_warning = repo_settings_get_warn_on_object_refname_ambiguity(revs->repo);\n+\trepo_settings_set_warn_on_object_refname_ambiguity(revs->repo, 0);\n \n \tstrbuf_init(&sb, 1000);\n \twhile (strbuf_getline(&sb, stdin) != EOF) {\n@@ -2940,7 +2940,7 @@ static void read_revisions_from_stdin(struct rev_info *revs,\n \t\tread_pathspec_from_stdin(&sb, prune);\n \n \tstrbuf_release(&sb);\n-\twarn_on_object_refname_ambiguity = save_warning;\n+\trepo_settings_set_warn_on_object_refname_ambiguity(revs->repo, save_warning);\n }\n \n static void NORETURN diagnose_missing_default(const char *def)\ndiff --git a/submodule.c b/submodule.c\nindex 508938e4da..a1d618e802 100644\n--- a/submodule.c\n+++ b/submodule.c\n@@ -899,11 +899,11 @@ static void collect_changed_submodules(struct repository *r,\n \t\t.assume_dashdash = 1,\n \t};\n \n-\tsave_warning = warn_on_object_refname_ambiguity;\n-\twarn_on_object_refname_ambiguity = 0;\n+\tsave_warning = repo_settings_get_warn_on_object_refname_ambiguity(r);\n+\trepo_settings_set_warn_on_object_refname_ambiguity(r, 0);\n \trepo_init_revisions(r, &rev, NULL);\n \tsetup_revisions_from_strvec(argv, &rev, &s_r_opt);\n-\twarn_on_object_refname_ambiguity = save_warning;\n+\trepo_settings_set_warn_on_object_refname_ambiguity(r, save_warning);\n \tif (prepare_revision_walk(&rev))\n \t\tdie(_(\"revision walk setup failed\"));\n \n-- \n2.43.0\n\n"},{"id":"537348","messageId":"xmqqtsv1ols3.fsf@gitster.g","threadId":"65087","inReplyTo":"20260227125654.249676-1-dronarajgyawali@gmail.com","subject":"Re: [PATCH] repo-settings: move warn_on_object_refname_ambiguity to repo_settings","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-02-27T22:37:48Z","receivedAt":"2026-02-27T22:37:50Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"drona <dronarajgyawali@gmail.com> writes:\n\n> From: Dorna Raj Gyawali <dronarajgyawali@gmail.com>\n>\n> This flag (default: true) controls whether warnings are printed when\n> disambiguating object names that match multiple refname prefixes.\n> Move it from a global variable in environment.c to struct repo_settings\n> to reduce global state.\n\nI am not sure why this needs to be per-repository, though.  It is\nvery understandable if this were a per-user preference coming from\nthe ~/.gitconfig file, and then it makes a lot more sense to keep it\na process-wide global.\n\n>  builtin/cat-file.c     |  6 +++---\n>  builtin/pack-objects.c |  6 +++---\n>  environment.c          |  1 -\n>  environment.h          |  1 -\n>  object-name.c          |  2 +-\n>  repo-settings.c        | 10 ++++++++++\n>  repo-settings.h        |  7 ++++++-\n>  revision.c             |  6 +++---\n>  submodule.c            |  6 +++---\n>  9 files changed, 29 insertions(+), 16 deletions(-)\n\nEven in a distant future where these files are used to implement a\nlong running multi-user multi-repository \"git server\", we would\nprobably want to create a per-user structure that holds personal\npreference items and throw this variable in there, not in the\nper-repository repo_settings struct.\n\nSo,... I dunno.\n"},{"id":"537394","messageId":"20260228140259.21139-1-dronarajgyawali@gmail.com","threadId":"65087","inReplyTo":"20260227125654.249676-1-dronarajgyawali@gmail.com","subject":"[PATCH v2] v2: revert per-repo move + add clarifying comment","fromName":"drona","fromEmail":"dronarajgyawali@gmail.com","sentAt":"2026-02-28T14:02:58Z","receivedAt":"2026-02-28T14:03:10Z","isPatch":true,"sender":{"key":"dronarajgyawali@gmail.com","avatar":null},"body":"From: Dorna Raj Gyawali <dronarajgyawali@gmail.com>\n\nFollowing Junio's feedback: this flag is a user/process preference,\nnot repository-specific. Reverted the repo_settings changes.\n\nAdded a small comment for future contributors.\n\nSigned-off-by: Dorna Raj Gyawali <dronarajgyawali@gmail.com>\n---\n environment.c | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/environment.c b/environment.c\nindex 0026eb2274..09c34d1776 100644\n--- a/environment.c\n+++ b/environment.c\n@@ -49,7 +49,7 @@ int minimum_abbrev = 4, default_abbrev = -1;\n int ignore_case;\n int assume_unchanged;\n int is_bare_repository_cfg = -1; /* unspecified */\n-int warn_on_object_refname_ambiguity = 1;\n+int warn_on_object_refname_ambiguity = 1; /* process-wide user preference */\n char *git_commit_encoding;\n char *git_log_output_encoding;\n char *apply_default_whitespace;\n-- \n2.43.0\n\n"}]}