git4idea: VfsListener now removes and adds files in background
authorConstantine Plotnikov <Constantine.Plotnikov@jetbrains.com>
Fri, 18 Dec 2009 15:51:59 +0000 (18:51 +0300)
committerConstantine Plotnikov <Constantine.Plotnikov@jetbrains.com>
Wed, 13 Jan 2010 14:45:17 +0000 (17:45 +0300)
plugins/git4idea/src/git4idea/i18n/GitBundle.properties
plugins/git4idea/src/git4idea/vfs/GitVFSListener.java

index 83a423e4134029112caabfa002540687a6e0f511..3521e74ec3bbb7e6dcb75405ffabaab2bfbe0ef2 100644 (file)
@@ -323,6 +323,7 @@ refspec.title=Reference mapping
 refspec.validation.remote.invalid=The invalid local name for remote
 refspec.validation.remote.is.blank=The local name for remote is blank
 regase.show.tags=Show &tags
+remove.removing=Removing files...
 repository.action.missing.roots.misconfigured=Neither of configured git roots are is under git. The configured directory or some of its ancestors must have ".git" directory in it.
 repository.action.missing.roots.title=No git roots
 repository.action.missing.roots.unconfigured.message=No git roots are configured for the project.
index a4fb4ad29931a6ac8b167c280c65980177dc0156..9b4f4f9dafd4e9e870590bd5895e9dd375f596e4 100644 (file)
  */
 package git4idea.vfs;
 
