Merge branch 'jt/submodule-repo-is-with-worktree'
authorJunio C Hamano <gitster@pobox.com>
Wed, 8 May 2019 15:37:28 +0000 (00:37 +0900)
committerJunio C Hamano <gitster@pobox.com>
Wed, 8 May 2019 15:37:28 +0000 (00:37 +0900)
The logic to tell if a Git repository has a working tree protects
"git branch -D" from removing the branch that is currently checked
out by mistake. The implementation of this logic was broken for
repositories with unusual name, which unfortunately is the norm for
submodules these days. This has been fixed.

* jt/submodule-repo-is-with-worktree:
worktree: update is_bare heuristics

1  2 
worktree.c
diff --combined worktree.c
index b45bfeb9d33b4ae4f372a15edd90651bf3735f92,125eeb2d7c27b576f01614c87fe1cdc123cb151b..4f66cd9ce178d855245712b42d681ff8bcda0636
@@@ -49,18 -49,24 +49,24 @@@ static struct worktree *get_main_worktr
        struct worktree *worktree = NULL;
        struct strbuf path = STRBUF_INIT;
        struct strbuf worktree_path = STRBUF_INIT;
-       int is_bare = 0;
  
        strbuf_add_absolute_path(&worktree_path, get_git_common_dir());
-       is_bare = !strbuf_strip_suffix(&worktree_path, "/.git");
-       if (is_bare)
+       if (!strbuf_strip_suffix(&worktree_path, "/.git"))
                strbuf_strip_suffix(&worktree_path, "/.");
  
        strbuf_addf(&path, "%s/HEAD", get_git_common_dir());
  
        worktree = xcalloc(1, sizeof(*worktree));
        worktree->path = strbuf_detach(&worktree_path, NULL);
-       worktree->is_bare = is_bare;
+       /*
+        * NEEDSWORK: If this function is called from a secondary worktree and
+        * config.worktree is present, is_bare_repository_cfg will reflect the
+        * contents of config.worktree, not the contents of the main worktree.
+        * This means that worktree->is_bare may be set to 0 even if the main
+        * worktree is configured to be bare.
+        */
+       worktree->is_bare = (is_bare_repository_cfg == 1) ||
+               is_bare_repository();
        add_head_info(worktree);
  
        strbuf_release(&path);
@@@ -444,7 -450,7 +450,7 @@@ int submodule_uses_worktrees(const cha
        DIR *dir;
        struct dirent *d;
        int ret = 0;
 -      struct repository_format format;
 +      struct repository_format format = REPOSITORY_FORMAT_INIT;
  
        submodule_gitdir = git_pathdup_submodule(path, "%s", "");
        if (!submodule_gitdir)
        read_repository_format(&format, sb.buf);
        if (format.version != 0) {
                strbuf_release(&sb);
 +              clear_repository_format(&format);
                return 1;
        }
 +      clear_repository_format(&format);
  
        /* Replace config by worktrees. */
        strbuf_setlen(&sb, sb.len - strlen("config"));