mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
repository: add a compatibility hash algorithm
We currently have support for using a full stage 4 SHA-256 implementation. However, we'd like to support interoperability with SHA-1 repositories as well. The transition plan anticipates a compatibility hash algorithm configuration option that we can use to implement support for this. Let's add an element to the repository structure that indicates the compatibility hash algorithm so we can use it when we need to consider interoperability between algorithms. Add a helper function repo_set_compat_hash_algo that takes a compatibility hash algorithm and sets "repo->compat_hash_algo". If GIT_HASH_UNKNOWN is passed as the compatibility hash algorithm "repo->compat_hash_algo" is set to NULL. For now, the code results in "repo->compat_hash_algo" always being set to NULL, but that will change once a configuration option is added. Inspired-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
52fca06db2
commit
15a1ca1abe
@@ -104,6 +104,13 @@ void repo_set_hash_algo(struct repository *repo, int hash_algo)
|
|||||||
repo->hash_algo = &hash_algos[hash_algo];
|
repo->hash_algo = &hash_algos[hash_algo];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void repo_set_compat_hash_algo(struct repository *repo, int algo)
|
||||||
|
{
|
||||||
|
if (hash_algo_by_ptr(repo->hash_algo) == algo)
|
||||||
|
BUG("hash_algo and compat_hash_algo match");
|
||||||
|
repo->compat_hash_algo = algo ? &hash_algos[algo] : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attempt to resolve and set the provided 'gitdir' for repository 'repo'.
|
* Attempt to resolve and set the provided 'gitdir' for repository 'repo'.
|
||||||
* Return 0 upon success and a non-zero value upon failure.
|
* Return 0 upon success and a non-zero value upon failure.
|
||||||
@@ -184,6 +191,7 @@ int repo_init(struct repository *repo,
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
repo_set_hash_algo(repo, format.hash_algo);
|
repo_set_hash_algo(repo, format.hash_algo);
|
||||||
|
repo_set_compat_hash_algo(repo, GIT_HASH_UNKNOWN);
|
||||||
repo->repository_format_worktree_config = format.worktree_config;
|
repo->repository_format_worktree_config = format.worktree_config;
|
||||||
|
|
||||||
/* take ownership of format.partial_clone */
|
/* take ownership of format.partial_clone */
|
||||||
|
|||||||
@@ -160,6 +160,9 @@ struct repository {
|
|||||||
/* Repository's current hash algorithm, as serialized on disk. */
|
/* Repository's current hash algorithm, as serialized on disk. */
|
||||||
const struct git_hash_algo *hash_algo;
|
const struct git_hash_algo *hash_algo;
|
||||||
|
|
||||||
|
/* Repository's compatibility hash algorithm. */
|
||||||
|
const struct git_hash_algo *compat_hash_algo;
|
||||||
|
|
||||||
/* A unique-id for tracing purposes. */
|
/* A unique-id for tracing purposes. */
|
||||||
int trace2_repo_id;
|
int trace2_repo_id;
|
||||||
|
|
||||||
@@ -199,6 +202,7 @@ void repo_set_gitdir(struct repository *repo, const char *root,
|
|||||||
const struct set_gitdir_args *extra_args);
|
const struct set_gitdir_args *extra_args);
|
||||||
void repo_set_worktree(struct repository *repo, const char *path);
|
void repo_set_worktree(struct repository *repo, const char *path);
|
||||||
void repo_set_hash_algo(struct repository *repo, int algo);
|
void repo_set_hash_algo(struct repository *repo, int algo);
|
||||||
|
void repo_set_compat_hash_algo(struct repository *repo, int compat_algo);
|
||||||
void initialize_the_repository(void);
|
void initialize_the_repository(void);
|
||||||
RESULT_MUST_BE_USED
|
RESULT_MUST_BE_USED
|
||||||
int repo_init(struct repository *r, const char *gitdir, const char *worktree);
|
int repo_init(struct repository *r, const char *gitdir, const char *worktree);
|
||||||
|
|||||||
3
setup.c
3
setup.c
@@ -1564,6 +1564,8 @@ const char *setup_git_directory_gently(int *nongit_ok)
|
|||||||
}
|
}
|
||||||
if (startup_info->have_repository) {
|
if (startup_info->have_repository) {
|
||||||
repo_set_hash_algo(the_repository, repo_fmt.hash_algo);
|
repo_set_hash_algo(the_repository, repo_fmt.hash_algo);
|
||||||
|
repo_set_compat_hash_algo(the_repository,
|
||||||
|
GIT_HASH_UNKNOWN);
|
||||||
the_repository->repository_format_worktree_config =
|
the_repository->repository_format_worktree_config =
|
||||||
repo_fmt.worktree_config;
|
repo_fmt.worktree_config;
|
||||||
/* take ownership of repo_fmt.partial_clone */
|
/* take ownership of repo_fmt.partial_clone */
|
||||||
@@ -1657,6 +1659,7 @@ void check_repository_format(struct repository_format *fmt)
|
|||||||
check_repository_format_gently(get_git_dir(), fmt, NULL);
|
check_repository_format_gently(get_git_dir(), fmt, NULL);
|
||||||
startup_info->have_repository = 1;
|
startup_info->have_repository = 1;
|
||||||
repo_set_hash_algo(the_repository, fmt->hash_algo);
|
repo_set_hash_algo(the_repository, fmt->hash_algo);
|
||||||
|
repo_set_compat_hash_algo(the_repository, GIT_HASH_UNKNOWN);
|
||||||
the_repository->repository_format_worktree_config =
|
the_repository->repository_format_worktree_config =
|
||||||
fmt->worktree_config;
|
fmt->worktree_config;
|
||||||
the_repository->repository_format_partial_clone =
|
the_repository->repository_format_partial_clone =
|
||||||
|
|||||||
Reference in New Issue
Block a user