Merge branch 'tb/config-core-filemode-check-on-broken-fs'
authorJunio C Hamano <gitster@pobox.com>
Mon, 22 Dec 2014 20:26:33 +0000 (12:26 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 22 Dec 2014 20:26:34 +0000 (12:26 -0800)
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

1  2 
builtin/init-db.c
diff --combined builtin/init-db.c
index aab44d2e451b1b6a2c764a5d62464ae690ab5566,1e0749d5bea7d117dbdfde051bd42faf2e259e96..2619ca5881694b68e24ce13c41347829e4e7d7bb
@@@ -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.
         */
        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)
                        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))
        }
        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);