init: refactor the template directory discovery into its own function

We will need to call this function from `hook.c` to be able to prevent
hooks from running that were written as part of a `clone` but did not
originate from the template directory.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
seen
Johannes Schindelin 2024-03-29 11:45:01 +01:00
parent 48c171d927
commit df93e407f0
3 changed files with 37 additions and 18 deletions

View File

@ -11,10 +11,6 @@
#include "parse-options.h" #include "parse-options.h"
#include "worktree.h" #include "worktree.h"


#ifndef DEFAULT_GIT_TEMPLATE_DIR
#define DEFAULT_GIT_TEMPLATE_DIR "/usr/share/git-core/templates"
#endif

#ifdef NO_TRUSTABLE_FILEMODE #ifdef NO_TRUSTABLE_FILEMODE
#define TEST_FILEMODE 0 #define TEST_FILEMODE 0
#else #else
@ -93,8 +89,9 @@ static void copy_templates_1(struct strbuf *path, struct strbuf *template_path,
} }
} }


static void copy_templates(const char *template_dir, const char *init_template_dir) static void copy_templates(const char *option_template)
{ {
const char *template_dir = get_template_dir(option_template);
struct strbuf path = STRBUF_INIT; struct strbuf path = STRBUF_INIT;
struct strbuf template_path = STRBUF_INIT; struct strbuf template_path = STRBUF_INIT;
size_t template_len; size_t template_len;
@ -103,16 +100,8 @@ static void copy_templates(const char *template_dir, const char *init_template_d
DIR *dir; DIR *dir;
char *to_free = NULL; char *to_free = NULL;


if (!template_dir) if (!template_dir || !*template_dir)
template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT);
if (!template_dir)
template_dir = init_template_dir;
if (!template_dir)
template_dir = to_free = system_path(DEFAULT_GIT_TEMPLATE_DIR);
if (!template_dir[0]) {
free(to_free);
return; return;
}


strbuf_addstr(&template_path, template_dir); strbuf_addstr(&template_path, template_dir);
strbuf_complete(&template_path, '/'); strbuf_complete(&template_path, '/');
@ -200,7 +189,6 @@ static int create_default_files(const char *template_path,
int reinit; int reinit;
int filemode; int filemode;
struct strbuf err = STRBUF_INIT; struct strbuf err = STRBUF_INIT;
const char *init_template_dir = NULL;
const char *work_tree = get_git_work_tree(); const char *work_tree = get_git_work_tree();


/* /*
@ -212,9 +200,7 @@ static int create_default_files(const char *template_path,
* values (since we've just potentially changed what's available on * values (since we've just potentially changed what's available on
* disk). * disk).
*/ */
git_config_get_pathname("init.templatedir", &init_template_dir); copy_templates(template_path);
copy_templates(template_path, init_template_dir);
free((char *)init_template_dir);
git_config_clear(); git_config_clear();
reset_shared_repository(); reset_shared_repository();
git_config(git_default_config, NULL); git_config(git_default_config, NULL);

View File

@ -656,6 +656,7 @@ int path_inside_repo(const char *prefix, const char *path);
#define INIT_DB_QUIET 0x0001 #define INIT_DB_QUIET 0x0001
#define INIT_DB_EXIST_OK 0x0002 #define INIT_DB_EXIST_OK 0x0002


const char *get_template_dir(const char *option_template);
int init_db(const char *git_dir, const char *real_git_dir, int init_db(const char *git_dir, const char *real_git_dir,
const char *template_dir, int hash_algo, const char *template_dir, int hash_algo,
const char *initial_branch, unsigned int flags); const char *initial_branch, unsigned int flags);

32
setup.c
View File

@ -6,6 +6,7 @@
#include "chdir-notify.h" #include "chdir-notify.h"
#include "promisor-remote.h" #include "promisor-remote.h"
#include "quote.h" #include "quote.h"
#include "exec-cmd.h"


static int inside_git_dir = -1; static int inside_git_dir = -1;
static int inside_work_tree = -1; static int inside_work_tree = -1;
@ -1720,3 +1721,34 @@ int daemonize(void)
return 0; return 0;
#endif #endif
} }

#ifndef DEFAULT_GIT_TEMPLATE_DIR
#define DEFAULT_GIT_TEMPLATE_DIR "/usr/share/git-core/templates"
#endif

const char *get_template_dir(const char *option_template)
{
const char *template_dir = option_template;

if (!template_dir)
template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT);
if (!template_dir) {
static const char *init_template_dir;
static int initialized;

if (!initialized) {
git_config_get_pathname("init.templatedir",
&init_template_dir);
initialized = 1;
}
template_dir = init_template_dir;
}
if (!template_dir) {
static char *dir;

if (!dir)
dir = system_path(DEFAULT_GIT_TEMPLATE_DIR);
template_dir = dir;
}
return template_dir;
}