IDEA-130628 Optimized svn working copies detection logic - only run "svn info" comman...
authorKonstantin Kolosovsky <konstantin.kolosovsky@jetbrains.com>
Mon, 13 Oct 2014 18:28:38 +0000 (22:28 +0400)
committerKonstantin Kolosovsky <konstantin.kolosovsky@jetbrains.com>
Mon, 13 Oct 2014 18:28:38 +0000 (22:28 +0400)
plugins/svn4idea/src/org/jetbrains/idea/svn/ForNestedRootChecker.java

index c92e1210ce985b3ab1d47a950728c7fa59ac8a04..51f59d1f7442d4a8d2d1d5ff4470010c6f46ac72 100644 (file)
@@ -52,11 +52,11 @@ public class ForNestedRootChecker {
       VirtualFile item = workItems.removeFirst();
       checkCancelled();
 
-      final Node vcsElement = new VcsFileResolver(myVcs, item).resolve();
+      final Node vcsElement = new VcsFileResolver(myVcs, item, root).resolve();
       if (vcsElement != null) {
         result.add(vcsElement);
       }
-      else if (!SvnUtil.isAdminDirectory(item)) {
+      else {
         for (VirtualFile child : item.getChildren()) {
           checkCancelled();
 
@@ -80,13 +80,15 @@ public class ForNestedRootChecker {
     @NotNull private final SvnVcs myVcs;
     @NotNull private final VirtualFile myFile;
     @NotNull private final File myIoFile;
+    @NotNull private final VirtualFile myRoot;
     @Nullable private Info myInfo;
     @Nullable private SvnBindException myError;
 
-    private VcsFileResolver(@NotNull SvnVcs vcs, @NotNull VirtualFile file) {
+    private VcsFileResolver(@NotNull SvnVcs vcs, @NotNull VirtualFile file, @NotNull VirtualFile root) {
       myVcs = vcs;
       myFile = file;
       myIoFile = VfsUtilCore.virtualToIoFile(file);
+      myRoot = root;
     }
 
     @Nullable
@@ -97,14 +99,25 @@ public class ForNestedRootChecker {
     }
 
     private void runInfo() {
-      try {
-        myInfo = myVcs.getFactory(myIoFile, false).createInfoClient().doInfo(myIoFile, SVNRevision.UNDEFINED);
-      }
-      catch (SvnBindException e) {
-        myError = e;
+      if (isRoot() || hasChildAdminDirectory()) {
+        try {
+          myInfo = myVcs.getFactory(myIoFile, false).createInfoClient().doInfo(myIoFile, SVNRevision.UNDEFINED);
+        }
+        catch (SvnBindException e) {
+          myError = e;
+        }
       }
     }
 
+    @SuppressWarnings("UseVirtualFileEquals")
+    private boolean isRoot() {
+      return myRoot == myFile;
+    }
+
+    private boolean hasChildAdminDirectory() {
+      return myFile.findChild(SvnUtil.SVN_ADMIN_DIR_NAME) != null;
+    }
+
     @Nullable
     private Node processInfo() {
       Node result = null;