Merge branch 'nd/do-not-move-worktree-manually'
authorJunio C Hamano <gitster@pobox.com>
Wed, 10 Feb 2016 22:20:05 +0000 (14:20 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 10 Feb 2016 22:20:05 +0000 (14:20 -0800)
"git worktree" had a broken code that attempted to auto-fix
possible inconsistency that results from end-users moving a
worktree to different places without telling Git (the original
repository needs to maintain backpointers to its worktrees, but
"mv" run by end-users who are not familiar with that fact will
obviously not adjust them), which actually made things worse
when triggered.

* nd/do-not-move-worktree-manually:
worktree: stop supporting moving worktrees manually
worktree.c: fix indentation

1  2 
setup.c
diff --combined setup.c
index 2c4b22c8456733a3ab2848fff81630589139c671,2e9cc73af05cf625d345684e1e1ee57f001844af..0deb02238ba426144e0b7b077c9f2ad5c7993d23
+++ b/setup.c
@@@ -5,7 -5,6 +5,7 @@@
  static int inside_git_dir = -1;
  static int inside_work_tree = -1;
  static int work_tree_config_is_bogus;
 +static struct string_list unknown_extensions = STRING_LIST_INIT_DUP;
  
  /*
   * The input parameter must contain an absolute path, and it must already be
@@@ -312,23 -311,6 +312,23 @@@ done
        return ret;
  }
  
 +int is_nonbare_repository_dir(struct strbuf *path)
 +{
 +      int ret = 0;
 +      int gitfile_error;
 +      size_t orig_path_len = path->len;
 +      assert(orig_path_len != 0);
 +      strbuf_complete(path, '/');
 +      strbuf_addstr(path, ".git");
 +      if (read_gitfile_gently(path->buf, &gitfile_error) || is_git_directory(path->buf))
 +              ret = 1;
 +      if (gitfile_error == READ_GITFILE_ERR_OPEN_FAILED ||
 +          gitfile_error == READ_GITFILE_ERR_READ_FAILED)
 +              ret = 1;
 +      strbuf_setlen(path, orig_path_len);
 +      return ret;
 +}
 +
  int is_inside_git_dir(void)
  {
        if (inside_git_dir < 0)
@@@ -374,25 -356,10 +374,25 @@@ void setup_work_tree(void
  
  static int check_repo_format(const char *var, const char *value, void *cb)
  {
 +      const char *ext;
 +
        if (strcmp(var, "core.repositoryformatversion") == 0)
                repository_format_version = git_config_int(var, value);
        else if (strcmp(var, "core.sharedrepository") == 0)
                shared_repository = git_config_perm(var, value);
 +      else if (skip_prefix(var, "extensions.", &ext)) {
 +              /*
 +               * record any known extensions here; otherwise,
 +               * we fall through to recording it as unknown, and
 +               * check_repository_format will complain
 +               */
 +              if (!strcmp(ext, "noop"))
 +                      ;
 +              else if (!strcmp(ext, "preciousobjects"))
 +                      repository_format_precious_objects = git_config_bool(var, value);
 +              else
 +                      string_list_append(&unknown_extensions, ext);
 +      }
        return 0;
  }
  
@@@ -403,8 -370,6 +403,8 @@@ static int check_repository_format_gent
        config_fn_t fn;
        int ret = 0;
  
 +      string_list_clear(&unknown_extensions, 0);
 +
        if (get_common_dir(&sb, gitdir))
                fn = check_repo_format;
        else
         * is a good one.
         */
        git_config_early(fn, NULL, repo_config);
 -      if (GIT_REPO_VERSION < repository_format_version) {
 +      if (GIT_REPO_VERSION_READ < repository_format_version) {
                if (!nongit_ok)
                        die ("Expected git repo version <= %d, found %d",
 -                           GIT_REPO_VERSION, repository_format_version);
 +                           GIT_REPO_VERSION_READ, repository_format_version);
                warning("Expected git repo version <= %d, found %d",
 -                      GIT_REPO_VERSION, repository_format_version);
 +                      GIT_REPO_VERSION_READ, repository_format_version);
                warning("Please upgrade Git");
                *nongit_ok = -1;
                ret = -1;
        }
 +
 +      if (repository_format_version >= 1 && unknown_extensions.nr) {
 +              int i;
 +
 +              if (!nongit_ok)
 +                      die("unknown repository extension: %s",
 +                          unknown_extensions.items[0].string);
 +
 +              for (i = 0; i < unknown_extensions.nr; i++)
 +                      warning("unknown repository extension: %s",
 +                              unknown_extensions.items[i].string);
 +              *nongit_ok = -1;
 +              ret = -1;
 +      }
 +
        strbuf_release(&sb);
        return ret;
  }
  
- static void update_linked_gitdir(const char *gitfile, const char *gitdir)
- {
-       struct strbuf path = STRBUF_INIT;
-       struct stat st;
-       strbuf_addf(&path, "%s/gitdir", gitdir);
-       if (stat(path.buf, &st) || st.st_mtime + 24 * 3600 < time(NULL))
-               write_file(path.buf, "%s", gitfile);
-       strbuf_release(&path);
- }
  /*
   * Try to read the location of the git directory from the .git file,
   * return path to git directory if found.
@@@ -531,7 -470,6 +520,6 @@@ const char *read_gitfile_gently(const c
                error_code = READ_GITFILE_ERR_NOT_A_REPO;
                goto cleanup_return;
        }
-       update_linked_gitdir(path, dir);
        path = real_path(dir);
  
  cleanup_return: