svn: Refactored "MergeTask" - code simplified
authorKonstantin Kolosovsky <konstantin.kolosovsky@jetbrains.com>
Tue, 25 Oct 2016 11:00:46 +0000 (14:00 +0300)
committerKonstantin Kolosovsky <konstantin.kolosovsky@jetbrains.com>
Wed, 9 Nov 2016 20:53:59 +0000 (23:53 +0300)
* Do not wrap usual "Task.Backgroundable" instance into "TaskDescriptor"
* Removed "suspend/ping" logic - start next task in callback

plugins/svn4idea/src/org/jetbrains/idea/svn/SvnUtil.java
plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/BaseMergeTask.java
plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeTask.java

index df8cb077319fd0e228370fdddc10ec2f06d56ecc..fc880511b37353077fb073624360d88cb134813f 100644 (file)
@@ -758,6 +758,7 @@ public class SvnUtil {
     }
   }
 
+  @NotNull
   public static SVNURL parseUrl(@NotNull String url) {
     try {
       return SVNURL.parseURIEncoded(url);
index be6dfe868cf70ff805886fd67c50e7c50c3ec491..264067c150c0444682dd80a4968075fa50cd5081 100644 (file)
@@ -16,6 +16,7 @@
 package org.jetbrains.idea.svn.integrate;
 
 import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.progress.Task;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.util.continuation.ContinuationContext;
 import com.intellij.util.continuation.SeparatePiecesRunner;
@@ -30,6 +31,7 @@ import java.util.List;
 
 import static com.intellij.openapi.application.ApplicationManager.getApplication;
 import static java.util.Collections.singletonList;
+import static org.jetbrains.idea.svn.SvnUtil.parseUrl;
 import static org.jetbrains.idea.svn.WorkingCopyFormat.ONE_DOT_EIGHT;
 
 public abstract class BaseMergeTask extends TaskDescriptor {
@@ -72,14 +74,6 @@ public abstract class BaseMergeTask extends TaskDescriptor {
     myRunner.next(tasks);
   }
 
-  protected void suspend() {
-    myRunner.suspend();
-  }
-
-  protected void ping() {
-    myRunner.ping();
-  }
-
   protected void mergeAll(boolean supportsMergeInfo) {
     // merge info is not supported - branch copy point is used to make first sync merge successful (without unnecessary tree conflicts)
     // merge info is supported and svn client < 1.8 - branch copy point is used to determine if sync or reintegrate merge should be performed
@@ -99,7 +93,16 @@ public abstract class BaseMergeTask extends TaskDescriptor {
   }
 
   protected void merge(@NotNull String title, @NotNull MergerFactory mergerFactory, @Nullable List<SvnChangeList> changeLists) {
-    next(new LocalChangesPromptTask(myMergeProcess, changeLists), new MergeTask(myMergeProcess, mergerFactory, title));
+    next(new LocalChangesPromptTask(myMergeProcess, changeLists),
+         new MergeTask(myMergeProcess, () ->
+           newIntegrateTask(title, mergerFactory).queue()));
+  }
+
+  @NotNull
+  protected Task newIntegrateTask(@NotNull String title, @NotNull MergerFactory mergerFactory) {
+    return new SvnIntegrateChangesTask(myMergeContext.getVcs(), new WorkingCopyInfo(myMergeContext.getWcInfo().getPath(), true),
+                                       mergerFactory, parseUrl(myMergeContext.getSourceUrl()), title, false,
+                                       myMergeContext.getBranchName());
   }
 
   protected void end() {
index 35cc21fb3fc86f278c7b3780c12a610645850021..5c33c2ce745a2e9643cbbb51495abba667b87962 100644 (file)
@@ -20,37 +20,29 @@ import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vcs.changes.ChangeListManager;
 import com.intellij.openapi.vcs.changes.InvokeAfterUpdateMode;
 import com.intellij.openapi.vcs.changes.LocalChangeList;
-import com.intellij.util.continuation.TaskDescriptor;
 import com.intellij.util.continuation.Where;
 import org.jetbrains.annotations.NotNull;
-import org.tmatesoft.svn.core.SVNURL;
-
-import static org.jetbrains.idea.svn.SvnUtil.createUrl;
 
 public class MergeTask extends BaseMergeTask {
 
-  @NotNull private final MergerFactory myFactory;
-
-  public MergeTask(@NotNull QuickMerge mergeProcess, @NotNull MergerFactory factory, @NotNull String mergeTitle) {
-    super(mergeProcess, mergeTitle, Where.AWT);
+  @NotNull private final Runnable myCallback;
 
-    myFactory = factory;
+  public MergeTask(@NotNull QuickMerge mergeProcess, @NotNull Runnable callback) {
+    super(mergeProcess, "", Where.AWT);
+    myCallback = callback;
   }
 
   @Override
   public void run() throws VcsException {
-    next(TaskDescriptor.createForBackgroundableTask(newIntegrateTask(createUrl(myMergeContext.getSourceUrl()))));
-
     boolean needRefresh = setupDefaultEmptyChangeListForMerge();
+
     if (needRefresh) {
-      refreshChanges();
+      ChangeListManager.getInstance(myMergeContext.getProject())
+        .invokeAfterUpdate(myCallback, InvokeAfterUpdateMode.BACKGROUND_NOT_CANCELLABLE, "", ModalityState.NON_MODAL);
+    }
+    else {
+      myCallback.run();
     }
-  }
-
-  @NotNull
-  private SvnIntegrateChangesTask newIntegrateTask(@NotNull SVNURL branchUrl) {
-    return new SvnIntegrateChangesTask(myMergeContext.getVcs(), new WorkingCopyInfo(myMergeContext.getWcInfo().getPath(), true), myFactory,
-                                       branchUrl, getName(), false, myMergeContext.getBranchName());
   }
 
   private boolean setupDefaultEmptyChangeListForMerge() {
@@ -79,10 +71,4 @@ public class MergeTask extends BaseMergeTask {
 
     return needRefresh;
   }
-
-  private void refreshChanges() {
-    suspend();
-    ChangeListManager.getInstance(myMergeContext.getProject())
-      .invokeAfterUpdate(this::ping, InvokeAfterUpdateMode.BACKGROUND_NOT_CANCELLABLE, "", ModalityState.NON_MODAL);
-  }
 }