+import com.intellij.openapi.progress.ProgressIndicator;
+import com.intellij.openapi.progress.Task;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vcs.FilePath;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vcs.VcsVFSListener;
 import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.util.ui.UIUtil;
 import com.intellij.vcsUtil.VcsUtil;
 import git4idea.GitUtil;
 import git4idea.GitVcs;
 import git4idea.commands.GitFileUtils;
 import git4idea.i18n.GitBundle;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -71,25 +75,42 @@ public class GitVFSListener extends VcsVFSListener {
    * {@inheritDoc}
    */
   protected void performAdding(final Collection<VirtualFile> addedFiles, final Map<VirtualFile, VirtualFile> copyFromMap) {
-    Map<VirtualFile, List<VirtualFile>> sortedFiles;
+    final Map<VirtualFile, List<VirtualFile>> sortedFiles;
     try {
       sortedFiles = GitUtil.sortFilesByGitRoot(addedFiles, true);
     }
     catch (VcsException e) {
-      ((GitVcs)myVcs).showMessages(e.getMessage());
+      gitVcs().showMessages(e.getMessage());
       return;
     }
-    // note that copied files are not processed because they are included into added files.
-    for (Map.Entry<VirtualFile, List<VirtualFile>> e : sortedFiles.entrySet()) {
-      try {
-        final VirtualFile root = e.getKey();
-        GitFileUtils.addFiles(myProject, root, e.getValue());
-        GitUtil.markFilesDirty(myProject, e.getValue());
+    gitVcs().runInBackground(new Task.Backgroundable(myProject, GitBundle.getString("add.adding")) {
+      @Override
+      public void run(@NotNull ProgressIndicator indicator) {
+        // note that copied files are not processed because they are included into added files.
+        for (Map.Entry<VirtualFile, List<VirtualFile>> e : sortedFiles.entrySet()) {
+          try {
+            final VirtualFile root = e.getKey();
+            indicator.setText(root.getPresentableUrl());
+            GitFileUtils.addFiles(myProject, root, e.getValue());
+            GitUtil.markFilesDirty(myProject, e.getValue());
+          }
+          catch (final VcsException ex) {
+            UIUtil.invokeLaterIfNeeded(new Runnable() {
+              public void run() {
+                gitVcs().showMessages(ex.getMessage());
+              }
+            });
+          }
+        }
       }
-      catch (VcsException ex) {
-        ((GitVcs)myVcs).showMessages(ex.getMessage());
-      }
-    }
+    });
+  }
+
+  /**
+   * @return casted vcs instance
+   */
+  private GitVcs gitVcs() {
+    return ((GitVcs)myVcs);
   }
 
   /**
@@ -98,25 +119,34 @@ public class GitVFSListener extends VcsVFSListener {
    * @param addedFiles the added files
    */
   private void performAdding(Collection<FilePath> addedFiles) {
-    Map<VirtualFile, List<FilePath>> sortedFiles;
+    final Map<VirtualFile, List<FilePath>> sortedFiles;
     try {
       sortedFiles = GitUtil.sortFilePathsByGitRoot(addedFiles, true);
     }
     catch (VcsException e) {
-      ((GitVcs)myVcs).showMessages(e.getMessage());
+      gitVcs().showMessages(e.getMessage());
       return;
     }
-    // note that copied files are not processed because they are included into added files.
-    for (Map.Entry<VirtualFile, List<FilePath>> e : sortedFiles.entrySet()) {
-      try {
-        final VirtualFile root = e.getKey();
-        GitFileUtils.addPaths(myProject, root, e.getValue());
-        GitUtil.markFilesDirty(myProject, e.getValue());
-      }
-      catch (VcsException ex) {
-        ((GitVcs)myVcs).showMessages(ex.getMessage());
+    gitVcs().runInBackground(new Task.Backgroundable(myProject, GitBundle.getString("add.adding")) {
+      @Override
+      public void run(@NotNull ProgressIndicator indicator) {
+        for (Map.Entry<VirtualFile, List<FilePath>> e : sortedFiles.entrySet()) {
+          try {
+            final VirtualFile root = e.getKey();
+            indicator.setText(root.getPresentableUrl());
+            GitFileUtils.addPaths(myProject, root, e.getValue());
+            GitUtil.markFilesDirty(myProject, e.getValue());
+          }
+          catch (final VcsException ex) {
+            UIUtil.invokeLaterIfNeeded(new Runnable() {
+              public void run() {
+                gitVcs().showMessages(ex.getMessage());
+              }
+            });
+          }
+        }
       }
-    }
+    });
   }
 
   /**
@@ -144,24 +174,34 @@ public class GitVFSListener extends VcsVFSListener {
    * {@inheritDoc}
    */
   protected void performDeletion(final List<FilePath> filesToDelete) {
-    Map<VirtualFile, List<FilePath>> sortedFiles;
+    final Map<VirtualFile, List<FilePath>> sortedFiles;
     try {
       sortedFiles = GitUtil.sortFilePathsByGitRoot(filesToDelete, true);
     }
     catch (VcsException e) {
-      ((GitVcs)myVcs).showMessages(e.getMessage());
+      gitVcs().showMessages(e.getMessage());
       return;
     }
-    for (Map.Entry<VirtualFile, List<FilePath>> e : sortedFiles.entrySet()) {
-      try {
-        final VirtualFile root = e.getKey();
-        GitFileUtils.delete(myProject, root, e.getValue());
-        GitUtil.markFilesDirty(myProject, e.getValue());
+    gitVcs().runInBackground(new Task.Backgroundable(myProject, GitBundle.getString("remove.removing")) {
+      @Override
+      public void run(@NotNull ProgressIndicator indicator) {
+        for (Map.Entry<VirtualFile, List<FilePath>> e : sortedFiles.entrySet()) {
+          try {
+            final VirtualFile root = e.getKey();
+            indicator.setText(root.getPresentableUrl());
+            GitFileUtils.delete(myProject, root, e.getValue());
+            GitUtil.markFilesDirty(myProject, e.getValue());
+          }
+          catch (final VcsException ex) {
+            UIUtil.invokeLaterIfNeeded(new Runnable() {
+              public void run() {
+                gitVcs().showMessages(ex.getMessage());
+              }
+            });
+          }
+        }
       }
-      catch (VcsException ex) {
-        ((GitVcs)myVcs).showMessages(ex.getMessage());
-      }
-    }
+    });
   }
 
   /**