]> git.ipfire.org Git - thirdparty/git.git/commitdiff
environment: make `get_git_work_tree()` accept a repository
authorPatrick Steinhardt <ps@pks.im>
Thu, 12 Sep 2024 11:29:40 +0000 (13:29 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 12 Sep 2024 17:15:40 +0000 (10:15 -0700)
The `get_git_work_tree()` function retrieves the path of the work tree
of `the_repository`. Make it accept a `struct repository` such that it
can work on arbitrary repositories and make it part of the repository
subsystem. This reduces our reliance on `the_repository` and clarifies
scope.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
18 files changed:
builtin/blame.c
builtin/difftool.c
builtin/fsmonitor--daemon.c
builtin/init-db.c
builtin/reset.c
builtin/rev-parse.c
builtin/stash.c
builtin/submodule--helper.c
builtin/update-index.c
dir.c
environment.c
environment.h
fsmonitor.c
pathspec.c
repository.c
repository.h
setup.c
trace.c

index 35e975fb132ba7406ba084769b487136e1e31fec..1ffdda50904e01392855aed0a9f4293f8bfc8823 100644 (file)
@@ -1081,7 +1081,7 @@ parse_done:
                        path = add_prefix(prefix, argv[1]);
                        argv[1] = argv[2];
                } else {        /* (2a) */
-                       if (argc == 2 && is_a_rev(argv[1]) && !get_git_work_tree())
+                       if (argc == 2 && is_a_rev(argv[1]) && !repo_get_work_tree(the_repository))
                                die("missing <path> to blame");
                        path = add_prefix(prefix, argv[argc - 1]);
                }
index 8c59411e6e0f8aa97ded3a15c8ce233627648cea..7f2cbd797ad755b9218987f47125a5060b661f16 100644 (file)
@@ -378,7 +378,7 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
        struct hashmap wt_modified, tmp_modified;
        int indices_loaded = 0;
 
-       workdir = get_git_work_tree();
+       workdir = repo_get_work_tree(the_repository);
 
        /* Setup temp directories */
        tmp = getenv("TMPDIR");
@@ -739,7 +739,7 @@ int cmd_difftool(int argc, const char **argv, const char *prefix)
        if (!no_index){
                setup_work_tree();
                setenv(GIT_DIR_ENVIRONMENT, absolute_path(repo_get_git_dir(the_repository)), 1);
-               setenv(GIT_WORK_TREE_ENVIRONMENT, absolute_path(get_git_work_tree()), 1);
+               setenv(GIT_WORK_TREE_ENVIRONMENT, absolute_path(repo_get_work_tree(the_repository)), 1);
        } else if (dir_diff)
                die(_("options '%s' and '%s' cannot be used together"), "--dir-diff", "--no-index");
 
index c54e736716a19036c38b1a20956a075367ed9c78..25451d999e9873cb00b4c6cc8892604d5dbc7321 100644 (file)
@@ -2,7 +2,6 @@
 #include "abspath.h"
 #include "config.h"
 #include "dir.h"
-#include "environment.h"
 #include "gettext.h"
 #include "parse-options.h"
 #include "fsmonitor-ll.h"
@@ -1291,7 +1290,8 @@ static int fsmonitor_run_daemon(void)
 
        /* Prepare to (recursively) watch the <worktree-root> directory. */
        strbuf_init(&state.path_worktree_watch, 0);
-       strbuf_addstr(&state.path_worktree_watch, absolute_path(get_git_work_tree()));
+       strbuf_addstr(&state.path_worktree_watch,
+                     absolute_path(repo_get_work_tree(the_repository)));
        state.nr_paths_watching = 1;
 
        strbuf_init(&state.alias.alias, 0);
index 582dcf20f862fb87a967bcdbb121199007a42b1c..fb04962dcea4e430d756bd416cae1d564cce286c 100644 (file)
@@ -231,9 +231,9 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
                        set_git_work_tree(work_tree);
                else
                        set_git_work_tree(git_work_tree_cfg);
