IDEA-86065 Don't treat the registered Git root as invalid if it was not auto-detected
authorKirill Likhodedov <Kirill.Likhodedov@jetbrains.com>
Sun, 5 Aug 2012 08:34:51 +0000 (12:34 +0400)
committerKirill Likhodedov <Kirill.Likhodedov@jetbrains.com>
Sun, 5 Aug 2012 08:37:52 +0000 (12:37 +0400)
The GitRootDetector for the sake of performance doesn't detect Git roots deeper than 3 levels under any content root.
But checking if the given mapping is valid doesn't require such detected: just check if Git directory is in the file system in the expected place.
Add a test, update the GitRootErrorsFinder.

plugins/git4idea/src/git4idea/roots/GitRootErrorsFinder.java
plugins/git4idea/tests/git4idea/roots/GitRootDetectorTest.groovy
plugins/git4idea/tests/git4idea/roots/GitRootErrorsFinderTest.groovy

index 3286a33a507ecb00be7b566e298a20357ee7dfd0..fb242370b492a29cc594736fd1c85a9664bfbedf 100644 (file)
@@ -22,9 +22,11 @@ import com.intellij.openapi.vcs.ProjectLevelVcsManager;
 import com.intellij.openapi.vcs.VcsDirectoryMapping;
 import com.intellij.openapi.vcs.VcsRootError;
 import com.intellij.openapi.vfs.VirtualFile;
+import git4idea.GitUtil;
 import git4idea.PlatformFacade;
 import org.jetbrains.annotations.NotNull;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -81,7 +83,7 @@ public class GitRootErrorsFinder {
       }
       else {
         String mappedPath = mapping.systemIndependentPath();
-        if (!gitPaths.contains(mappedPath)) {
+        if (!gitPaths.contains(mappedPath) && !hasGitDir(mappedPath)) {
           errors.add(new VcsRootError(VcsRootError.Type.EXTRA_MAPPING, mappedPath));
         }
       }
@@ -89,6 +91,11 @@ public class GitRootErrorsFinder {
     return errors;
   }
 
+  private static boolean hasGitDir(String path) {
+    File file = new File(path, GitUtil.DOT_GIT);
+    return file.exists();
+  }
+
   @NotNull
   private static Collection<String> rootsToPaths(@NotNull Collection<VirtualFile> gitRoots) {
     Collection<String> gitPaths = new ArrayList<String>(gitRoots.size());
index 9611768ef1e4ddc6b0042ea2e937f8022a8e1905..0ff6c92c4914a06c047bca61ee23019ba5bfa077 100644 (file)
@@ -146,7 +146,7 @@ class GitRootDetectorTest extends AbstractGitRootTest {
   }
 
   @Test
-  // This is a test of performance optimization via limitation: don't scan deep though the whole VFS
+  // This is a test of performance optimization via limitation: don't scan deep though the whole VFS, i.e. don't detect deep roots
   void "don't scan deeper than 2 levels below a content root"() {
     doTest content_roots:  ["content_root"],
            gits:           ["community", "content_root/lev1/lev2", "content_root2/lev1/lev2/lev3"],
index 3fabd2e630edad6a30994007703076026bd3f3ab..8e17731765866cb593697a1c7ef970ccb695f0b3 100644 (file)
@@ -163,6 +163,14 @@ class GitRootErrorsFinderTest extends AbstractGitRootTest {
            errors:        [unreg: ["community", "contrib"]]
   }
 
+  @Test
+  void "Real Git root deeper than 3 levels should be detected"() {
+    doTest content_roots: [".", "community", "contrib"],
+           git:           [".", "community", "contrib", "community/level1/level2/level3"],
+           roots:         [PROJECT, "community/level1/level2/level3"],
+           errors:        [unreg: ["community", "contrib"]]
+  }
+
   private void doTest(Map map) {
     myProject = initProject(map.git, [], map.content_roots)
     myVcsManager = (GitMockVcsManager) myPlatformFacade.getVcsManager(myProject)