X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=init-db.c;h=2a4aa3c1965f0e2323a1ec3a4f66c0c1206c7d31;hb=e24317b4d093e4b148996172d0b749f09a0e6f2e;hp=1fb3f7fa79136f296ece9e04f6fdbf34bb40eeeb;hpb=6b7242aa1acc3c7835f80522914ffc4b2e789a29;p=git.git diff --git a/init-db.c b/init-db.c index 1fb3f7fa..2a4aa3c1 100644 --- a/init-db.c +++ b/init-db.c @@ -154,6 +154,7 @@ static void copy_templates(const char *git_dir, int len, char *template_dir) } memcpy(path, git_dir, len); + path[len] = 0; copy_templates_1(path, len, template_path, template_len, dir); @@ -165,6 +166,7 @@ static void create_default_files(const char *git_dir, { unsigned len = strlen(git_dir); static char path[PATH_MAX]; + unsigned char sha1[20]; if (len > sizeof(path)-50) die("insane git directory %s", git_dir); @@ -185,16 +187,52 @@ static void create_default_files(const char *git_dir, /* * Create the default symlink from ".git/HEAD" to the "master" - * branch + * branch, if it does not exist yet. */ strcpy(path + len, "HEAD"); - if (symlink("refs/heads/master", path) < 0) { - if (errno != EEXIST) { - perror(path); + if (read_ref(path, sha1) < 0) { + if (create_symref(path, "refs/heads/master") < 0) exit(1); - } } + path[len] = 0; copy_templates(path, len, template_path); + + /* + * Find out if we can trust the executable bit. + */ + safe_create_dir(path); + strcpy(path + len, "config"); + if (access(path, R_OK) < 0) { + static const char contents[] = + "#\n" + "# This is the config file\n" + "#\n" + "\n" + "; core variables\n" + "[core]\n" + " ; Don't trust file modes\n" + " filemode = false\n" + "\n"; + FILE *config = fopen(path, "w"); + struct stat st; + + if (!config) + die("Can not write to %s?", path); + + fwrite(contents, sizeof(contents)-1, 1, config); + + fclose(config); + + if (!lstat(path, &st)) { + struct stat st2; + if (!chmod(path, st.st_mode ^ S_IXUSR) && + !lstat(path, &st2) && + st.st_mode != st2.st_mode) + unlink(path); + else + fprintf(stderr, "Ignoring file modes\n"); + } + } } static const char init_db_usage[] = @@ -226,7 +264,7 @@ int main(int argc, char **argv) /* * Set up the default .git directory contents */ - git_dir = gitenv(GIT_DIR_ENVIRONMENT); + git_dir = getenv(GIT_DIR_ENVIRONMENT); if (!git_dir) { git_dir = DEFAULT_GIT_DIR_ENVIRONMENT; fprintf(stderr, "defaulting to local storage area\n"); @@ -249,5 +287,7 @@ int main(int argc, char **argv) } strcpy(path+len, "/pack"); safe_create_dir(path); + strcpy(path+len, "/info"); + safe_create_dir(path); return 0; }