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;
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 {
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
}
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() {
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() {
return needRefresh;
}
-
- private void refreshChanges() {
- suspend();
- ChangeListManager.getInstance(myMergeContext.getProject())
- .invokeAfterUpdate(this::ping, InvokeAfterUpdateMode.BACKGROUND_NOT_CANCELLABLE, "", ModalityState.NON_MODAL);
- }
}