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 <sandals@xxxxxxxxxxxxxxxxxxxx> --- 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);