diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LoadRecentBranchRevisions.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LoadRecentBranchRevisions.java index 5de08d4ed209..4df24119c973 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LoadRecentBranchRevisions.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LoadRecentBranchRevisions.java @@ -74,18 +74,16 @@ public class LoadRecentBranchRevisions extends TaskDescriptor { */ @Override public void run(ContinuationContext context) { - List> changeLists = null; - try { - changeLists = getChangeListsBefore(myFirst); + run(); } catch (VcsException e) { context.handleException(e, true); } + } - if (changeLists != null) { - initialize(context, changeLists); - } + public void run() throws VcsException { + initialize(getChangeListsBefore(myFirst)); } @NotNull @@ -131,17 +129,12 @@ public class LoadRecentBranchRevisions extends TaskDescriptor { return result; } - private void initialize(@NotNull ContinuationContext context, @NotNull List> changeLists) { + private void initialize(@NotNull List> changeLists) throws VcsException { myCommittedChangeLists = getNotMergedChangeLists(changeLists); - try { - myHelper = new OneShotMergeInfoHelper(myMergeContext); - ProgressManager.progress2("Calculating not merged revisions"); - myHelper.prepare(); - } - catch (VcsException e) { - context.handleException(e, true); - } + myHelper = new OneShotMergeInfoHelper(myMergeContext); + ProgressManager.progress2("Calculating not merged revisions"); + myHelper.prepare(); myLastLoaded = myCommittedChangeLists.size() < myBunchSize + 1; if (myCommittedChangeLists.size() > myBunchSize) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/QuickMergeInteraction.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/QuickMergeInteraction.java index d6c885994f6e..a0a0ee61fb8b 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/QuickMergeInteraction.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/QuickMergeInteraction.java @@ -18,9 +18,7 @@ package org.jetbrains.idea.svn.integrate; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList; -import com.intellij.util.PairConsumer; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.svn.dialogs.MergeDialogI; import org.jetbrains.idea.svn.mergeinfo.MergeChecker; import java.util.List; @@ -51,7 +49,6 @@ public interface QuickMergeInteraction { @NotNull List showRecentListsForSelection(@NotNull List list, @NotNull MergeChecker mergeChecker, - @NotNull PairConsumer loader, boolean everyThingLoaded); interface SelectMergeItemsResult { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/QuickMergeInteractionImpl.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/QuickMergeInteractionImpl.java index ce62a167924f..ef68a91a7cab 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/QuickMergeInteractionImpl.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/QuickMergeInteractionImpl.java @@ -24,10 +24,8 @@ import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList; -import com.intellij.util.PairConsumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.svn.dialogs.IntersectingLocalChangesPanel; -import org.jetbrains.idea.svn.dialogs.MergeDialogI; import org.jetbrains.idea.svn.mergeinfo.MergeChecker; import java.util.List; @@ -82,7 +80,7 @@ public class QuickMergeInteractionImpl implements QuickMergeInteraction { public SelectMergeItemsResult selectMergeItems(@NotNull List lists, @NotNull String mergeTitle, @NotNull MergeChecker mergeChecker) { - ToBeMergedDialog dialog = new ToBeMergedDialog(myProject, lists, mergeTitle, mergeChecker, null); + ToBeMergedDialog dialog = new ToBeMergedDialog(myMergeContext, lists, mergeTitle, mergeChecker, true); dialog.show(); return new SelectMergeItemsResult() { @@ -145,12 +143,9 @@ public class QuickMergeInteractionImpl implements QuickMergeInteraction { @Override public List showRecentListsForSelection(@NotNull List list, @NotNull MergeChecker mergeChecker, - @NotNull PairConsumer loader, boolean everyThingLoaded) { - ToBeMergedDialog dialog = new ToBeMergedDialog(myProject, list, myMergeContext.getTitle(), mergeChecker, loader); - if (everyThingLoaded) { - dialog.setEverythingLoaded(true); - } + ToBeMergedDialog dialog = new ToBeMergedDialog(myMergeContext, list, myMergeContext.getTitle(), mergeChecker, false); + return dialog.showAndGet() ? dialog.getSelected() : emptyList(); } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ShowRecentInDialogTask.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ShowRecentInDialogTask.java index ddd1be144bb9..a10dedd75c30 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ShowRecentInDialogTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ShowRecentInDialogTask.java @@ -15,20 +15,11 @@ */ package org.jetbrains.idea.svn.integrate; -import com.intellij.openapi.ui.MessageType; -import com.intellij.openapi.ui.popup.util.PopupUtil; -import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList; -import com.intellij.util.Consumer; -import com.intellij.util.PairConsumer; -import com.intellij.util.continuation.Continuation; import com.intellij.util.continuation.ContinuationContext; -import com.intellij.util.continuation.TaskDescriptor; import com.intellij.util.continuation.Where; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.svn.dialogs.MergeDialogI; -import java.util.Collections; import java.util.List; /** @@ -48,10 +39,9 @@ public class ShowRecentInDialogTask extends BaseMergeTask { @Override public void run(ContinuationContext context) { - List lists = myInteraction.showRecentListsForSelection(myInitialChangeListsLoader.getCommittedChangeLists(), - myInitialChangeListsLoader.getHelper(), - createMoreChangeListsLoader(), - myInitialChangeListsLoader.isLastLoaded()); + List lists = myInteraction + .showRecentListsForSelection(myInitialChangeListsLoader.getCommittedChangeLists(), myInitialChangeListsLoader.getHelper(), + myInitialChangeListsLoader.isLastLoaded()); if (!lists.isEmpty()) { runChangeListsMerge(context, lists, createBranchCopyPoint(), myMergeContext.getTitle()); @@ -61,51 +51,9 @@ public class ShowRecentInDialogTask extends BaseMergeTask { } } - @NotNull - private PairConsumer createMoreChangeListsLoader() { - return new PairConsumer() { - - @Override - public void consume(@NotNull Long bunchSize, @NotNull MergeDialogI dialog) { - LoadRecentBranchRevisions loader = new LoadRecentBranchRevisions(myMergeContext, dialog.getLastNumber(), bunchSize.intValue()); - TaskDescriptor updater = createUpdateDialogTask(dialog, loader); - - Continuation fragmented = Continuation.createFragmented(myMergeContext.getProject(), true); - fragmented.addExceptionHandler(VcsException.class, new Consumer() { - @Override - public void consume(VcsException e) { - PopupUtil.showBalloonForActiveComponent(e.getMessage() == null ? e.getClass().getName() : e.getMessage(), MessageType.ERROR); - } - }); - fragmented.run(loader, updater); - } - }; - } - @NotNull private SvnBranchPointsCalculator.WrapperInvertor createBranchCopyPoint() { return new SvnBranchPointsCalculator.WrapperInvertor(false, new SvnBranchPointsCalculator.BranchCopyData( myMergeContext.getWcInfo().getUrl().toString(), -1, myMergeContext.getSourceUrl(), -1)); } - - @NotNull - private static TaskDescriptor createUpdateDialogTask(@NotNull final MergeDialogI dialog, - @NotNull final LoadRecentBranchRevisions loader) { - return new TaskDescriptor("", Where.AWT) { - - @Override - public void run(ContinuationContext context) { - dialog.addMoreLists(loader.getCommittedChangeLists()); - if (loader.isLastLoaded()) { - dialog.setEverythingLoaded(true); - } - } - - @Override - public void canceled() { - dialog.addMoreLists(Collections.emptyList()); - dialog.setEverythingLoaded(true); - } - }; - } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ToBeMergedDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ToBeMergedDialog.java index 21d3277eea25..7dd0b8142df9 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ToBeMergedDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ToBeMergedDialog.java @@ -18,13 +18,17 @@ package org.jetbrains.idea.svn.integrate; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.DumbAwareAction; -import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.Splitter; +import com.intellij.openapi.ui.popup.util.PopupUtil; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vcs.QuantitySelection; import com.intellij.openapi.vcs.SelectionResult; +import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.changes.Change; import com.intellij.openapi.vcs.changes.committed.CommittedChangeListRenderer; import com.intellij.openapi.vcs.changes.committed.CommittedChangesTreeBrowser; @@ -39,7 +43,6 @@ import com.intellij.ui.SimpleTextAttributes; import com.intellij.ui.TableViewSpeedSearch; import com.intellij.ui.table.TableView; import com.intellij.util.ObjectUtils; -import com.intellij.util.PairConsumer; import com.intellij.util.ui.ColumnInfo; import com.intellij.util.ui.ListTableModel; import com.intellij.util.ui.UIUtil; @@ -69,7 +72,9 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import static com.intellij.util.containers.ContainerUtil.*; +import static com.intellij.util.containers.ContainerUtil.newHashMap; import static com.intellij.util.containers.ContainerUtilRt.emptyList; +import static com.intellij.util.containers.ContainerUtilRt.newArrayList; import static com.intellij.util.containers.ContainerUtilRt.newHashSet; import static java.util.Collections.singletonList; import static java.util.Collections.synchronizedMap; @@ -77,7 +82,7 @@ import static java.util.Collections.synchronizedMap; public class ToBeMergedDialog extends DialogWrapper implements MergeDialogI { public static final int MERGE_ALL_CODE = 222; private final JPanel myPanel; - private final Project myProject; + @NotNull private final MergeContext myMergeContext; private final PageEngine> myListsEngine; private TableView myRevisionsList; private RepositoryChangesBrowser myRepositoryChangesBrowser; @@ -86,7 +91,6 @@ public class ToBeMergedDialog extends DialogWrapper implements MergeDialogI { private final QuantitySelection myWiseSelection; private final Set myAlreadyMerged; - private final PairConsumer myMoreLoader; private final MergeChecker myMergeChecker; private final boolean myAlreadyCalculatedState; private volatile boolean myEverythingLoaded; @@ -95,19 +99,18 @@ public class ToBeMergedDialog extends DialogWrapper implements MergeDialogI { private ToBeMergedDialog.MoreXAction myMore100Action; private ToBeMergedDialog.MoreXAction myMore500Action; - public ToBeMergedDialog(final Project project, + public ToBeMergedDialog(@NotNull MergeContext mergeContext, @NotNull List lists, final String title, @NotNull MergeChecker mergeChecker, - final PairConsumer moreLoader) { - super(project, true); - myMoreLoader = moreLoader; - myEverythingLoaded = moreLoader == null; + boolean everythingLoaded) { + super(mergeContext.getProject(), true); + myMergeContext = mergeContext; + myEverythingLoaded = everythingLoaded; myStatusMap = synchronizedMap(newHashMap()); myMergeChecker = mergeChecker; - myAlreadyCalculatedState = moreLoader == null; + myAlreadyCalculatedState = everythingLoaded; setTitle(title); - myProject = project; // Paging is not used - "Load Xxx" buttons load corresponding new elements and add them to the end of the table. Single (first) page is // always used. @@ -338,7 +341,8 @@ public class ToBeMergedDialog extends DialogWrapper implements MergeDialogI { flatModel.setItems(myListsEngine.getCurrent()); flatModel.fireTableDataChanged(); - myRepositoryChangesBrowser = new RepositoryChangesBrowser(myProject, Collections.emptyList(), emptyList(), null); + myRepositoryChangesBrowser = + new RepositoryChangesBrowser(myMergeContext.getProject(), Collections.emptyList(), emptyList(), null); myRepositoryChangesBrowser.getDiffAction() .registerCustomShortcutSet(myRepositoryChangesBrowser.getDiffAction().getShortcutSet(), myRevisionsList); setChangesDecorator(); @@ -446,7 +450,8 @@ public class ToBeMergedDialog extends DialogWrapper implements MergeDialogI { myMore500Action.setVisible(false); myMore100Action.setEnabled(false); myMore500Action.setEnabled(false); - myMoreLoader.consume(Long.valueOf(myQuantity), ToBeMergedDialog.this); + + new LoadChangeListsTask(getLastNumber(), myQuantity).queue(); } } @@ -474,6 +479,59 @@ public class ToBeMergedDialog extends DialogWrapper implements MergeDialogI { } } + private class LoadChangeListsTask extends Task.Backgroundable { + + private final long myStartNumber; + private final int myQuantity; + private List myLists; + private boolean myIsLastListLoaded; + + public LoadChangeListsTask(long startNumber, int quantity) { + super(myMergeContext.getProject(), "Loading recent " + myMergeContext.getBranchName() + " revisions", true); + myStartNumber = startNumber; + myQuantity = quantity; + } + + @Override + public void run(@NotNull ProgressIndicator indicator) { + LoadRecentBranchRevisions loader = new LoadRecentBranchRevisions(myMergeContext, myStartNumber, myQuantity); + + try { + loader.run(); + + myLists = loader.getCommittedChangeLists(); + myIsLastListLoaded = loader.isLastLoaded(); + } + catch (VcsException e) { + setEmptyData(); + PopupUtil.showBalloonForActiveComponent(e.getMessage(), MessageType.ERROR); + } + } + + @Override + public void onCancel() { + setEmptyData(); + updateDialog(); + } + + @Override + public void onSuccess() { + updateDialog(); + } + + private void setEmptyData() { + myLists = emptyList(); + myIsLastListLoaded = false; + } + + private void updateDialog() { + addMoreLists(myLists); + if (myIsLastListLoaded) { + setEverythingLoaded(true); + } + } + } + private class MyListCellRenderer implements TableCellRenderer { private final JPanel myPanel; private final CommittedChangeListRenderer myRenderer; @@ -484,7 +542,7 @@ public class ToBeMergedDialog extends DialogWrapper implements MergeDialogI { myCheckBox = new JCheckBox(); myCheckBox.setEnabled(true); myCheckBox.setSelected(true); - myRenderer = new CommittedChangeListRenderer(myProject, singletonList(list -> { + myRenderer = new CommittedChangeListRenderer(myMergeContext.getProject(), singletonList(list -> { ListMergeStatus status = myAlreadyCalculatedState ? ListMergeStatus.NOT_MERGED : ObjectUtils.notNull(myStatusMap.get(list.getNumber()), ListMergeStatus.REFRESHING); diff --git a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/QuickMergeTestInteraction.java b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/QuickMergeTestInteraction.java index 7e9ccf67a9ce..42a4e2dde47d 100644 --- a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/QuickMergeTestInteraction.java +++ b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/QuickMergeTestInteraction.java @@ -18,9 +18,7 @@ package org.jetbrains.idea.svn; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList; -import com.intellij.util.PairConsumer; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.svn.dialogs.MergeDialogI; import org.jetbrains.idea.svn.integrate.LocalChangesAction; import org.jetbrains.idea.svn.integrate.QuickMergeContentsVariants; import org.jetbrains.idea.svn.integrate.QuickMergeInteraction; @@ -87,7 +85,6 @@ public class QuickMergeTestInteraction implements QuickMergeInteraction { @Override public List showRecentListsForSelection(@NotNull List list, @NotNull MergeChecker mergeChecker, - @NotNull PairConsumer loader, boolean everyThingLoaded) { return emptyList(); } diff --git a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnQuickMergeTest.java b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnQuickMergeTest.java index e0aa340e5924..477b6f51461b 100644 --- a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnQuickMergeTest.java +++ b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnQuickMergeTest.java @@ -25,7 +25,6 @@ import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager; import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.PairConsumer; import com.intellij.util.SmartList; import com.intellij.util.concurrency.Semaphore; import com.intellij.util.continuation.ContinuationContext; @@ -38,7 +37,6 @@ import org.jetbrains.idea.svn.branchConfig.InfoReliability; import org.jetbrains.idea.svn.branchConfig.InfoStorage; import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationManager; import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew; -import org.jetbrains.idea.svn.dialogs.MergeDialogI; import org.jetbrains.idea.svn.dialogs.WCInfo; import org.jetbrains.idea.svn.integrate.MergeContext; import org.jetbrains.idea.svn.integrate.QuickMerge; @@ -178,7 +176,6 @@ public class SvnQuickMergeTest extends Svn17TestCase { @Override public List showRecentListsForSelection(@NotNull List list, @NotNull MergeChecker mergeChecker, - @NotNull PairConsumer loader, boolean everyThingLoaded) { if (list.size() != 4) { selectionError.set("List size: " + list.size()); @@ -265,7 +262,6 @@ public class SvnQuickMergeTest extends Svn17TestCase { @Override public List showRecentListsForSelection(@NotNull List list, @NotNull MergeChecker mergeChecker, - @NotNull PairConsumer loader, boolean everyThingLoaded) { if (list.size() != 2) { selectionError.set("List size: " + list.size());