Subject: [PATCH 00/21] environment: guard reliance on `the_repository`

From: Patrick Steinhardt <[email-masked]>
Date: Thu, 29 Aug 2024 11:38:19 +0200

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