Hi, this patch series is the next part in the epic to get rid of `the_repository`. This time around I focussed on the environment subsystem, which relies on `the_repository` both implicitly and explicitly. The series is structured as follows: - Patches 1 to 6 moves functions that belong to the repository subsystem. - Patches 7 and 8 adapt the config subsystem to stop depending on the `the_repository` again, which had to be added by the preceding patches. - Patches 9 to 11 move various functionality that is misplaced and that depends on `the_repository`. - Patches 12 and 13 guard functionality that relies on global state in the environment subsystem via `USE_THE_REPOSITORY_VARIBABLE`. - Patches 14 to 21 demonstrate how to get rid of global config variables part of the environment subsystem for a subset of them. Overall, I think that our reliance on global variables is broken because those variables may or may not point to the actual config of a specific repository we currently hold. They may not even hold state of `the_repository`, but might've been changed by subsequent logic where we parse another repository's config. I'm a bit unhappy that I wasn't able to adapt `is_bare_repository()` to take a `struct repository` yet, and as a consequence a bunch of code needs to declare `USE_THE_REPOSITORY_VARIBABLE` again. But it depends on another global variable `is_bare_repository_cfg` which is being modified quite heavily in multiple subsystems, and the resulting semantics are... confusing. I guess we'll need another biggish patch series to clean up this mess by making the setup subsystem not rely on such global state anymore. The series is built on top of 17d4b10aea (The tenth batch, 2024-08-28). It merges with `next` rather cleanish, except for a single merge conflict with headers. Thanks! Patrick Patrick Steinhardt (21): environment: make `get_git_dir()` accept a repository environment: make `get_git_common_dir()` accept a repository environment: make `get_object_directory()` accept a repository environment: make `get_index_file()` accept a repository environment: make `get_graft_file()` accept a repository environment: make `get_git_work_tree()` accept a repository config: document `read_early_config()` and `read_very_early_config()` config: make dependency on repo in `read_early_config()` explicit environment: move `odb_mkstemp()` into object layer environment: make `get_git_namespace()` self-contained environment: move `set_git_dir()` and related into setup layer environment: reorder header to split out `the_repository`-free section environment: guard state depending on a repository repo-settings: split out declarations into a standalone header branch: stop modifying `log_all_ref_updates` variable refs: stop modifying global `log_all_ref_updates` variable repo-settings: track defaults close to `struct repo_settings` environment: stop storing "core.logAllRefUpdates" globally environment: stop storing "core.preferSymlinkRefs" globally environment: stop storing "core.warnAmbiguousRefs" globally environment: stop storing "core.notesRef" globally alias.c | 6 +- apply.c | 2 +- branch.c | 5 +- builtin/am.c | 13 +- builtin/blame.c | 2 +- builtin/checkout.c | 4 +- builtin/commit-graph.c | 4 +- builtin/commit.c | 12 +- builtin/config.c | 4 +- builtin/count-objects.c | 2 +- builtin/difftool.c | 8 +- builtin/fsmonitor--daemon.c | 6 +- builtin/gc.c | 2 +- builtin/init-db.c | 4 +- builtin/merge.c | 17 +-- builtin/multi-pack-index.c | 2 +- builtin/notes.c | 22 ++-- builtin/pack-objects.c | 2 +- builtin/prune.c | 8 +- builtin/repack.c | 7 +- builtin/replace.c | 2 +- builtin/reset.c | 4 +- builtin/rev-parse.c | 9 +- builtin/stash.c | 16 +-- builtin/submodule--helper.c | 2 +- builtin/update-index.c | 4 +- builtin/worktree.c | 4 +- builtin/write-tree.c | 3 +- bulk-checkin.c | 4 +- bundle-uri.c | 1 + cache-tree.c | 3 +- commit.c | 4 +- config.c | 42 +------ config.h | 13 +- dir.c | 2 +- environment.c | 237 +++++------------------------------- environment.h | 142 ++++++++++----------- fetch-pack.c | 2 +- fsmonitor.c | 2 +- help.c | 2 +- http-backend.c | 2 +- name-hash.c | 3 + notes.c | 21 ++-- notes.h | 3 +- object-file.c | 37 +++++- object-name.c | 4 +- object-store-ll.h | 15 +++ pack-write.c | 2 +- packfile.c | 2 +- pager.c | 7 +- path.c | 2 + pathspec.c | 4 +- preload-index.c | 3 + prompt.c | 2 + prune-packed.c | 4 +- read-cache.c | 5 +- ref-filter.c | 2 +- refs.c | 7 +- refs.h | 4 +- refs/files-backend.c | 31 +++-- refs/reftable-backend.c | 22 ++-- repo-settings.c | 35 +++++- repo-settings.h | 75 ++++++++++++ repository.c | 40 ++++++ repository.h | 58 ++------- server-info.c | 3 +- setup.c | 152 +++++++++++++++++++---- setup.h | 5 +- sparse-index.c | 2 + statinfo.c | 2 + submodule.c | 2 +- t/helper/test-config.c | 3 +- t/helper/test-path-utils.c | 2 + tmp-objdir.c | 7 +- trace.c | 8 +- trace2/tr2_cfg.c | 4 +- transport-helper.c | 2 +- tree-diff.c | 3 + userdiff.c | 2 + worktree.c | 12 +- wt-status.c | 2 +- 81 files changed, 677 insertions(+), 554 deletions(-) create mode 100644 repo-settings.h -- 2.46.0.421.g159f2d50e7.dirty