svn: Moved "load more change lists" logic directly to "ToBeMergedDialog"

This commit is contained in:
Konstantin Kolosovsky
2016-10-11 04:28:23 +03:00
parent acacaef803
commit c6e03dc98e
7 changed files with 86 additions and 102 deletions
@@ -74,18 +74,16 @@ public class LoadRecentBranchRevisions extends TaskDescriptor {
*/
@Override
public void run(ContinuationContext context) {
List<Pair<SvnChangeList, LogHierarchyNode>> 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<Pair<SvnChangeList, LogHierarchyNode>> changeLists) {
private void initialize(@NotNull List<Pair<SvnChangeList, LogHierarchyNode>> 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) {
@@ -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<CommittedChangeList> showRecentListsForSelection(@NotNull List<CommittedChangeList> list,
@NotNull MergeChecker mergeChecker,
@NotNull PairConsumer<Long, MergeDialogI> loader,
boolean everyThingLoaded);
interface SelectMergeItemsResult {
@@ -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<CommittedChangeList> 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<CommittedChangeList> showRecentListsForSelection(@NotNull List<CommittedChangeList> list,
@NotNull MergeChecker mergeChecker,
@NotNull PairConsumer<Long, MergeDialogI> 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();
}
@@ -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<CommittedChangeList> lists = myInteraction.showRecentListsForSelection(myInitialChangeListsLoader.getCommittedChangeLists(),
myInitialChangeListsLoader.getHelper(),
createMoreChangeListsLoader(),
myInitialChangeListsLoader.isLastLoaded());
List<CommittedChangeList> 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<Long, MergeDialogI> createMoreChangeListsLoader() {
return new PairConsumer<Long, MergeDialogI>() {
@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<VcsException>() {
@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.<CommittedChangeList>emptyList());
dialog.setEverythingLoaded(true);
}
};
}
}
@@ -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<List<CommittedChangeList>> myListsEngine;
private TableView<CommittedChangeList> myRevisionsList;
private RepositoryChangesBrowser myRepositoryChangesBrowser;
@@ -86,7 +91,6 @@ public class ToBeMergedDialog extends DialogWrapper implements MergeDialogI {
private final QuantitySelection<Long> myWiseSelection;
private final Set<Change> myAlreadyMerged;
private final PairConsumer<Long, MergeDialogI> 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<CommittedChangeList> lists,
final String title,
@NotNull MergeChecker mergeChecker,
final PairConsumer<Long, MergeDialogI> 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.<CommittedChangeList>emptyList(), emptyList(), null);
myRepositoryChangesBrowser =
new RepositoryChangesBrowser(myMergeContext.getProject(), Collections.<CommittedChangeList>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<CommittedChangeList> 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);
@@ -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<CommittedChangeList> showRecentListsForSelection(@NotNull List<CommittedChangeList> list,
@NotNull MergeChecker mergeChecker,
@NotNull PairConsumer<Long, MergeDialogI> loader,
boolean everyThingLoaded) {
return emptyList();
}
@@ -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<CommittedChangeList> showRecentListsForSelection(@NotNull List<CommittedChangeList> list,
@NotNull MergeChecker mergeChecker,
@NotNull PairConsumer<Long, MergeDialogI> 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<CommittedChangeList> showRecentListsForSelection(@NotNull List<CommittedChangeList> list,
@NotNull MergeChecker mergeChecker,
@NotNull PairConsumer<Long, MergeDialogI> loader,
boolean everyThingLoaded) {
if (list.size() != 2) {
selectionError.set("List size: " + list.size());