On Sun, Aug 20, 2017 at 5:00 PM, brian m. carlson <sandals@xxxxxxxxxxxxxxxxxxxx> 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 <sandals@xxxxxxxxxxxxxxxxxxxx> 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. > --- > 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);