-               if (access(get_git_work_tree(), X_OK))
+               if (access(repo_get_work_tree(the_repository), X_OK))
                        die_errno (_("Cannot access work tree '%s'"),
-                                  get_git_work_tree());
+                                  repo_get_work_tree(the_repository));
        }
        else {
                if (real_git_dir)
index 5f941fb3a29cce568608f7a07b6f60a683479748..86b2f07d6606849902a58242cb08ce7d0bd1b09f 100644 (file)
@@ -26,6 +26,7 @@
 #include "object-name.h"
 #include "parse-options.h"
 #include "path.h"
+#include "repository.h"
 #include "unpack-trees.h"
 #include "cache-tree.h"
 #include "setup.h"
@@ -441,7 +442,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
        else
                trace2_cmd_mode(reset_type_names[reset_type]);
 
-       if (reset_type != SOFT && (reset_type != MIXED || get_git_work_tree()))
+       if (reset_type != SOFT && (reset_type != MIXED || repo_get_work_tree(the_repository)))
                setup_work_tree();
 
        if (reset_type == MIXED && is_bare_repository())
@@ -474,7 +475,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
                                goto cleanup;
                        }
                        the_repository->index->updated_skipworktree = 1;
-                       if (!no_refresh && get_git_work_tree()) {
+                       if (!no_refresh && repo_get_work_tree(the_repository)) {
                                uint64_t t_begin, t_delta_in_ms;
 
                                t_begin = getnanotime();
index cd85fe57bb05d0910d734208070b2a6da418125e..a5108266dafc24ea18e331b616a418b225add305 100644 (file)
@@ -967,7 +967,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                continue;
                        }
                        if (!strcmp(arg, "--show-toplevel")) {
-                               const char *work_tree = get_git_work_tree();
+                               const char *work_tree = repo_get_work_tree(the_repository);
                                if (work_tree)
                                        print_path(work_tree, prefix, format, DEFAULT_UNMODIFIED);
                                else
@@ -992,7 +992,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                const char *pfx = prefix;
                                if (!is_inside_work_tree()) {
                                        const char *work_tree =
-                                               get_git_work_tree();
+                                               repo_get_work_tree(the_repository);
                                        if (work_tree)
                                                printf("%s\n", work_tree);
                                        continue;
index f2ec9549a47c263f59370210e78e5aa08571f6d2..354641b3f10f027b2acf975d0b46425676114f87 100644 (file)
@@ -641,7 +641,7 @@ restore_untracked:
                cp.git_cmd = 1;
                cp.dir = prefix;
                strvec_pushf(&cp.env, GIT_WORK_TREE_ENVIRONMENT"=%s",
-                            absolute_path(get_git_work_tree()));
+                            absolute_path(repo_get_work_tree(the_repository)));
                strvec_pushf(&cp.env, GIT_DIR_ENVIRONMENT"=%s",
                             absolute_path(repo_get_git_dir(the_repository)));
                strvec_push(&cp.args, "status");
index 85fb23dee84c18b850ee21ff269910d3ed426c7d..865b454d693c21822ca50260a31b1a679166f31f 100644 (file)
@@ -1709,7 +1709,7 @@ static int clone_submodule(const struct module_clone_data *clone_data,
                exit(128);
 
        if (!is_absolute_path(clone_data->path))
-               clone_data_path = to_free = xstrfmt("%s/%s", get_git_work_tree(),
+               clone_data_path = to_free = xstrfmt("%s/%s", repo_get_work_tree(the_repository),
                                                    clone_data->path);
 
        if (validate_submodule_git_dir(sm_gitdir, clone_data->name) < 0)
index 86c5d40e40036341e4db02328ffef75a96ce765a..8baa2256194e46e0ca952a9abf8068c9965d0877 100644 (file)
@@ -1194,7 +1194,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
                                  "remove or change it, if you really want to "
                                  "enable the untracked cache"));
                add_untracked_cache(the_repository->index);
-               report(_("Untracked cache enabled for '%s'"), get_git_work_tree());
+               report(_("Untracked cache enabled for '%s'"), repo_get_work_tree(the_repository));
                break;
        default:
                BUG("bad untracked_cache value: %d", untracked_cache);
diff --git a/dir.c b/dir.c
index 5a23376bdaec3a7811677e7ca83e76ababa60a52..c43b5e30813a8fec2eb5303918bf35c6ea64a3a9 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -20,6 +20,7 @@
 #include "object-store-ll.h"
 #include "path.h"
 #include "refs.h"
+#include "repository.h"
 #include "wildmatch.h"
 #include "pathspec.h"
 #include "utf8.h"
@@ -2838,7 +2839,7 @@ static const char *get_ident_string(void)
                return sb.buf;
        if (uname(&uts) < 0)
                die_errno(_("failed to get kernel name and information"));
-       strbuf_addf(&sb, "Location %s, system %s", get_git_work_tree(),
+       strbuf_addf(&sb, "Location %s, system %s", repo_get_work_tree(the_repository),
                    uts.sysname);
        return sb.buf;
 }
index 371f01a705dca69301e52500e94a6a71cd40a2b2..4d0637b3822c312a6e947047c16c8df0894239bd 100644 (file)
@@ -219,7 +219,7 @@ void setup_git_env(const char *git_dir)
 int is_bare_repository(void)
 {
        /* if core.bare is not 'false', let's see if there is a work tree */
-       return is_bare_repository_cfg && !get_git_work_tree();
+       return is_bare_repository_cfg && !repo_get_work_tree(the_repository);
 }
 
 int have_git_dir(void)
@@ -268,11 +268,6 @@ void set_git_work_tree(const char *new_work_tree)
        repo_set_worktree(the_repository, new_work_tree);
 }
 
-const char *get_git_work_tree(void)
-{
-       return the_repository->worktree;
-}
-
 int odb_mkstemp(struct strbuf *temp_filename, const char *pattern)
 {
        int fd;
index d12c48481b62f7b887693d2b90901c48f28ff7ca..52e1803aba68b6d3084ecaa98b09ba6c85045a83 100644 (file)
@@ -108,7 +108,6 @@ extern char *git_work_tree_cfg;
 void set_git_dir(const char *path, int make_realpath);
 const char *get_git_namespace(void);
 const char *strip_namespace(const char *namespaced_ref);
-const char *get_git_work_tree(void);
 void set_git_work_tree(const char *tree);
 
 #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
index 28130f748f7009a1e2ca978c0f17f835f31521b7..237ca59d004582de93624477259f9da595af05ce 100644 (file)
@@ -8,6 +8,7 @@
 #include "fsmonitor.h"
 #include "fsmonitor-ipc.h"
 #include "name-hash.h"
+#include "repository.h"
 #include "run-command.h"
 #include "strbuf.h"
 #include "trace2.h"
@@ -169,7 +170,7 @@ static int query_fsmonitor_hook(struct repository *r,
        strvec_pushf(&cp.args, "%d", version);
        strvec_pushf(&cp.args, "%s", last_update);
        cp.use_shell = 1;
-       cp.dir = get_git_work_tree();
+       cp.dir = repo_get_work_tree(the_repository);
 
        trace2_region_enter("fsm_hook", "query", NULL);
 
index 416fe1e3dcce6616a272e9ef42ef85cb5cc74a02..0fc6f84a6e629858ca6d1e65a3c1af352d043e95 100644 (file)
@@ -495,7 +495,7 @@ static void init_pathspec_item(struct pathspec_item *item, unsigned flags,
                        if (!have_git_dir())
                                die(_("'%s' is outside the directory tree"),
                                    copyfrom);
-                       hint_path = get_git_work_tree();
+                       hint_path = repo_get_work_tree(the_repository);
                        if (!hint_path)
                                hint_path = repo_get_git_dir(the_repository);
                        die(_("%s: '%s' is outside repository at '%s'"), elt,
index c2c231a7fd89f24cbd4e30e35c8401a4372b02ae..afdd194621105937bf7f4e9489182a33f733e379 100644 (file)
@@ -126,6 +126,11 @@ const char *repo_get_graft_file(struct repository *repo)
        return repo->graft_file;
 }
 
+const char *repo_get_work_tree(struct repository *repo)
+{
+       return repo->worktree;
+}
+
 static void repo_set_commondir(struct repository *repo,
                               const char *commondir)
 {
index ad0f984b44493d5ba6cd7d673130eeb8160848e2..c603e969ae758713d9347243b3e4f954ca25d2cf 100644 (file)
@@ -211,6 +211,7 @@ const char *repo_get_common_dir(struct repository *repo);
 const char *repo_get_object_directory(struct repository *repo);
 const char *repo_get_index_file(struct repository *repo);
 const char *repo_get_graft_file(struct repository *repo);
+const char *repo_get_work_tree(struct repository *repo);
 
 /*
  * Define a custom repository layout. Any field can be NULL, which
diff --git a/setup.c b/setup.c
index 1ebcab625fe642c688a449b2d88f2c8c3e2fa21d..1bfec288ab699453f35d074e722d8b49f12ba06c 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -51,7 +51,7 @@ static int abspath_part_inside_repo(char *path)
        size_t wtlen;
        char *path0;
        int off;
-       const char *work_tree = precompose_string_if_needed(get_git_work_tree());
+       const char *work_tree = precompose_string_if_needed(repo_get_work_tree(the_repository));
        struct strbuf realpath = STRBUF_INIT;
 
        if (!work_tree)
@@ -147,7 +147,7 @@ char *prefix_path(const char *prefix, int len, const char *path)
 {
        char *r = prefix_path_gently(prefix, len, NULL, path);
        if (!r) {
-               const char *hint_path = get_git_work_tree();
+               const char *hint_path = repo_get_work_tree(the_repository);
                if (!hint_path)
                        hint_path = repo_get_git_dir(the_repository);
                die(_("'%s' is outside repository at '%s'"), path,
@@ -475,7 +475,7 @@ int is_inside_git_dir(void)
 int is_inside_work_tree(void)
 {
        if (inside_work_tree < 0)
-               inside_work_tree = is_inside_dir(get_git_work_tree());
+               inside_work_tree = is_inside_dir(repo_get_work_tree(the_repository));
        return inside_work_tree;
 }
 
@@ -490,7 +490,7 @@ void setup_work_tree(void)
        if (work_tree_config_is_bogus)
                die(_("unable to set up work tree using invalid config"));
 
-       work_tree = get_git_work_tree();
+       work_tree = repo_get_work_tree(the_repository);
        if (!work_tree || chdir_notify(work_tree))
                die(_("this operation must be run in a work tree"));
 
@@ -547,7 +547,7 @@ static void setup_original_cwd(void)
         * Get our worktree; we only protect the current working directory
         * if it's in the worktree.
         */
-       worktree = get_git_work_tree();
+       worktree = repo_get_work_tree(the_repository);
        if (!worktree)
                goto no_prevention_needed;
 
@@ -1062,9 +1062,9 @@ static const char *setup_explicit_git_dir(const char *gitdirenv,
                set_git_work_tree(".");
 
        /* set_git_work_tree() must have been called by now */
-       worktree = get_git_work_tree();
+       worktree = repo_get_work_tree(the_repository);
 
-       /* both get_git_work_tree() and cwd are already normalized */
+       /* both repo_get_work_tree() and cwd are already normalized */
        if (!strcmp(cwd->buf, worktree)) { /* cwd == worktree */
                set_git_dir(gitdirenv, 0);
                free(gitfile);
@@ -2192,7 +2192,7 @@ static int create_default_files(const char *template_path,
        char *path;
        int reinit;
        int filemode;
-       const char *work_tree = get_git_work_tree();
+       const char *work_tree = repo_get_work_tree(the_repository);
 
        /*
         * First copy the templates -- we might have the default
diff --git a/trace.c b/trace.c
index e6728c301f3963378590b65c94f22cf59c7f64e6..d8c43773ae8b96bff61db1835cd1f19694be56b3 100644 (file)
--- a/trace.c
+++ b/trace.c
@@ -25,7 +25,6 @@
 
 #include "git-compat-util.h"
 #include "abspath.h"
-#include "environment.h"
 #include "repository.h"
 #include "quote.h"
 #include "setup.h"
@@ -308,7 +307,7 @@ void trace_repo_setup(void)
 
        cwd = xgetcwd();
 
-       if (!(git_work_tree = get_git_work_tree()))
+       if (!(git_work_tree = repo_get_work_tree(the_repository)))
                git_work_tree = "(null)";
 
        if (!startup_info->prefix)