shelve/unshelve without conflicts
authorDmitry Avdeev <Dmitry.Avdeev@jetbrains.com>
Fri, 2 Apr 2010 12:39:55 +0000 (16:39 +0400)
committerDmitry Avdeev <Dmitry.Avdeev@jetbrains.com>
Fri, 2 Apr 2010 12:39:55 +0000 (16:39 +0400)
platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangesUtil.java
platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PatchApplier.java
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/conflicts/ChangelistConflictTracker.java
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/RollbackWorker.java

index 267c1e9afc7042c6ce8123919cc2475a45c4bffb..3072bb14ab531a7e8311e348b840d13602ca36f1 100644 (file)
@@ -21,6 +21,7 @@ import com.intellij.openapi.fileEditor.OpenFileDescriptor;
 import com.intellij.openapi.progress.ProcessCanceledException;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Computable;
+import com.intellij.openapi.util.Key;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.vcs.AbstractVcs;
 import com.intellij.openapi.vcs.FilePath;
@@ -41,6 +42,8 @@ import java.util.*;
  * @author max
  */
 public class ChangesUtil {
+  private static final Key<Boolean> INTERNAL_OPERATION_KEY = Key.<Boolean>create("internal vcs operation");
+
   private ChangesUtil() {}
 
   @NotNull
@@ -313,6 +316,24 @@ public class ChangesUtil {
     return false;
   }
 
+  public static void markInternalOperation(Iterable<Change> changes, boolean set) {
+    for (Change change : changes) {
+      VirtualFile file = change.getVirtualFile();
+      if (file != null) {
+        file.putUserData(INTERNAL_OPERATION_KEY, set);
+      }
+    }
+  }
+
+  public static void markInternalOperation(VirtualFile file, boolean set) {
+    file.putUserData(INTERNAL_OPERATION_KEY, set);
+  }
+
+  public static boolean isInternalOperation(VirtualFile file) {
+    Boolean data = file.getUserData(INTERNAL_OPERATION_KEY);
+    return data != null && data.booleanValue();   
+  }
+
   public static String getDefaultChangeListName() {
     return VcsBundle.message("changes.default.changlist.name");
   }
index 7ff2c143a0a0c5e45a7a891adedfe2f465511457..8305ea2d1869a6cd27fdeabe0b1eb095327df0bc 100644 (file)
@@ -144,10 +144,17 @@ public class PatchApplier<BinaryType extends FilePatch> {
               return;
             }
 
-            final ApplyPatchStatus status = actualApply(myVerifier);
+            try {
+              markInternalOperation(textPatches, true);
 
-            if (status != null) {
-              refStatus.set(status);
+              final ApplyPatchStatus status = actualApply(myVerifier);
+
+              if (status != null) {
+                refStatus.set(status);
+              }
+            }
+            finally {
+              markInternalOperation(textPatches, false);
             }
           } // end of Command run
         }, VcsBundle.message("patch.apply.command"), null);
@@ -156,6 +163,12 @@ public class PatchApplier<BinaryType extends FilePatch> {
     });
   }
 
+  private static void markInternalOperation(List<Pair<VirtualFile, ApplyTextFilePatch>> textPatches, boolean set) {
+    for (Pair<VirtualFile, ApplyTextFilePatch> patch : textPatches) {
+      ChangesUtil.markInternalOperation(patch.getFirst(), set);
+    }
+  }
+
   protected void refreshFiles() {
     final List<FilePath> directlyAffected = myVerifier.getDirectlyAffected();
     final List<VirtualFile> indirectlyAffected = myVerifier.getAllAffected();
index a5df0eb5041c9b740e64564ad955cdc2d470961d..63c12ef0bdf9df2d727a0a386163d0a96785ad98 100644 (file)
@@ -77,7 +77,7 @@ public class ChangelistConflictTracker {
         }
         Document document = e.getDocument();
         final VirtualFile file = myDocumentManager.getFile(document);
-        if (file == null) {
+        if (file == null || isFromActiveChangelist(file) || ChangesUtil.isInternalOperation(file)) {
           return;
         }
         myChangeListManager.invokeAfterUpdate(new Runnable() {
index f5e7ab7b99e41cf0a5a0aff2023c37e16d3fc2a9..ad685c498c4bde43f82d44e717fe4476625641e4 100644 (file)
@@ -104,6 +104,16 @@ public class RollbackWorker {
     }
 
     public void run() {
+      ChangesUtil.markInternalOperation(myChanges, true);
+      try {
+        doRun();
+      }
+      finally {
+        ChangesUtil.markInternalOperation(myChanges, false);        
+      }
+    }
+
+    private void doRun() {
       myIndicator = ProgressManager.getInstance().getProgressIndicator();
 
       final List<Change> changesToRefresh = new ArrayList<Change>();