Deploy GIT_REPOSITORY_INIT_OPTIONS_INIT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
diff --git a/src/repository.c b/src/repository.c
index b49b49b..073efa4 100644
--- a/src/repository.c
+++ b/src/repository.c
@@ -1151,9 +1151,8 @@ static int repo_init_create_origin(git_repository *repo, const char *url)
int git_repository_init(
git_repository **repo_out, const char *path, unsigned is_bare)
{
- git_repository_init_options opts;
+ git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
- memset(&opts, 0, sizeof(opts));
opts.flags = GIT_REPOSITORY_INIT_MKPATH; /* don't love this default */
if (is_bare)
opts.flags |= GIT_REPOSITORY_INIT_BARE;
@@ -1161,6 +1160,18 @@ int git_repository_init(
return git_repository_init_ext(repo_out, path, &opts);
}
+static bool options_have_valid_version(git_repository_init_options *opts)
+{
+ if (!opts)
+ return true;
+
+ if (opts->version > 0 && opts->version <= GIT_REMOTE_CALLBACKS_VERSION)
+ return true;
+
+ giterr_set(GITERR_INVALID, "Invalid version %d for git_repository_init_options", opts->version);
+ return false;
+}
+
int git_repository_init_ext(
git_repository **out,
const char *given_repo,
@@ -1171,6 +1182,9 @@ int git_repository_init_ext(
assert(out && given_repo && opts);
+ if (!options_have_valid_version(opts))
+ return -1;
+
error = repo_init_directories(&repo_path, &wd_path, given_repo, opts);
if (error < 0)
goto cleanup;
diff --git a/src/submodule.c b/src/submodule.c
index 7ac666c..21a1875 100644
--- a/src/submodule.c
+++ b/src/submodule.c
@@ -205,7 +205,7 @@ int git_submodule_add_setup(
git_config_backend *mods = NULL;
git_submodule *sm;
git_buf name = GIT_BUF_INIT, real_url = GIT_BUF_INIT;
- git_repository_init_options initopt;
+ git_repository_init_options initopt = GIT_REPOSITORY_INIT_OPTIONS_INIT;
git_repository *subrepo = NULL;
assert(repo && url && path);
@@ -275,7 +275,6 @@ int git_submodule_add_setup(
* Old style: sub-repo goes directly into repo/<name>/.git/
*/
- memset(&initopt, 0, sizeof(initopt));
initopt.flags = GIT_REPOSITORY_INIT_MKPATH |
GIT_REPOSITORY_INIT_NO_REINIT;
initopt.origin_url = real_url.ptr;
diff --git a/tests-clar/repo/init.c b/tests-clar/repo/init.c
index 3b14c97..c0acbed 100644
--- a/tests-clar/repo/init.c
+++ b/tests-clar/repo/init.c
@@ -304,8 +304,7 @@ void test_repo_init__sets_logAllRefUpdates_according_to_type_of_repository(void)
void test_repo_init__extended_0(void)
{
- git_repository_init_options opts;
- memset(&opts, 0, sizeof(opts));
+ git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
/* without MKDIR this should fail */
cl_git_fail(git_repository_init_ext(&_repo, "extended", &opts));
@@ -327,8 +326,7 @@ void test_repo_init__extended_1(void)
git_reference *ref;
git_remote *remote;
struct stat st;
- git_repository_init_options opts;
- memset(&opts, 0, sizeof(opts));
+ git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
opts.flags = GIT_REPOSITORY_INIT_MKPATH |
GIT_REPOSITORY_INIT_NO_DOTGIT_DIR;
@@ -367,8 +365,7 @@ void test_repo_init__extended_1(void)
void test_repo_init__extended_with_template(void)
{
- git_repository_init_options opts;
- memset(&opts, 0, sizeof(opts));
+ git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_BARE;
opts.template_path = cl_fixture("template");