summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel Arroz <750683+arroz@users.noreply.github.com>2023-02-17 11:06:48 -0800
committerMiguel Arroz <750683+arroz@users.noreply.github.com>2023-02-17 11:06:48 -0800
commitc1b024fb4d69f9a9eab3d1f20d9547d0e59ae642 (patch)
treec3461601cae5922f1164bdf40463fbda01fc53af
parent795758d2ada5b4760664050230343920eab528f6 (diff)
downloadlibgit2-c1b024fb4d69f9a9eab3d1f20d9547d0e59ae642.tar.gz
#6491: Sets oid_type on repos open with git_repository_open_bare
-rw-r--r--src/libgit2/repository.c70
-rw-r--r--tests/libgit2/repo/open.c3
2 files changed, 51 insertions, 22 deletions
diff --git a/src/libgit2/repository.c b/src/libgit2/repository.c
index 489d627a0..45387b531 100644
--- a/src/libgit2/repository.c
+++ b/src/libgit2/repository.c
@@ -733,6 +733,43 @@ out:
return error;
}
+static int obtain_config_and_set_oid_type(
+ git_config **config_ptr,
+ git_repository *repo)
+{
+ int error;
+ git_config *config = NULL;
+ int version = 0;
+
+ /*
+ * We'd like to have the config, but git doesn't particularly
+ * care if it's not there, so we need to deal with that.
+ */
+
+ error = git_repository_config_snapshot(&config, repo);
+ if (error < 0 && error != GIT_ENOTFOUND)
+ goto out;
+
+ if (config &&
+ (error = check_repositoryformatversion(&version, config)) < 0)
+ goto out;
+
+ if ((error = check_extensions(config, version)) < 0)
+ goto out;
+
+ if (version > 0) {
+ if ((error = load_objectformat(repo, config)) < 0)
+ goto out;
+ } else {
+ repo->oid_type = GIT_OID_SHA1;
+ }
+
+out:
+ *config_ptr = config;
+
+ return error;
+}
+
int git_repository_open_bare(
git_repository **repo_ptr,
const char *bare_path)
@@ -741,6 +778,7 @@ int git_repository_open_bare(
git_repository *repo = NULL;
bool is_valid;
int error;
+ git_config *config;
if ((error = git_fs_path_prettify_dir(&path, bare_path, NULL)) < 0 ||
(error = is_valid_repository_path(&is_valid, &path, &common_path)) < 0)
@@ -766,8 +804,15 @@ int git_repository_open_bare(
repo->is_worktree = 0;
repo->workdir = NULL;
+ if ((error = obtain_config_and_set_oid_type(&config, repo)) < 0)
+ goto cleanup;
+
*repo_ptr = repo;
- return 0;
+
+cleanup:
+ git_config_free(config);
+
+ return error;
}
static int _git_repository_open_ext_from_env(
@@ -1007,20 +1052,8 @@ int git_repository_open_ext(
goto cleanup;
repo->is_worktree = is_worktree;
- /*
- * We'd like to have the config, but git doesn't particularly
- * care if it's not there, so we need to deal with that.
- */
-
- error = git_repository_config_snapshot(&config, repo);
- if (error < 0 && error != GIT_ENOTFOUND)
- goto cleanup;
-
- if (config &&
- (error = check_repositoryformatversion(&version, config)) < 0)
- goto cleanup;
-
- if ((error = check_extensions(config, version)) < 0)
+ error = obtain_config_and_set_oid_type(&config, repo);
+ if (error < 0)
goto cleanup;
if ((flags & GIT_REPOSITORY_OPEN_BARE) != 0) {
@@ -1032,13 +1065,6 @@ int git_repository_open_ext(
goto cleanup;
}
- if (version > 0) {
- if ((error = load_objectformat(repo, config)) < 0)
- goto cleanup;
- } else {
- repo->oid_type = GIT_OID_SHA1;
- }
-
/*
* Ensure that the git directory and worktree are
* owned by the current user.
diff --git a/tests/libgit2/repo/open.c b/tests/libgit2/repo/open.c
index d835240b7..3d1a0620b 100644
--- a/tests/libgit2/repo/open.c
+++ b/tests/libgit2/repo/open.c
@@ -410,6 +410,7 @@ void test_repo_open__no_config(void)
git_str_dispose(&path);
cl_git_pass(git_repository_open(&repo, "empty_standard_repo"));
+ cl_assert(git_repository_oid_type(repo) == GIT_OID_SHA1);
cl_git_pass(git_repository_config(&config, repo));
cl_git_pass(git_config_set_string(config, "test.set", "42"));
@@ -433,11 +434,13 @@ void test_repo_open__force_bare(void)
cl_git_pass(git_repository_open(&barerepo, "alternate"));
cl_assert(!git_repository_is_bare(barerepo));
+ cl_assert(git_repository_oid_type(barerepo) == GIT_OID_SHA1);
git_repository_free(barerepo);
cl_git_pass(git_repository_open_bare(
&barerepo, "empty_standard_repo/.git"));
cl_assert(git_repository_is_bare(barerepo));
+ cl_assert(git_repository_oid_type(barerepo) == GIT_OID_SHA1);
git_repository_free(barerepo);
cl_git_fail(git_repository_open_bare(&barerepo, "alternate/.git"));