diff --git a/platform/lang-impl/src/com/intellij/ide/scratch/ScratchProjectViewPane.java b/platform/lang-impl/src/com/intellij/ide/scratch/ScratchProjectViewPane.java index e1098c107e7f..c31d05269762 100644 --- a/platform/lang-impl/src/com/intellij/ide/scratch/ScratchProjectViewPane.java +++ b/platform/lang-impl/src/com/intellij/ide/scratch/ScratchProjectViewPane.java @@ -25,8 +25,10 @@ import com.intellij.ide.projectView.impl.ProjectTreeStructure; import com.intellij.ide.projectView.impl.ProjectViewPane; import com.intellij.ide.projectView.impl.nodes.BasePsiNode; import com.intellij.ide.util.treeView.AbstractTreeNode; +import com.intellij.openapi.fileTypes.FileTypeRegistry; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.NavigatableWithText; import com.intellij.psi.PsiDirectory; @@ -178,13 +180,14 @@ public class ScratchProjectViewPane extends ProjectViewPane { private static class MyPsiNode extends BasePsiNode implements NavigatableWithText { - MyPsiNode(Project project, PsiFileSystemItem value) { + MyPsiNode(@NotNull Project project, @NotNull PsiFileSystemItem value) { super(project, value, ViewSettings.DEFAULT); } @Override public boolean isAlwaysLeaf() { - return !getValue().isDirectory(); + PsiFileSystemItem value = getValue(); + return value != null && !value.isDirectory(); } @Nullable @@ -192,21 +195,26 @@ public class ScratchProjectViewPane extends ProjectViewPane { protected Collection getChildrenImpl() { if (isAlwaysLeaf()) return Collections.emptyList(); final List list = ContainerUtil.newArrayList(); - getValue().processChildren(new PsiElementProcessor() { - @Override - public boolean execute(@NotNull PsiFileSystemItem element) { - list.add(new MyPsiNode(getProject(), element)); - return true; - } - }); + PsiFileSystemItem value = getValue(); + if (value != null) { + value.processChildren(new PsiElementProcessor() { + @Override + public boolean execute(@NotNull PsiFileSystemItem element) { + list.add(new MyPsiNode(getProject(), element)); + return true; + } + }); + } return list; } @Override protected void updateImpl(PresentationData data) { PsiFileSystemItem value = getValue(); - data.setIcon(value.getIcon(0)); - data.setPresentableText(value.getName()); + if (value != null) { + data.setIcon(value.getIcon(0)); + data.setPresentableText(value.getName()); + } } @Nullable @@ -214,5 +222,15 @@ public class ScratchProjectViewPane extends ProjectViewPane { public String getNavigateActionText(boolean focusEditor) { return null; } + + @Override + public boolean contains(@NotNull VirtualFile file) { + PsiFileSystemItem value = getValue(); + if (!(value instanceof PsiDirectory)) return super.contains(file); + PsiDirectory dir = (PsiDirectory)value; + + return VfsUtilCore.isAncestor(dir.getVirtualFile(), file, false) && + !FileTypeRegistry.getInstance().isFileIgnored(file); + } } } diff --git a/plugins/git4idea/src/git4idea/repo/GitRepositoryReader.java b/plugins/git4idea/src/git4idea/repo/GitRepositoryReader.java index 892791fcff5c..ddd741f7d125 100644 --- a/plugins/git4idea/src/git4idea/repo/GitRepositoryReader.java +++ b/plugins/git4idea/src/git4idea/repo/GitRepositoryReader.java @@ -80,11 +80,22 @@ class GitRepositoryReader { @NotNull GitBranchState readState(@NotNull Collection remotes) { Pair, Set> branches = readBranches(remotes); + Set localBranches = branches.first; + HeadInfo headInfo = readHead(); Repository.State state = readRepositoryState(headInfo); - GitLocalBranch currentBranch = findCurrentBranch(headInfo, state, branches.first); - String currentRevision = getCurrentRevision(headInfo, currentBranch); - return new GitBranchState(currentRevision, currentBranch, state, branches.first, branches.second); + + GitLocalBranch currentBranch; + String currentRevision; + if (localBranches.isEmpty() && headInfo.content != null) { + currentBranch = new GitLocalBranch(headInfo.content, GitBranch.DUMMY_HASH); + currentRevision = null; + } + else { + currentBranch = findCurrentBranch(headInfo, state, localBranches); + currentRevision = getCurrentRevision(headInfo, currentBranch); + } + return new GitBranchState(currentRevision, currentBranch, state, localBranches, branches.second); } @Nullable diff --git a/plugins/git4idea/tests/git4idea/repo/GitRepositoryReaderNewTest.java b/plugins/git4idea/tests/git4idea/repo/GitRepositoryReaderNewTest.java index 0ae3fff2356f..1f8846f06133 100644 --- a/plugins/git4idea/tests/git4idea/repo/GitRepositoryReaderNewTest.java +++ b/plugins/git4idea/tests/git4idea/repo/GitRepositoryReaderNewTest.java @@ -18,6 +18,7 @@ package git4idea.repo; import com.intellij.dvcs.repo.Repository; import com.intellij.openapi.util.Condition; import com.intellij.util.containers.ContainerUtil; +import git4idea.GitLocalBranch; import git4idea.GitRemoteBranch; import git4idea.test.GitSingleRepoTest; import org.jetbrains.annotations.NotNull; @@ -39,7 +40,8 @@ import static git4idea.test.GitTestUtil.makeCommit; public class GitRepositoryReaderNewTest extends GitSingleRepoTest { // inspired by IDEA-93806 - public void test_rebase_with_conflicts_while_being_on_detached_HEAD() { + public void test_rebase_with_conflicts_while_being_on_detached_HEAD() throws IOException { + makeCommit("file.txt"); conflict(myRepo, "feature"); commit(myRepo); commit(myRepo); @@ -52,7 +54,8 @@ public class GitRepositoryReaderNewTest extends GitSingleRepoTest { } // inspired by IDEA-124052 - public void test_remote_reference_without_remote() { + public void test_remote_reference_without_remote() throws IOException { + makeCommit("file.txt"); final String INVALID_REMOTE = "invalid-remote"; final String INVALID_REMOTE_BRANCH = "master"; git("update-ref refs/remotes/" + INVALID_REMOTE + "/" + INVALID_REMOTE_BRANCH + " HEAD"); @@ -68,6 +71,7 @@ public class GitRepositoryReaderNewTest extends GitSingleRepoTest { // inspired by IDEA-134286 public void test_detached_HEAD() throws IOException { + makeCommit("file.txt"); makeCommit("file.txt"); git("checkout HEAD^"); GitBranchState state = readState(); @@ -84,4 +88,15 @@ public class GitRepositoryReaderNewTest extends GitSingleRepoTest { return reader.readState(remotes); } + // inspired by IDEA-134412 + public void test_fresh_repository_is_on_branch() { + GitLocalBranch currentBranch = readState().getCurrentBranch(); + assertNotNull("Current branch shouldn't be null in a fresh repository", currentBranch); + assertEquals("Fresh repository should be on master", "master", currentBranch.getName()); + } + + @Override + protected boolean makeInitialCommit() { + return false; + } }