Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2019-05-08 18:37:28 +0300
committerJunio C Hamano <gitster@pobox.com>2019-05-08 18:37:28 +0300
commitec2642a2a127c192c2af239793a0f63f59845658 (patch)
tree4455168d0eeccfe16bd7e5de4f4d2c1c3dc7a22f
parent5b5def9a99030ecf2b62163ea7856f91cd8f292c (diff)
parentf3534c98e44c9f811742c7ea288e75d4baa3c27d (diff)
Merge branch 'jt/submodule-repo-is-with-worktree'
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
-rwxr-xr-xt/t3200-branch.sh24
-rw-r--r--worktree.c14
2 files changed, 34 insertions, 4 deletions
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index 478b82cf9b..e9ad50b66d 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -264,6 +264,30 @@ test_expect_success 'git branch --list -d t should fail' '
test_must_fail git rev-parse refs/heads/t
'
+test_expect_success 'deleting checked-out branch from repo that is a submodule' '
+ test_when_finished "rm -rf repo1 repo2" &&
+
+ git init repo1 &&
+ git init repo1/sub &&
+ test_commit -C repo1/sub x &&
+ git -C repo1 submodule add ./sub &&
+ git -C repo1 commit -m "adding sub" &&
+
+ git clone --recurse-submodules repo1 repo2 &&
+ git -C repo2/sub checkout -b work &&
+ test_must_fail git -C repo2/sub branch -D work
+'
+
+test_expect_success 'bare main worktree has HEAD at branch deleted by secondary worktree' '
+ test_when_finished "rm -rf nonbare base secondary" &&
+
+ git init nonbare &&
+ test_commit -C nonbare x &&
+ git clone --bare nonbare bare &&
+ git -C bare worktree add --detach ../secondary master &&
+ git -C secondary branch -D master
+'
+
test_expect_success 'git branch --list -v with --abbrev' '
test_when_finished "git branch -D t" &&
git branch t &&
diff --git a/worktree.c b/worktree.c
index b45bfeb9d3..4f66cd9ce1 100644
--- a/worktree.c
+++ b/worktree.c
@@ -49,18 +49,24 @@ static struct worktree *get_main_worktree(void)
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);