X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=builtin-init-db.c;h=12e43d0db4df0c40fe6375b38691684efcddad18;hb=d3e41ebff44745055001e59e460509a8f04b81a2;hp=1d7d15e8d53a7a2817ceff6f5c5e056747688c9e;hpb=54851157acf707eb953eada2a84830897dde5c1d;p=git.git diff --git a/builtin-init-db.c b/builtin-init-db.c index 1d7d15e8d..12e43d0db 100644 --- a/builtin-init-db.c +++ b/builtin-init-db.c @@ -10,6 +10,12 @@ #define DEFAULT_GIT_TEMPLATE_DIR "/usr/share/git-core/templates/" #endif +#ifdef NO_TRUSTABLE_FILEMODE +#define TEST_FILEMODE 0 +#else +#define TEST_FILEMODE 1 +#endif + static void safe_create_dir(const char *dir, int share) { if (mkdir(dir, 0777) < 0) { @@ -50,7 +56,7 @@ static void copy_templates_1(char *path, int baselen, /* Note: if ".git/hooks" file exists in the repository being * re-initialized, /etc/core-git/templates/hooks/update would - * cause git-init-db to fail here. I think this is sane but + * cause git-init to fail here. I think this is sane but * it means that the set of templates we ship by default, along * with the way the namespace under .git/ is organized, should * be really carefully chosen. @@ -124,8 +130,11 @@ static void copy_templates(const char *git_dir, int len, const char *template_di int template_len; DIR *dir; - if (!template_dir) - template_dir = DEFAULT_GIT_TEMPLATE_DIR; + if (!template_dir) { + template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT); + if (!template_dir) + template_dir = DEFAULT_GIT_TEMPLATE_DIR; + } strcpy(template_path, template_dir); template_len = strlen(template_path); if (template_path[template_len-1] != '/') { @@ -172,6 +181,7 @@ static int create_default_files(const char *git_dir, const char *template_path) struct stat st1; char repo_version_string[10]; int reinit; + int filemode; if (len > sizeof(path)-50) die("insane git directory %s", git_dir); @@ -221,7 +231,7 @@ static int create_default_files(const char *git_dir, const char *template_path) strcpy(path + len, "HEAD"); reinit = !read_ref("HEAD", sha1); if (!reinit) { - if (create_symref("HEAD", "refs/heads/master") < 0) + if (create_symref("HEAD", "refs/heads/master", NULL) < 0) exit(1); } @@ -233,23 +243,29 @@ static int create_default_files(const char *git_dir, const char *template_path) strcpy(path + len, "config"); /* Check filemode trustability */ - if (!lstat(path, &st1)) { + filemode = TEST_FILEMODE; + if (TEST_FILEMODE && !lstat(path, &st1)) { struct stat st2; - int filemode = (!chmod(path, st1.st_mode ^ S_IXUSR) && + filemode = (!chmod(path, st1.st_mode ^ S_IXUSR) && !lstat(path, &st2) && st1.st_mode != st2.st_mode); - git_config_set("core.filemode", - filemode ? "true" : "false"); } + git_config_set("core.filemode", filemode ? "true" : "false"); - /* Enable logAllRefUpdates if a working tree is attached */ - if (!is_bare_git_dir(git_dir)) - git_config_set("core.logallrefupdates", "true"); + if (is_bare_repository()) { + git_config_set("core.bare", "true"); + } + else { + git_config_set("core.bare", "false"); + /* allow template config file to override the default */ + if (log_all_ref_updates == -1) + git_config_set("core.logallrefupdates", "true"); + } return reinit; } static const char init_db_usage[] = -"git-init-db [--template=] [--shared]"; +"git-init [--template=] [--shared]"; /* * If you want to, you can share the DB area with any number of branches.