Re: [RFC PATCH 5/6] Integrate hash algorithm support with repo setup
From: Stefan Beller <hidden>
Date: 2017-08-21 21:16:35
On Sun, Aug 20, 2017 at 5:00 PM, brian m. carlson [off-list ref] wrote:
In future versions of Git, we plan to support an additional hash algorithm. Integrate the enumeration of hash algorithms with repository setup, and store a pointer to the enumerated data in struct repository. Of course, we currently only support SHA-1, so hard-code this value in read_repository_format. In the future, we'll enumerate this value from the configuration. Add a constant, current_hash, which points to the hash_algo structure pointer in the repository global. Include repository.h in cache.h since we now need to have access to these struct and variable definitions. Signed-off-by: brian m. carlson <redacted>
The new code seems to fit in nicely with the repository struct. In another series I also included repository.h in cache.h (not yet sent out), so I think that is a good idea.
quoted hunk ↗ jump to hunk
--- cache.h | 4 ++++ repository.c | 7 +++++++ repository.h | 5 +++++ setup.c | 2 ++ 4 files changed, 18 insertions(+)diff --git a/cache.h b/cache.h index 375a7fb15e..d759824803 100644 --- a/cache.h +++ b/cache.h@@ -13,6 +13,7 @@ #include "hash.h" #include "path.h" #include "sha1-array.h" +#include "repository.h" #ifndef platform_SHA_CTX /*@@ -112,6 +113,8 @@ struct git_hash_algo { }; extern const struct git_hash_algo hash_algos[1]; +#define current_hash the_repository->hash_algo + #if defined(DT_UNKNOWN) && !defined(NO_D_TYPE_IN_DIRENT) #define DTYPE(de) ((de)->d_type) #else@@ -894,6 +897,7 @@ struct repository_format { int version; int precious_objects; int is_bare; + int hash_algo; char *work_tree; struct string_list unknown_extensions; };diff --git a/repository.c b/repository.c index 1617467568..37764f627a 100644 --- a/repository.c +++ b/repository.c@@ -62,6 +62,11 @@ void repo_set_gitdir(struct repository *repo, const char *path) repo_setup_env(repo); } +void repo_set_hash_algo(struct repository *repo, int hash_algo) +{ + repo->hash_algo = &hash_algos[hash_algo]; +} + /* * Attempt to resolve and set the provided 'gitdir' for repository 'repo'. * Return 0 upon success and a non-zero value upon failure.@@ -134,6 +139,8 @@ int repo_init(struct repository *repo, const char *gitdir, const char *worktree) if (read_and_verify_repository_format(&format, repo->commondir)) goto error; + repo->hash_algo = &hash_algos[format.hash_algo]; + if (worktree) repo_set_worktree(repo, worktree);diff --git a/repository.h b/repository.h index 417787f3ef..f171172150 100644 --- a/repository.h +++ b/repository.h@@ -4,6 +4,7 @@ struct config_set; struct index_state; struct submodule_cache; +struct git_hash_algo; struct repository { /* Environment */@@ -67,6 +68,9 @@ struct repository { */ struct index_state *index; + /* Repository's current hash algorithm. */ + const struct git_hash_algo *hash_algo; + /* Configurations */ /* * Bit used during initialization to indicate if repository state (like@@ -86,6 +90,7 @@ extern struct repository *the_repository; extern void repo_set_gitdir(struct repository *repo, const char *path); extern void repo_set_worktree(struct repository *repo, const char *path); +extern void repo_set_hash_algo(struct repository *repo, int algo); extern int repo_init(struct repository *repo, const char *gitdir, const char *worktree); extern int repo_submodule_init(struct repository *submodule, struct repository *superproject,diff --git a/setup.c b/setup.c index 115e70a4e8..289e24811c 100644 --- a/setup.c +++ b/setup.c@@ -491,6 +491,7 @@ int read_repository_format(struct repository_format *format, const char *path) memset(format, 0, sizeof(*format)); format->version = -1; format->is_bare = -1; + format->hash_algo = GIT_HASH_SHA1; string_list_init(&format->unknown_extensions, 1); git_config_from_file(check_repo_format, path, format); return format->version;@@ -1125,6 +1126,7 @@ const char *setup_git_directory_gently(int *nongit_ok) repo_set_gitdir(the_repository, gitdir); setup_git_env(); } + repo_set_hash_algo(the_repository, repo_fmt.hash_algo); } strbuf_release(&dir);