From af20d13b18dbab4de9f244402c255bc85e907ac1 Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Sun, 4 Dec 2022 14:22:02 +0000 Subject: repo: dump backends on oid type change --- src/libgit2/repository.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/libgit2/repository.c b/src/libgit2/repository.c index 2da6caf3a..928f4635c 100644 --- a/src/libgit2/repository.c +++ b/src/libgit2/repository.c @@ -1674,6 +1674,12 @@ int git_repository__set_objectformat( if (oid_type == GIT_OID_DEFAULT) return 0; + if (!git_repository_is_empty(repo) && repo->oid_type != oid_type) { + git_error_set(GIT_ERROR_REPOSITORY, + "cannot change object id type of existing repository"); + return -1; + } + if (git_repository_config__weakptr(&cfg, repo) < 0) return -1; @@ -1683,7 +1689,18 @@ int git_repository__set_objectformat( git_oid_type_name(oid_type)) < 0) return -1; - repo->oid_type = oid_type; + /* + * During repo init, we may create some backends with the + * default oid type. Clear them so that we create them with + * the proper oid type. + */ + if (repo->oid_type != oid_type) { + set_index(repo, NULL); + set_odb(repo, NULL); + set_refdb(repo, NULL); + + repo->oid_type = oid_type; + } return 0; } -- cgit v1.2.1