diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2022-12-03 13:07:23 +0000 |
---|---|---|
committer | Edward Thomson <ethomson@edwardthomson.com> | 2022-12-03 20:37:15 +0000 |
commit | 2770d131bc3b86d234758b9623e186df5f66c4d1 (patch) | |
tree | 9796460842c721acadda409273e3d6d25422f9dd | |
parent | 975d210c5466cd9781fa8b61aad10d47a6d6a988 (diff) | |
download | libgit2-2770d131bc3b86d234758b9623e186df5f66c4d1.tar.gz |
repo: internal setter for `objectformat`
Provide an internal function to set the repository's `objectformat`,
both in the internal object and in the configuration.
-rw-r--r-- | src/libgit2/repository.c | 30 | ||||
-rw-r--r-- | src/libgit2/repository.h | 8 |
2 files changed, 38 insertions, 0 deletions
diff --git a/src/libgit2/repository.c b/src/libgit2/repository.c index 154a8ea6e..8784122b9 100644 --- a/src/libgit2/repository.c +++ b/src/libgit2/repository.c @@ -1644,6 +1644,36 @@ done: return error; } +int git_repository__set_objectformat( + git_repository *repo, + git_oid_t oid_type) +{ + git_config *cfg; + + /* + * Older clients do not necessarily understand the + * `objectformat` extension, even when it's set to an + * object format that they understand (SHA1). Do not set + * the objectformat extension unless we're not using the + * default object format. + */ + if (oid_type == GIT_OID_DEFAULT) + return 0; + + if (git_repository_config__weakptr(&cfg, repo) < 0) + return -1; + + if (git_config_set_int32(cfg, + "core.repositoryformatversion", 1) < 0 || + git_config_set_string(cfg, "extensions.objectFormat", + git_oid_type_name(oid_type)) < 0) + return -1; + + repo->oid_type = oid_type; + + return 0; +} + int git_repository__extensions(char ***out, size_t *out_len) { git_vector extensions; diff --git a/src/libgit2/repository.h b/src/libgit2/repository.h index b1e212a32..75380ae53 100644 --- a/src/libgit2/repository.h +++ b/src/libgit2/repository.h @@ -257,4 +257,12 @@ int git_repository__extensions(char ***out, size_t *out_len); int git_repository__set_extensions(const char **extensions, size_t len); void git_repository__free_extensions(void); +/* + * Set the object format (OID type) for a repository; this will set + * both the configuration and the internal value for the oid type. + */ +int git_repository__set_objectformat( + git_repository *repo, + git_oid_t oid_type); + #endif |