]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/init-db.c
Merge branch 'en/ort-perf-batch-9'
[thirdparty/git.git] / builtin / init-db.c
index dcc45bef5148117c4b0c3180fcbd94d9f099a1cc..c19b35f1e6919e53c85b05a4f5a85f5cec5cbe15 100644 (file)
@@ -25,7 +25,6 @@
 
 static int init_is_bare_repository = 0;
 static int init_shared_repository = -1;
-static const char *init_db_template_dir;
 
 static void copy_templates_1(struct strbuf *path, struct strbuf *template_path,
                             DIR *dir)
@@ -94,7 +93,7 @@ static void copy_templates_1(struct strbuf *path, struct strbuf *template_path,
        }
 }
 
-static void copy_templates(const char *template_dir)
+static void copy_templates(const char *template_dir, const char *init_template_dir)
 {
        struct strbuf path = STRBUF_INIT;
        struct strbuf template_path = STRBUF_INIT;
@@ -107,7 +106,7 @@ static void copy_templates(const char *template_dir)
        if (!template_dir)
                template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT);
        if (!template_dir)
-               template_dir = init_db_template_dir;
+               template_dir = init_template_dir;
        if (!template_dir)
                template_dir = to_free = system_path(DEFAULT_GIT_TEMPLATE_DIR);
        if (!template_dir[0]) {
@@ -154,17 +153,6 @@ free_return:
        clear_repository_format(&template_format);
 }
 
-static int git_init_db_config(const char *k, const char *v, void *cb)
-{
-       if (!strcmp(k, "init.templatedir"))
-               return git_config_pathname(&init_db_template_dir, k, v);
-
-       if (starts_with(k, "core."))
-               return platform_core_config(k, v, cb);
-
-       return 0;
-}
-
 /*
  * If the git_dir is not directly inside the working tree, then git will not
  * find it by default, and we need to set the worktree explicitly.
@@ -212,10 +200,8 @@ static int create_default_files(const char *template_path,
        int reinit;
        int filemode;
        struct strbuf err = STRBUF_INIT;
-
-       /* Just look for `init.templatedir` */
-       init_db_template_dir = NULL; /* re-set in case it was set before */
-       git_config(git_init_db_config, NULL);
+       const char *init_template_dir = NULL;
+       const char *work_tree = get_git_work_tree();
 
        /*
         * First copy the templates -- we might have the default
@@ -226,7 +212,8 @@ static int create_default_files(const char *template_path,
         * values (since we've just potentially changed what's available on
         * disk).
         */
-       copy_templates(template_path);
+       git_config_get_value("init.templatedir", &init_template_dir);
+       copy_templates(template_path, init_template_dir);
        git_config_clear();
        reset_shared_repository();
        git_config(git_default_config, NULL);
@@ -235,7 +222,7 @@ static int create_default_files(const char *template_path,
         * We must make sure command-line options continue to override any
         * values we might have just re-read from the config.
         */
-       is_bare_repository_cfg = init_is_bare_repository;
+       is_bare_repository_cfg = init_is_bare_repository || !work_tree;
        if (init_shared_repository != -1)
                set_shared_repository(init_shared_repository);
 
@@ -299,7 +286,6 @@ static int create_default_files(const char *template_path,
        if (is_bare_repository())
                git_config_set("core.bare", "true");
        else {
-               const char *work_tree = get_git_work_tree();
                git_config_set("core.bare", "false");
                /* allow template config file to override the default */
                if (log_all_ref_updates == LOG_REFS_UNSET)
@@ -422,8 +408,8 @@ int init_db(const char *git_dir, const char *real_git_dir,
        }
        startup_info->have_repository = 1;
 
-       /* Just look for `core.hidedotfiles` */
-       git_config(git_init_db_config, NULL);
+       /* Ensure `core.hidedotfiles` is processed */
+       git_config(platform_core_config, NULL);
 
        safe_create_dir(git_dir, 0);
 
@@ -575,8 +561,10 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
        if (real_git_dir && !is_absolute_path(real_git_dir))
                real_git_dir = real_pathdup(real_git_dir, 1);
 
-       if (template_dir && *template_dir && !is_absolute_path(template_dir))
+       if (template_dir && *template_dir && !is_absolute_path(template_dir)) {
                template_dir = absolute_pathdup(template_dir);
+               UNLEAK(template_dir);
+       }
 
        if (argc == 1) {
                int mkdir_tried = 0;