Merge branch 'master' of git.labs.intellij.net:idea/community
authorirengrig <Irina.Chernushina@jetbrains.com>
Tue, 1 Dec 2009 14:02:19 +0000 (17:02 +0300)
committerirengrig <Irina.Chernushina@jetbrains.com>
Tue, 1 Dec 2009 14:02:19 +0000 (17:02 +0300)
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java
platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java
platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsInitObject.java [new file with mode: 0644]
platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsInitialization.java [new file with mode: 0644]
platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/NewMappings.java
plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java
plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnTestCase.java

index 8cffe3fcb4f28a8effb1db62705975292f1cb521..28466f03467d6ff3f26294f7e1ffc249bb246fb9 100644 (file)
@@ -38,6 +38,8 @@ import com.intellij.openapi.vcs.changes.conflicts.ChangelistConflictTracker;
 import com.intellij.openapi.vcs.changes.ui.CommitHelper;
 import com.intellij.openapi.vcs.checkin.CheckinEnvironment;
 import com.intellij.openapi.vcs.checkin.CheckinHandler;
+import com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl;
+import com.intellij.openapi.vcs.impl.VcsInitObject;
 import com.intellij.openapi.vcs.readOnlyHandler.ReadonlyStatusHandlerImpl;
 import com.intellij.openapi.vfs.VfsUtil;
 import com.intellij.openapi.vfs.VirtualFile;
