Commit 366973f3 by Edward Thomson

repo: don't overwrite repo format version on reinit

Ensure that we maintain the `core.repositoryFormatVersion` value instead
of always overwriting it with the default.
parent 3dfc12d5
...@@ -76,8 +76,8 @@ static int load_objectformat(git_repository *repo, git_config *config); ...@@ -76,8 +76,8 @@ static int load_objectformat(git_repository *repo, git_config *config);
#define GIT_BRANCH_DEFAULT "master" #define GIT_BRANCH_DEFAULT "master"
#define GIT_REPO_VERSION 0 #define GIT_REPO_VERSION_DEFAULT 0
#define GIT_REPO_MAX_VERSION 1 #define GIT_REPO_VERSION_MAX 1
git_str git_repository__reserved_names_win32[] = { git_str git_repository__reserved_names_win32[] = {
{ DOT_GIT, 0, CONST_STRLEN(DOT_GIT) }, { DOT_GIT, 0, CONST_STRLEN(DOT_GIT) },
...@@ -1016,7 +1016,8 @@ int git_repository_open_ext( ...@@ -1016,7 +1016,8 @@ int git_repository_open_ext(
if (error < 0 && error != GIT_ENOTFOUND) if (error < 0 && error != GIT_ENOTFOUND)
goto cleanup; goto cleanup;
if (config && (error = check_repositoryformatversion(&version, config)) < 0) if (config &&
(error = check_repositoryformatversion(&version, config)) < 0)
goto cleanup; goto cleanup;
if ((error = check_extensions(config, version)) < 0) if ((error = check_extensions(config, version)) < 0)
...@@ -1539,6 +1540,7 @@ static int check_repositoryformatversion(int *version, git_config *config) ...@@ -1539,6 +1540,7 @@ static int check_repositoryformatversion(int *version, git_config *config)
int error; int error;
error = git_config_get_int32(version, config, "core.repositoryformatversion"); error = git_config_get_int32(version, config, "core.repositoryformatversion");
/* git ignores this if the config variable isn't there */ /* git ignores this if the config variable isn't there */
if (error == GIT_ENOTFOUND) if (error == GIT_ENOTFOUND)
return 0; return 0;
...@@ -1546,10 +1548,15 @@ static int check_repositoryformatversion(int *version, git_config *config) ...@@ -1546,10 +1548,15 @@ static int check_repositoryformatversion(int *version, git_config *config)
if (error < 0) if (error < 0)
return -1; return -1;
if (GIT_REPO_MAX_VERSION < *version) { if (*version < 0) {
git_error_set(GIT_ERROR_REPOSITORY,
"invalid repository version %d", *version);
}
if (GIT_REPO_VERSION_MAX < *version) {
git_error_set(GIT_ERROR_REPOSITORY, git_error_set(GIT_ERROR_REPOSITORY,
"unsupported repository version %d; only versions up to %d are supported", "unsupported repository version %d; only versions up to %d are supported",
*version, GIT_REPO_MAX_VERSION); *version, GIT_REPO_VERSION_MAX);
return -1; return -1;
} }
...@@ -1963,12 +1970,13 @@ static int repo_init_config( ...@@ -1963,12 +1970,13 @@ static int repo_init_config(
git_config *config = NULL; git_config *config = NULL;
bool is_bare = ((flags & GIT_REPOSITORY_INIT_BARE) != 0); bool is_bare = ((flags & GIT_REPOSITORY_INIT_BARE) != 0);
bool is_reinit = ((flags & GIT_REPOSITORY_INIT__IS_REINIT) != 0); bool is_reinit = ((flags & GIT_REPOSITORY_INIT__IS_REINIT) != 0);
int version = 0; int version = GIT_REPO_VERSION_DEFAULT;
if ((error = repo_local_config(&config, &cfg_path, NULL, repo_dir)) < 0) if ((error = repo_local_config(&config, &cfg_path, NULL, repo_dir)) < 0)
goto cleanup; goto cleanup;
if (is_reinit && (error = check_repositoryformatversion(&version, config)) < 0) if (is_reinit &&
(error = check_repositoryformatversion(&version, config)) < 0)
goto cleanup; goto cleanup;
if ((error = check_extensions(config, version)) < 0) if ((error = check_extensions(config, version)) < 0)
...@@ -1979,7 +1987,7 @@ static int repo_init_config( ...@@ -1979,7 +1987,7 @@ static int repo_init_config(
goto cleanup; } while (0) goto cleanup; } while (0)
SET_REPO_CONFIG(bool, "core.bare", is_bare); SET_REPO_CONFIG(bool, "core.bare", is_bare);
SET_REPO_CONFIG(int32, "core.repositoryformatversion", GIT_REPO_VERSION); SET_REPO_CONFIG(int32, "core.repositoryformatversion", version);
if ((error = repo_init_fs_configs( if ((error = repo_init_fs_configs(
config, cfg_path.ptr, repo_dir, work_dir, !is_reinit)) < 0) config, cfg_path.ptr, repo_dir, work_dir, !is_reinit)) < 0)
......
...@@ -142,27 +142,46 @@ void test_repo_init__reinit_bare_repo(void) ...@@ -142,27 +142,46 @@ void test_repo_init__reinit_bare_repo(void)
cl_git_pass(git_repository_init(&g_repo, "reinit.git", 1)); cl_git_pass(git_repository_init(&g_repo, "reinit.git", 1));
} }
void test_repo_init__reinit_too_recent_bare_repo(void) void test_repo_init__reinit_nondefault_version(void)
{ {
git_config *config; git_config *config;
cl_set_cleanup(&cleanup_repository, "reinit.git");
/* Initialize the repository */ /* Initialize the repository */
cl_git_pass(git_repository_init(&g_repo, "reinit.git", 1)); cl_git_pass(git_repository_init(&g_repo, "reinit.git", 1));
git_repository_config(&config, g_repo); git_repository_config(&config, g_repo);
/* Set the config to a supported but not default version */
cl_repo_set_string(g_repo, "core.repositoryformatversion", "1");
git_config_free(config);
git_repository_free(g_repo);
g_repo = NULL;
/* Try to reinitialize the repository */
cl_git_pass(git_repository_init(&g_repo, "reinit.git", 1));
cl_assert_equal_i(1, cl_repo_get_int(g_repo, "core.repositoryformatversion"));
cl_fixture_cleanup("reinit.git");
}
void test_repo_init__reinit_unsupported_version(void)
{
cl_set_cleanup(&cleanup_repository, "reinit.git");
/* Initialize the repository */
cl_git_pass(git_repository_init(&g_repo, "reinit.git", 1));
/* /*
* Hack the config of the repository to make it look like it has * Hack the config of the repository to make it look like it has
* been created by a recenter version of git/libgit2 * been created by a too new and unsupported version of git/libgit2
*/ */
cl_git_pass(git_config_set_int32(config, "core.repositoryformatversion", 42)); cl_repo_set_string(g_repo, "core.repositoryformatversion", "42");
git_config_free(config);
git_repository_free(g_repo); git_repository_free(g_repo);
g_repo = NULL; g_repo = NULL;
/* Try to reinitialize the repository */ /* Try and fail to reinitialize the repository */
cl_git_fail(git_repository_init(&g_repo, "reinit.git", 1)); cl_git_fail(git_repository_init(&g_repo, "reinit.git", 1));
cl_fixture_cleanup("reinit.git"); cl_fixture_cleanup("reinit.git");
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment