From: Junio C Hamano Date: Mon, 22 Dec 2014 20:26:33 +0000 (-0800) Subject: Merge branch 'tb/config-core-filemode-check-on-broken-fs' X-Git-Tag: v2.3.0-rc0~75 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/168ab99d4c0a3587cee18ef8300f78d4c4344a66?hp=-c Merge branch 'tb/config-core-filemode-check-on-broken-fs' Some filesystems assign filemodes in a strange way, fooling then automatic "filemode trustability" check done during a new repository creation. * tb/config-core-filemode-check-on-broken-fs: init-db: improve the filemode trustability check --- 168ab99d4c0a3587cee18ef8300f78d4c4344a66 diff --combined builtin/init-db.c index aab44d2e45,1e0749d5be..2619ca5881 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@@ -256,6 -256,8 +256,8 @@@ static int create_default_files(const c !lstat(path, &st2) && st1.st_mode != st2.st_mode && !chmod(path, st1.st_mode)); + if (filemode && !reinit && (st1.st_mode & S_IXUSR)) + filemode = 0; } git_config_set("core.filemode", filemode ? "true" : "false"); @@@ -331,12 -333,12 +333,12 @@@ int set_git_dir_init(const char *git_di * moving the target repo later on in separate_git_dir() */ git_link = xstrdup(real_path(git_dir)); + set_git_dir(real_path(real_git_dir)); } else { - real_git_dir = real_path(git_dir); + set_git_dir(real_path(git_dir)); git_link = NULL; } - set_git_dir(real_path(real_git_dir)); return 0; } @@@ -427,9 -429,8 +429,9 @@@ int init_db(const char *template_dir, u static int guess_repository_type(const char *git_dir) { - char cwd[PATH_MAX]; const char *slash; + char *cwd; + int cwd_is_git_dir; /* * "GIT_DIR=. git init" is always bare. @@@ -437,10 -438,9 +439,10 @@@ */ if (!strcmp(".", git_dir)) return 1; - if (!getcwd(cwd, sizeof(cwd))) - die_errno(_("cannot tell cwd")); - if (!strcmp(git_dir, cwd)) + cwd = xgetcwd(); + cwd_is_git_dir = !strcmp(git_dir, cwd); + free(cwd); + if (cwd_is_git_dir) return 1; /* * "GIT_DIR=.git or GIT_DIR=something/.git is usually not. @@@ -538,9 -538,10 +540,9 @@@ int cmd_init_db(int argc, const char ** usage(init_db_usage[0]); } if (is_bare_repository_cfg == 1) { - static char git_dir[PATH_MAX+1]; - - setenv(GIT_DIR_ENVIRONMENT, - getcwd(git_dir, sizeof(git_dir)), argc > 0); + char *cwd = xgetcwd(); + setenv(GIT_DIR_ENVIRONMENT, cwd, argc > 0); + free(cwd); } if (init_shared_repository != -1) @@@ -574,10 -575,13 +576,10 @@@ git_work_tree_cfg = xstrdup(real_path(rel)); free(rel); } - if (!git_work_tree_cfg) { - git_work_tree_cfg = xcalloc(PATH_MAX, 1); - if (!getcwd(git_work_tree_cfg, PATH_MAX)) - die_errno (_("Cannot access current working directory")); - } + if (!git_work_tree_cfg) + git_work_tree_cfg = xgetcwd(); if (work_tree) - set_git_work_tree(real_path(work_tree)); + set_git_work_tree(work_tree); else set_git_work_tree(git_work_tree_cfg); if (access(get_git_work_tree(), X_OK)) @@@ -586,7 -590,7 +588,7 @@@ } else { if (work_tree) - set_git_work_tree(real_path(work_tree)); + set_git_work_tree(work_tree); } set_git_dir_init(git_dir, real_git_dir, 1);