Merge branch 'bc/sha-256-part-1-of-4'
SHA-256 transition continues. * bc/sha-256-part-1-of-4: (22 commits) fast-import: add options for rewriting submodules fast-import: add a generic function to iterate over marks fast-import: make find_marks work on any mark set fast-import: add helper function for inserting mark object entries fast-import: permit reading multiple marks files commit: use expected signature header for SHA-256 worktree: allow repository version 1 init-db: move writing repo version into a function builtin/init-db: add environment variable for new repo hash builtin/init-db: allow specifying hash algorithm on command line setup: allow check_repository_format to read repository format t/helper: make repository tests hash independent t/helper: initialize repository if necessary t/helper/test-dump-split-index: initialize git repository t6300: make hash algorithm independent t6300: abstract away SHA-1-specific constants t: use hash-specific lookup tables to define test constants repository: require a build flag to use SHA-256 hex: add functions to parse hex object IDs in any algorithm hex: introduce parsing variants taking hash algorithms ...
This commit is contained in:
@ -20,6 +20,8 @@
|
||||
#define TEST_FILEMODE 1
|
||||
#endif
|
||||
|
||||
#define GIT_DEFAULT_HASH_ENVIRONMENT "GIT_DEFAULT_HASH"
|
||||
|
||||
static int init_is_bare_repository = 0;
|
||||
static int init_shared_repository = -1;
|
||||
static const char *init_db_template_dir;
|
||||
@ -176,13 +178,36 @@ static int needs_work_tree_config(const char *git_dir, const char *work_tree)
|
||||
return 1;
|
||||
}
|
||||
|
||||
void initialize_repository_version(int hash_algo)
|
||||
{
|
||||
char repo_version_string[10];
|
||||
int repo_version = GIT_REPO_VERSION;
|
||||
|
||||
#ifndef ENABLE_SHA256
|
||||
if (hash_algo != GIT_HASH_SHA1)
|
||||
die(_("The hash algorithm %s is not supported in this build."), hash_algos[hash_algo].name);
|
||||
#endif
|
||||
|
||||
if (hash_algo != GIT_HASH_SHA1)
|
||||
repo_version = GIT_REPO_VERSION_READ;
|
||||
|
||||
/* This forces creation of new config file */
|
||||
xsnprintf(repo_version_string, sizeof(repo_version_string),
|
||||
"%d", repo_version);
|
||||
git_config_set("core.repositoryformatversion", repo_version_string);
|
||||
|
||||
if (hash_algo != GIT_HASH_SHA1)
|
||||
git_config_set("extensions.objectformat",
|
||||
hash_algos[hash_algo].name);
|
||||
}
|
||||
|
||||
static int create_default_files(const char *template_path,
|
||||
const char *original_git_dir)
|
||||
const char *original_git_dir,
|
||||
const struct repository_format *fmt)
|
||||
{
|
||||
struct stat st1;
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
char *path;
|
||||
char repo_version_string[10];
|
||||
char junk[2];
|
||||
int reinit;
|
||||
int filemode;
|
||||
@ -244,10 +269,7 @@ static int create_default_files(const char *template_path,
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* This forces creation of new config file */
|
||||
xsnprintf(repo_version_string, sizeof(repo_version_string),
|
||||
"%d", GIT_REPO_VERSION);
|
||||
git_config_set("core.repositoryformatversion", repo_version_string);
|
||||
initialize_repository_version(fmt->hash_algo);
|
||||
|
||||
/* Check filemode trustability */
|
||||
path = git_path_buf(&buf, "config");
|
||||
@ -340,12 +362,33 @@ static void separate_git_dir(const char *git_dir, const char *git_link)
|
||||
write_file(git_link, "gitdir: %s", git_dir);
|
||||
}
|
||||
|
||||
static void validate_hash_algorithm(struct repository_format *repo_fmt, int hash)
|
||||
{
|
||||
const char *env = getenv(GIT_DEFAULT_HASH_ENVIRONMENT);
|
||||
/*
|
||||
* If we already have an initialized repo, don't allow the user to
|
||||
* specify a different algorithm, as that could cause corruption.
|
||||
* Otherwise, if the user has specified one on the command line, use it.
|
||||
*/
|
||||
if (repo_fmt->version >= 0 && hash != GIT_HASH_UNKNOWN && hash != repo_fmt->hash_algo)
|
||||
die(_("attempt to reinitialize repository with different hash"));
|
||||
else if (hash != GIT_HASH_UNKNOWN)
|
||||
repo_fmt->hash_algo = hash;
|
||||
else if (env) {
|
||||
int env_algo = hash_algo_by_name(env);
|
||||
if (env_algo == GIT_HASH_UNKNOWN)
|
||||
die(_("unknown hash algorithm '%s'"), env);
|
||||
repo_fmt->hash_algo = env_algo;
|
||||
}
|
||||
}
|
||||
|
||||
int init_db(const char *git_dir, const char *real_git_dir,
|
||||
const char *template_dir, unsigned int flags)
|
||||
const char *template_dir, int hash, unsigned int flags)
|
||||
{
|
||||
int reinit;
|
||||
int exist_ok = flags & INIT_DB_EXIST_OK;
|
||||
char *original_git_dir = real_pathdup(git_dir, 1);
|
||||
struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT;
|
||||
|
||||
if (real_git_dir) {
|
||||
struct stat st;
|
||||
@ -378,9 +421,11 @@ int init_db(const char *git_dir, const char *real_git_dir,
|
||||
* config file, so this will not fail. What we are catching
|
||||
* is an attempt to reinitialize new repository with an old tool.
|
||||
*/
|
||||
check_repository_format();
|
||||
check_repository_format(&repo_fmt);
|
||||
|
||||
reinit = create_default_files(template_dir, original_git_dir);
|
||||
validate_hash_algorithm(&repo_fmt, hash);
|
||||
|
||||
reinit = create_default_files(template_dir, original_git_dir, &repo_fmt);
|
||||
|
||||
create_object_directory();
|
||||
|
||||
@ -482,6 +527,8 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
|
||||
const char *work_tree;
|
||||
const char *template_dir = NULL;
|
||||
unsigned int flags = 0;
|
||||
const char *object_format = NULL;
|
||||
int hash_algo = GIT_HASH_UNKNOWN;
|
||||
const struct option init_db_options[] = {
|
||||
OPT_STRING(0, "template", &template_dir, N_("template-directory"),
|
||||
N_("directory from which templates will be used")),
|
||||
@ -494,6 +541,8 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
|
||||
OPT_BIT('q', "quiet", &flags, N_("be quiet"), INIT_DB_QUIET),
|
||||
OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
|
||||
N_("separate git dir from working tree")),
|
||||
OPT_STRING(0, "object-format", &object_format, N_("hash"),
|
||||
N_("specify the hash algorithm to use")),
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
@ -546,6 +595,12 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
|
||||
free(cwd);
|
||||
}
|
||||
|
||||
if (object_format) {
|
||||
hash_algo = hash_algo_by_name(object_format);
|
||||
if (hash_algo == GIT_HASH_UNKNOWN)
|
||||
die(_("unknown hash algorithm '%s'"), object_format);
|
||||
}
|
||||
|
||||
if (init_shared_repository != -1)
|
||||
set_shared_repository(init_shared_repository);
|
||||
|
||||
@ -597,5 +652,5 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
|
||||
UNLEAK(work_tree);
|
||||
|
||||
flags |= INIT_DB_EXIST_OK;
|
||||
return init_db(git_dir, real_git_dir, template_dir, flags);
|
||||
return init_db(git_dir, real_git_dir, template_dir, hash_algo, flags);
|
||||
}
|
||||
|
Reference in New Issue
Block a user