summaryrefslogtreecommitdiff
path: root/repository.c
diff options
context:
space:
mode:
Diffstat (limited to 'repository.c')
-rw-r--r--repository.c47
1 files changed, 19 insertions, 28 deletions
diff --git a/repository.c b/repository.c
index 1617467568..bb2fae5446 100644
--- a/repository.c
+++ b/repository.c
@@ -4,7 +4,9 @@
#include "submodule-config.h"
/* The main repository */
-static struct repository the_repo;
+static struct repository the_repo = {
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &the_index, 0, 0
+};
struct repository *the_repository = &the_repo;
static char *git_path_from_env(const char *envvar, const char *git_dir,
@@ -38,11 +40,15 @@ static void repo_setup_env(struct repository *repo)
repo->different_commondir = find_common_dir(&sb, repo->gitdir,
!repo->ignore_env);
+ free(repo->commondir);
repo->commondir = strbuf_detach(&sb, NULL);
+ free(repo->objectdir);
repo->objectdir = git_path_from_env(DB_ENVIRONMENT, repo->commondir,
"objects", !repo->ignore_env);
+ free(repo->graft_file);
repo->graft_file = git_path_from_env(GRAFT_ENVIRONMENT, repo->commondir,
"info/grafts", !repo->ignore_env);
+ free(repo->index_file);
repo->index_file = git_path_from_env(INDEX_ENVIRONMENT, repo->gitdir,
"index", !repo->ignore_env);
}
@@ -50,16 +56,12 @@ static void repo_setup_env(struct repository *repo)
void repo_set_gitdir(struct repository *repo, const char *path)
{
const char *gitfile = read_gitfile(path);
+ char *old_gitdir = repo->gitdir;
- /*
- * NEEDSWORK: Eventually we want to be able to free gitdir and the rest
- * of the environment before reinitializing it again, but we have some
- * crazy code paths where we try to set gitdir with the current gitdir
- * and we don't want to free gitdir before copying the passed in value.
- */
repo->gitdir = xstrdup(gitfile ? gitfile : path);
-
repo_setup_env(repo);
+
+ free(old_gitdir);
}
/*
@@ -198,25 +200,17 @@ out:
void repo_clear(struct repository *repo)
{
- free(repo->gitdir);
- repo->gitdir = NULL;
- free(repo->commondir);
- repo->commondir = NULL;
- free(repo->objectdir);
- repo->objectdir = NULL;
- free(repo->graft_file);
- repo->graft_file = NULL;
- free(repo->index_file);
- repo->index_file = NULL;
- free(repo->worktree);
- repo->worktree = NULL;
- free(repo->submodule_prefix);
- repo->submodule_prefix = NULL;
+ FREE_AND_NULL(repo->gitdir);
+ FREE_AND_NULL(repo->commondir);
+ FREE_AND_NULL(repo->objectdir);
+ FREE_AND_NULL(repo->graft_file);
+ FREE_AND_NULL(repo->index_file);
+ FREE_AND_NULL(repo->worktree);
+ FREE_AND_NULL(repo->submodule_prefix);
if (repo->config) {
git_configset_clear(repo->config);
- free(repo->config);
- repo->config = NULL;
+ FREE_AND_NULL(repo->config);
}
if (repo->submodule_cache) {
@@ -226,8 +220,7 @@ void repo_clear(struct repository *repo)
if (repo->index) {
discard_index(repo->index);
- free(repo->index);
- repo->index = NULL;
+ FREE_AND_NULL(repo->index);
}
}
@@ -235,8 +228,6 @@ int repo_read_index(struct repository *repo)
{
if (!repo->index)
repo->index = xcalloc(1, sizeof(*repo->index));
- else
- discard_index(repo->index);
return read_index_from(repo->index, repo->index_file);
}