aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2024-04-18 14:14:33 +0200
committerJunio C Hamano <gitster@pobox.com>2024-04-18 12:30:43 -0700
commit0c473557908ec626e9e8abf66d2f2308624cdd14 (patch)
tree7ef432ed0cb0253d9fbbbc3f084e4a3ea596bbff
parent19fa8cd48c106ded717eeaf145b45e995318f3fe (diff)
downloadgit-0c473557908ec626e9e8abf66d2f2308624cdd14.tar.gz
repository: drop `initialize_the_repository()`
Now that we have dropped `the_index`, `initialize_the_repository()` doesn't really do a lot anymore except for setting up the pointer for `the_repository` and then calling `initialize_repository()`. The former can be replaced by statically initializing the pointer though, which basically makes this function moot. Convert callers to instead call `initialize_repository(the_repository)` and drop `initialize_thee_repository()`. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--common-main.c2
-rw-r--r--oss-fuzz/fuzz-commit-graph.c3
-rw-r--r--repository.c29
-rw-r--r--repository.h2
-rw-r--r--t/helper/test-read-cache.c2
5 files changed, 26 insertions, 12 deletions
diff --git a/common-main.c b/common-main.c
index 033778b3c5..b86f40600f 100644
--- a/common-main.c
+++ b/common-main.c
@@ -48,7 +48,7 @@ int main(int argc, const char **argv)
setlocale(LC_CTYPE, "");
git_setup_gettext();
- initialize_the_repository();
+ initialize_repository(the_repository);
attr_start();
diff --git a/oss-fuzz/fuzz-commit-graph.c b/oss-fuzz/fuzz-commit-graph.c
index 2992079dd9..fe15e2c225 100644
--- a/oss-fuzz/fuzz-commit-graph.c
+++ b/oss-fuzz/fuzz-commit-graph.c
@@ -11,7 +11,8 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
struct commit_graph *g;
- initialize_the_repository();
+ initialize_repository(the_repository);
+
/*
* Initialize the_repository with commit-graph settings that would
* normally be read from the repository's gitdir. We want to avoid
diff --git a/repository.c b/repository.c
index 089edbffa2..2118f563e3 100644
--- a/repository.c
+++ b/repository.c
@@ -17,22 +17,35 @@
/* The main repository */
static struct repository the_repo;
-struct repository *the_repository;
+struct repository *the_repository = &the_repo;
-static void initialize_repository(struct repository *repo)
+void initialize_repository(struct repository *repo)
{
repo->objects = raw_object_store_new();
repo->remote_state = remote_state_new();
repo->parsed_objects = parsed_object_pool_new();
ALLOC_ARRAY(repo->index, 1);
index_state_init(repo->index, repo);
-}
-void initialize_the_repository(void)
-{
- the_repository = &the_repo;
- initialize_repository(the_repository);
- repo_set_hash_algo(&the_repo, GIT_HASH_SHA1);
+ /*
+ * Unfortunately, we need to keep this hack around for the time being:
+ *
+ * - Not setting up the hash algorithm for `the_repository` leads to
+ * crashes because `the_hash_algo` is a macro that expands to
+ * `the_repository->hash_algo`. So if Git commands try to access
+ * `the_hash_algo` without a Git directory we crash.
+ *
+ * - Setting up the hash algorithm to be SHA1 by default breaks other
+ * commands when running with SHA256.
+ *
+ * This is another point in case why having global state is a bad idea.
+ * Eventually, we should remove this hack and stop setting the hash
+ * algorithm in this function altogether. Instead, it should only ever
+ * be set via our repository setup procedures. But that requires more
+ * work.
+ */
+ if (repo == the_repository)
+ repo_set_hash_algo(repo, GIT_HASH_SHA1);
}
static void expand_base_dir(char **out, const char *in,
diff --git a/repository.h b/repository.h
index 6f4af15417..41ed22543a 100644
--- a/repository.h
+++ b/repository.h
@@ -207,7 +207,7 @@ void repo_set_worktree(struct repository *repo, const char *path);
void repo_set_hash_algo(struct repository *repo, int algo);
void repo_set_compat_hash_algo(struct repository *repo, int compat_algo);
void repo_set_ref_storage_format(struct repository *repo, unsigned int format);
-void initialize_the_repository(void);
+void initialize_repository(struct repository *repo);
RESULT_MUST_BE_USED
int repo_init(struct repository *r, const char *gitdir, const char *worktree);
diff --git a/t/helper/test-read-cache.c b/t/helper/test-read-cache.c
index 458efa88a6..e803c43ece 100644
--- a/t/helper/test-read-cache.c
+++ b/t/helper/test-read-cache.c
@@ -9,7 +9,7 @@ int cmd__read_cache(int argc, const char **argv)
int i, cnt = 1;
const char *name = NULL;
- initialize_the_repository();
+ initialize_repository(the_repository);
if (argc > 1 && skip_prefix(argv[1], "--print-and-refresh=", &name)) {
argc--;