repository: fix configuration updating issue while reinitialization When the repository was reinitialized, every configuration change in repo_init_config() was directly performed against the file on the filesystem. However, a previous version of the configuration had previously been loaded in memory and attached to the repository, in repo_init_reinit(). The repository was unaware of the change and the stale cached version of the configuration never refreshed.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
diff --git a/src/repository.c b/src/repository.c
index 23a95b2..bee7b3e 100644
--- a/src/repository.c
+++ b/src/repository.c
@@ -602,14 +602,10 @@ void git_repository_set_index(git_repository *repo, git_index *index)
GIT_REFCOUNT_INC(index);
}
-static int check_repositoryformatversion(git_repository *repo)
+static int check_repositoryformatversion(git_config *config)
{
- git_config *config;
int version;
- if (git_repository_config__weakptr(&config, repo) < 0)
- return -1;
-
if (git_config_get_int32(&version, config, "core.repositoryformatversion") < 0)
return -1;
@@ -623,26 +619,6 @@ static int check_repositoryformatversion(git_repository *repo)
return 0;
}
-static int repo_init_reinit(git_repository **repo_out, const char *repository_path, int is_bare)
-{
- git_repository *repo = NULL;
-
- GIT_UNUSED(is_bare);
-
- if (git_repository_open(&repo, repository_path) < 0)
- return -1;
-
- if (check_repositoryformatversion(repo) < 0) {
- git_repository_free(repo);
- return -1;
- }
-
- /* TODO: reinitialize the templates */
-
- *repo_out = repo;
- return 0;
-}
-
static int repo_init_createhead(const char *git_dir)
{
git_buf ref_path = GIT_BUF_INIT;
@@ -717,6 +693,12 @@ static int repo_init_config(const char *git_dir, bool is_bare, bool is_reinit)
return -1;
}
+ if (is_reinit && check_repositoryformatversion(config) < 0) {
+ git_buf_free(&cfg_path);
+ git_config_free(config);
+ return -1;
+ }
+
SET_REPO_CONFIG(bool, "core.bare", is_bare);
SET_REPO_CONFIG(int32, "core.repositoryformatversion", GIT_REPO_VERSION);
SET_REPO_CONFIG(bool, "core.filemode", is_chmod_supported(git_buf_cstr(&cfg_path)));
@@ -850,21 +832,18 @@ int git_repository_init(git_repository **repo_out, const char *path, unsigned is
is_reinit = git_path_isdir(repository_path.ptr) && valid_repository_path(&repository_path);
if (is_reinit) {
- if (repo_init_reinit(repo_out, repository_path.ptr, is_bare) < 0)
- goto cleanup;
+ /* TODO: reinitialize the templates */
- result = repo_init_config(repository_path.ptr, is_bare, is_reinit);
- goto cleanup;
- }
+ if (repo_init_config(repository_path.ptr, is_bare, is_reinit) < 0)
+ goto cleanup;
- if (repo_init_structure(repository_path.ptr, is_bare) < 0 ||
+ } else if (repo_init_structure(repository_path.ptr, is_bare) < 0 ||
repo_init_config(repository_path.ptr, is_bare, is_reinit) < 0 ||
- repo_init_createhead(repository_path.ptr) < 0 ||
- git_repository_open(repo_out, repository_path.ptr) < 0) {
+ repo_init_createhead(repository_path.ptr) < 0) {
goto cleanup;
}
- result = 0;
+ result = git_repository_open(repo_out, repository_path.ptr);
cleanup:
git_buf_free(&repository_path);