svn: Refactored "MergeTask" - code simplified

* Do not wrap usual "Task.Backgroundable" instance into "TaskDescriptor"
* Removed "suspend/ping" logic - start next task in callback
This commit is contained in:
Konstantin Kolosovsky
2016-11-09 23:53:59 +03:00
parent 32e11c5639
commit b7eaa8dfac
3 changed files with 24 additions and 34 deletions
@@ -758,6 +758,7 @@ public class SvnUtil {
}
}
@NotNull
public static SVNURL parseUrl(@NotNull String url) {
try {
return SVNURL.parseURIEncoded(url);
@@ -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() {
@@ -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;
@NotNull private final Runnable myCallback;
public MergeTask(@NotNull QuickMerge mergeProcess, @NotNull MergerFactory factory, @NotNull String mergeTitle) {
super(mergeProcess, mergeTitle, Where.AWT);
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();
}
}
@NotNull
private SvnIntegrateChangesTask newIntegrateTask(@NotNull SVNURL branchUrl) {
return new SvnIntegrateChangesTask(myMergeContext.getVcs(), new WorkingCopyInfo(myMergeContext.getWcInfo().getPath(), true), myFactory,
branchUrl, getName(), false, myMergeContext.getBranchName());
if (needRefresh) {
ChangeListManager.getInstance(myMergeContext.getProject())
.invokeAfterUpdate(myCallback, InvokeAfterUpdateMode.BACKGROUND_NOT_CANCELLABLE, "", ModalityState.NON_MODAL);
}
else {
myCallback.run();
}
}
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);
}
}