@@ -132,7 +134,8 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec
       ProjectLevelVcsManager.getInstance(myProject).addVcsListener(myVcsListener);
     }
     else {
-      StartupManager.getInstance(myProject).registerPostStartupActivity(new DumbAwareRunnable() {
+      ((ProjectLevelVcsManagerImpl) ProjectLevelVcsManager.getInstance(myProject)).addInitializationRequest(
+        VcsInitObject.CHANGE_LIST_MANAGER, new DumbAwareRunnable() {
         public void run() {
           myWorker.initialized();
           myUpdater.initialized();
index 8cfab7e3ba83a152456b49c0c048daf1b83c80b8..6215b6a9d489b9d3c58ec6f100d70d3ad85c52a2 100644 (file)
@@ -80,6 +80,8 @@ public class ProjectLevelVcsManagerImpl extends ProjectLevelVcsManagerEx impleme
   private ContentManager myContentManager;
   private EditorAdapter myEditorAdapter;
 
+  private final VcsInitialization myInitialization;
+
   @NonNls private static final String ELEMENT_MAPPING = "mapping";
   @NonNls private static final String ATTRIBUTE_DIRECTORY = "directory";
   @NonNls private static final String ATTRIBUTE_VCS = "vcs";
@@ -107,9 +109,10 @@ public class ProjectLevelVcsManagerImpl extends ProjectLevelVcsManagerEx impleme
 
     myDefaultVcsRootPolicy = DefaultVcsRootPolicy.getInstance(project);
 
-    myMappings = new NewMappings(myProject, myEventDispatcher);
-    myMappingsToRoots = new MappingsToRoots(myMappings, myProject);
     myBackgroundableActionHandlerMap = new HashMap<VcsBackgroundableActions, BackgroundableActionEnabledHandler>();
+    myInitialization = new VcsInitialization(myProject);
+    myMappings = new NewMappings(myProject, myEventDispatcher, this);
+    myMappingsToRoots = new MappingsToRoots(myMappings, myProject);
   }
 
   public void initComponent() {
@@ -560,15 +563,7 @@ public class ProjectLevelVcsManagerImpl extends ProjectLevelVcsManagerEx impleme
     if (haveNonEmptyMappings || !defaultProject) {
       myMappingsLoaded = true;
     }
-    StartupManager.getInstance(myProject).runWhenProjectIsInitialized(new Runnable() {
-      public void run() {
-        DumbService.getInstance(myProject).runWhenSmart(new Runnable() {
-          public void run() {
-            myMappings.setDirectoryMappings(mappingsList);
-          }
-        });
-      }
-    });
+    myMappings.setDirectoryMappings(mappingsList);
   }
 
   public void writeDirectoryMappings(final Element element) {
@@ -633,4 +628,12 @@ public class ProjectLevelVcsManagerImpl extends ProjectLevelVcsManagerEx impleme
     }
     return result;
   }
+
+  public void addInitializationRequest(final VcsInitObject vcsInitObject, final Runnable runnable) {
+    ApplicationManager.getApplication().runReadAction(new Runnable() {
+      public void run() {
+        myInitialization.add(vcsInitObject, runnable);
+      }
+    });
+  }
 }
diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsInitObject.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsInitObject.java
new file mode 100644 (file)
index 0000000..9f135af
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2000-2009 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.openapi.vcs.impl;
+
+public enum VcsInitObject {
+  CHANGE_LIST_MANAGER(100),
+  MAPPINGS(10),
+  COMMITTED_CHANGES_CACHE(200);
+
+  private final int myOrder;
+
+  VcsInitObject(int order) {
+    myOrder = order;
+  }
+
+  public int getOrder() {
+    return myOrder;
+  }
+}
diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsInitialization.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsInitialization.java
new file mode 100644 (file)
index 0000000..2705f6d
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2000-2009 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.openapi.vcs.impl;
+
+import com.intellij.openapi.project.DumbAwareRunnable;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.startup.StartupManager;
+import com.intellij.openapi.util.Pair;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.List;
+
+public class VcsInitialization {
+  private final Project myProject;
+  private final List<Pair<VcsInitObject, Runnable>> myList;
+
+  public VcsInitialization(Project project) {
+    myProject = project;
+    myList = new LinkedList<Pair<VcsInitObject, Runnable>>();
+
+    StartupManager.getInstance(myProject).registerPostStartupActivity(new DumbAwareRunnable() {
+      public void run() {
+        execute();
+      }
+    });
+  }
+
+  public void add(final VcsInitObject vcsInitObject, final Runnable runnable) {
+    myList.add(new Pair<VcsInitObject, Runnable>(vcsInitObject, runnable));
+  }
+
+  public void execute() {
+    Collections.sort(myList, new Comparator<Pair<VcsInitObject, Runnable>>() {
+      public int compare(Pair<VcsInitObject, Runnable> o1, Pair<VcsInitObject, Runnable> o2) {
+        return new Integer(o1.getFirst().getOrder()).compareTo(new Integer(o2.getFirst().getOrder()));
+      }
+    });
+    for (Pair<VcsInitObject, Runnable> pair : myList) {
+      pair.getSecond().run();
+    }
+  }
+}
index ee68995885111a019b71b836579712d152224460..9f398b810d1650d8047c70c844b9f51ae5259bbf 100644 (file)
 package com.intellij.openapi.vcs.impl.projectlevelman;
 
 import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.project.DumbAwareRunnable;
 import com.intellij.openapi.project.Project;
+import com.intellij.openapi.startup.StartupManager;
 import com.intellij.openapi.ui.MessageType;
+import com.intellij.openapi.util.EmptyRunnable;
 import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.util.Ref;
 import com.intellij.openapi.util.io.FileUtil;
@@ -25,6 +28,8 @@ import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vcs.*;
 import com.intellij.openapi.vcs.changes.ui.ChangesViewBalloonProblemNotifier;
 import com.intellij.openapi.vcs.impl.DefaultVcsRootPolicy;
+import com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl;
+import com.intellij.openapi.vcs.impl.VcsInitObject;
 import com.intellij.openapi.vfs.LocalFileSystem;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.util.EventDispatcher;
@@ -48,7 +53,10 @@ public class NewMappings {
   private final EventDispatcher<VcsListener> myEventDispatcher;
   private final Project myProject;
 
-  public NewMappings(final Project project, final EventDispatcher<VcsListener> eventDispatcher) {
+  private boolean myActivated;
+
+  public NewMappings(final Project project, final EventDispatcher<VcsListener> eventDispatcher,
+                     final ProjectLevelVcsManagerImpl vcsManager) {
     myProject = project;
     myLock = new Object();
     myVcsToPaths = new HashMap<String, List<VcsDirectoryMapping>>();
@@ -62,6 +70,13 @@ public class NewMappings {
     listStr.add(mapping);
     myVcsToPaths.put("", listStr);
     mySortedMappings = new VcsDirectoryMapping[] {mapping};
+    myActivated = false;
+
+    vcsManager.addInitializationRequest(VcsInitObject.MAPPINGS, new DumbAwareRunnable() {
+      public void run() {
+        activateActiveVcses();
+      }
+    });
   }
 
   public AbstractVcs[] getActiveVcses() {
@@ -72,6 +87,15 @@ public class NewMappings {
     }
   }
 
+  public void activateActiveVcses() {
+    synchronized (myLock) {
+      if (myActivated) return;
+      myActivated = true;
+    }
+    keepActiveVcs(EmptyRunnable.getInstance());
+    mappingsChanged();
+  }
+
   @Modification
   public void setMapping(final String path, final String activeVcsName) {
     LOG.debug("setMapping path = '" + path + "' vcs = " + activeVcsName);
@@ -105,7 +129,15 @@ public class NewMappings {
   private void keepActiveVcs(final Runnable runnable) {
     final MyVcsActivator activator;
     synchronized (myLock) {
-      activator = new MyVcsActivator(new HashSet<String>(myVcsToPaths.keySet()));
+      if (! myActivated) {
+        runnable.run();
+        return;
+      }
+      final HashSet<String> old = new HashSet<String>();
+      for (AbstractVcs activeVcs : myActiveVcses) {
+        old.add(activeVcs.getName());
+      }
+      activator = new MyVcsActivator(old);
       runnable.run();
       restoreActiveVcses();
     }
index d5514e4a099bdb44172b078bbeabedc6b3b2b467..5b2dd2eba98de11fd002523f67b809dda18ce6ae 100644 (file)
@@ -159,7 +159,7 @@ public class SvnVcs extends AbstractVcs {
   }
 
   public SvnVcs(final Project project, MessageBus bus, SvnConfiguration svnConfiguration, final ChangeListManager changeListManager,
-                final VcsDirtyScopeManager vcsDirtyScopeManager, final StartupManager startupManager) {
+                final VcsDirtyScopeManager vcsDirtyScopeManager) {
     super(project, VCS_NAME);
     LOG.debug("ct");
     myConfiguration = svnConfiguration;
@@ -197,26 +197,6 @@ public class SvnVcs extends AbstractVcs {
       };
     }
 
-    // do one time after project loaded
-    startupManager.runWhenProjectIsInitialized(new DumbAwareRunnable() {
-      public void run() {
-        postStartup();
-
-        // for IDEA, it takes 2 minutes - and anyway this can be done in background, no sence...
-        // once it could be mistaken about copies for 2 minutes on start...
-
-        /*if (! myMapping.getAllWcInfos().isEmpty()) {
-          invokeRefreshSvnRoots();
-          return;
-        }
-        ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() {
-          public void run() {
-            myCopiesRefreshManager.getCopiesRefresh().ensureInit();
-          }
-        }, SvnBundle.message("refreshing.working.copies.roots.progress.text"), true, myProject);*/
-      }
-    });
-
     myFrameStateListener = new MyFrameStateListener(changeListManager, vcsDirtyScopeManager);
   }
 
@@ -358,6 +338,26 @@ public class SvnVcs extends AbstractVcs {
     // this will initialize its inner listener for committed changes upload
     LoadedRevisionsCache.getInstance(myProject);
     FrameStateManager.getInstance().addListener(myFrameStateListener);
+
+    // do one time after project loaded
+    StartupManager.getInstance(myProject).runWhenProjectIsInitialized(new DumbAwareRunnable() {
+      public void run() {
+        postStartup();
+
+        // for IDEA, it takes 2 minutes - and anyway this can be done in background, no sence...
+        // once it could be mistaken about copies for 2 minutes on start...
+
+        /*if (! myMapping.getAllWcInfos().isEmpty()) {
+          invokeRefreshSvnRoots();
+          return;
+        }
+        ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() {
+          public void run() {
+            myCopiesRefreshManager.getCopiesRefresh().ensureInit();
+          }
+        }, SvnBundle.message("refreshing.working.copies.roots.progress.text"), true, myProject);*/
+      }
+    });
   }
 
   @Override
index 6c0a405b8f5990e78f78825a151ed562a2dba640..9d29401a344e14c915bacc39bf29e89af6fd0b0d 100644 (file)
@@ -1,12 +1,14 @@
 package org.jetbrains.idea.svn;
 
 import com.intellij.execution.process.ProcessOutput;
+import com.intellij.ide.startup.impl.StartupManagerImpl;
 import com.intellij.lifecycle.AtomicSectionsAware;
 import com.intellij.openapi.application.PathManager;
 import com.intellij.openapi.application.PluginPathManager;
 import com.intellij.openapi.command.undo.UndoManager;
 import com.intellij.openapi.progress.EmptyProgressIndicator;
 import com.intellij.openapi.progress.ProcessCanceledException;
+import com.intellij.openapi.startup.StartupManager;
 import com.intellij.openapi.ui.Messages;
 import com.intellij.openapi.ui.TestDialog;
 import com.intellij.openapi.util.io.FileUtil;
@@ -81,7 +83,8 @@ public abstract class SvnTestCase extends AbstractVcsTestCase {
     };
 
     final SvnVcs vcs = SvnVcs.getInstance(myProject);
-    vcs.postStartup();
+    ((StartupManagerImpl) StartupManager.getInstance(myProject)).runPostStartupActivities();
+    //vcs.postStartup();
     ((SvnFileUrlMappingImpl) vcs.getSvnFileUrlMapping()).realRefresh(myRefreshCopiesStub);
   }