From f97ff5f6bc6f4f967769fc64af9f168735a7b4ec Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Mon, 26 Sep 2016 23:53:44 +0300 Subject: [PATCH] svn: Refactored "BaseMergeTask" and inheritors * Used single "QuickMerge" constructor parameter instead of 2 separate "MergeContext" and "QuickMergeInteraction" parameters * Code simplified, warnings fixed, @NotNull --- .../idea/svn/integrate/BaseMergeTask.java | 23 +++--- .../CheckRepositorySupportsMergeInfoTask.java | 16 ++-- .../svn/integrate/LocalChangesPromptTask.java | 77 ++++++++----------- .../MergeAllOrSelectedChooserTask.java | 11 +-- .../MergeAllWithBranchCopyPointTask.java | 31 +++----- .../svn/integrate/MergeCalculatorTask.java | 68 +++++++--------- .../svn/integrate/MergeInitChecksTask.java | 21 ++--- .../idea/svn/integrate/MergeTask.java | 14 +--- .../idea/svn/integrate/QuickMerge.java | 14 +++- .../svn/integrate/ShelveLocalChangesTask.java | 29 ++----- .../svn/integrate/ShowRecentInDialogTask.java | 9 +-- 11 files changed, 119 insertions(+), 194 deletions(-) diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/BaseMergeTask.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/BaseMergeTask.java index a1027f67317b..f411c8958aca 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/BaseMergeTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/BaseMergeTask.java @@ -31,31 +31,28 @@ import org.tmatesoft.svn.core.SVNURL; import java.util.List; -/** - * @author Konstantin Kolosovsky. - */ public abstract class BaseMergeTask extends TaskDescriptor { private static final Logger LOG = Logger.getInstance(BaseMergeTask.class); + @NotNull protected final QuickMerge myMergeProcess; @NotNull protected final MergeContext myMergeContext; @NotNull protected final QuickMergeInteraction myInteraction; - public BaseMergeTask(@NotNull MergeContext mergeContext, - @NotNull QuickMergeInteraction interaction, String name, - @NotNull Where where) { + public BaseMergeTask(@NotNull QuickMerge mergeProcess, @NotNull String name, @NotNull Where where) { super(name, where); - myMergeContext = mergeContext; - myInteraction = interaction; + myMergeProcess = mergeProcess; + myMergeContext = mergeProcess.getMergeContext(); + myInteraction = mergeProcess.getInteraction(); } @NotNull protected List getMergeAllTasks() { List result = ContainerUtil.newArrayList(); - result.add(new LocalChangesPromptTask(myMergeContext, myInteraction, true, null, null)); - MergeAllWithBranchCopyPointTask mergeAllExecutor = new MergeAllWithBranchCopyPointTask(myMergeContext, myInteraction); + result.add(new LocalChangesPromptTask(myMergeProcess, true, null, null)); + MergeAllWithBranchCopyPointTask mergeAllExecutor = new MergeAllWithBranchCopyPointTask(myMergeProcess); result.add(myMergeContext.getVcs().getSvnBranchPointsCalculator() .getFirstCopyPointTask(myMergeContext.getWcInfo().getRepositoryRoot(), myMergeContext.getSourceUrl(), myMergeContext.getWcInfo().getRootUrl(), mergeAllExecutor)); @@ -65,11 +62,11 @@ public abstract class BaseMergeTask extends TaskDescriptor { } protected void runChangeListsMerge(@NotNull ContinuationContext context, - @NotNull final List lists, + @NotNull List lists, @NotNull SvnBranchPointsCalculator.WrapperInvertor copyPoint, @NotNull String title) { - context.next(new LocalChangesPromptTask(myMergeContext, myInteraction, false, lists, copyPoint), - new MergeTask(myMergeContext, myInteraction, new ChangeListsMergerFactory(lists, false, false, true), title)); + context.next(new LocalChangesPromptTask(myMergeProcess, false, lists, copyPoint), + new MergeTask(myMergeProcess, new ChangeListsMergerFactory(lists, false, false, true), title)); } @Nullable diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/CheckRepositorySupportsMergeInfoTask.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/CheckRepositorySupportsMergeInfoTask.java index 2ed9419aa4d7..864fb454f69e 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/CheckRepositorySupportsMergeInfoTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/CheckRepositorySupportsMergeInfoTask.java @@ -15,22 +15,20 @@ */ package org.jetbrains.idea.svn.integrate; -import com.intellij.util.containers.ContainerUtil; 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.SvnUtil; import java.util.List; -/** - * @author Konstantin Kolosovsky. - */ +import static com.intellij.util.containers.ContainerUtil.newArrayList; +import static org.jetbrains.idea.svn.SvnUtil.checkRepositoryVersion15; + public class CheckRepositorySupportsMergeInfoTask extends BaseMergeTask { - public CheckRepositorySupportsMergeInfoTask(@NotNull MergeContext mergeContext, @NotNull QuickMergeInteraction interaction) { - super(mergeContext, interaction, "Checking repository capabilities", Where.POOLED); + public CheckRepositorySupportsMergeInfoTask(@NotNull QuickMerge mergeProcess) { + super(mergeProcess, "Checking repository capabilities", Where.POOLED); } @Override @@ -40,11 +38,11 @@ public class CheckRepositorySupportsMergeInfoTask extends BaseMergeTask { private boolean supportsMergeInfo() { return myMergeContext.getWcInfo().getFormat().supportsMergeInfo() && - SvnUtil.checkRepositoryVersion15(myMergeContext.getVcs(), myMergeContext.getSourceUrl()); + checkRepositoryVersion15(myMergeContext.getVcs(), myMergeContext.getSourceUrl()); } @NotNull private List getChooseMergeTypeTasks() { - return ContainerUtil.newArrayList(new MergeAllOrSelectedChooserTask(myMergeContext, myInteraction)); + return newArrayList(new MergeAllOrSelectedChooserTask(myMergeProcess)); } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LocalChangesPromptTask.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LocalChangesPromptTask.java index b664e0dcbe3f..1701f84f92d8 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LocalChangesPromptTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LocalChangesPromptTask.java @@ -16,16 +16,13 @@ package org.jetbrains.idea.svn.integrate; import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.Conditions; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.changes.Change; import com.intellij.openapi.vcs.changes.ChangeListManager; -import com.intellij.openapi.vcs.changes.ChangesUtil; import com.intellij.openapi.vcs.changes.LocalChangeList; import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList; import com.intellij.util.FilePathByPathComparator; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.continuation.ContinuationContext; import com.intellij.util.continuation.Where; import com.intellij.vcsUtil.VcsUtil; @@ -36,25 +33,27 @@ import org.tmatesoft.svn.core.internal.util.SVNPathUtil; import java.io.File; import java.util.Collection; -import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; -/** - * @author Konstantin Kolosovsky. - */ +import static com.intellij.openapi.util.Conditions.alwaysTrue; +import static com.intellij.openapi.vcs.changes.ChangesUtil.*; +import static com.intellij.util.containers.ContainerUtil.isEmpty; +import static com.intellij.util.containers.ContainerUtil.sorted; +import static java.util.stream.Collectors.toSet; + public class LocalChangesPromptTask extends BaseMergeTask { private final boolean myMergeAll; @Nullable private final List myChangeListsToMerge; private final SvnBranchPointsCalculator.WrapperInvertor myCopyPoint; - public LocalChangesPromptTask(@NotNull MergeContext mergeContext, - @NotNull QuickMergeInteraction interaction, + public LocalChangesPromptTask(@NotNull QuickMerge mergeProcess, boolean mergeAll, @Nullable List changeListsToMerge, @Nullable SvnBranchPointsCalculator.WrapperInvertor copyPoint) { - super(mergeContext, interaction, "local changes intersection check", Where.AWT); + super(mergeProcess, "local changes intersection check", Where.AWT); myMergeAll = mergeAll; myChangeListsToMerge = changeListsToMerge; @@ -64,9 +63,9 @@ public class LocalChangesPromptTask extends BaseMergeTask { @Nullable private File getLocalPath(String repositoryRelativePath) { // from source if not inverted - final String absolutePath = SVNPathUtil.append(myMergeContext.getWcInfo().getRepositoryRoot(), repositoryRelativePath); - final SvnBranchPointsCalculator.BranchCopyData wrapped = myCopyPoint.getWrapped(); - final String sourceRelativePath = + String absolutePath = SVNPathUtil.append(myMergeContext.getWcInfo().getRepositoryRoot(), repositoryRelativePath); + SvnBranchPointsCalculator.BranchCopyData wrapped = myCopyPoint.getWrapped(); + String sourceRelativePath = SVNPathUtil.getRelativePath(myCopyPoint.isInvertedSense() ? wrapped.getSource() : wrapped.getTarget(), absolutePath); return !StringUtil.isEmptyOrSpaces(sourceRelativePath) ? new File(myMergeContext.getWcInfo().getPath(), sourceRelativePath) : null; @@ -76,9 +75,7 @@ public class LocalChangesPromptTask extends BaseMergeTask { public void run(ContinuationContext context) { List localChangeLists = ChangeListManager.getInstance(myMergeContext.getProject()).getChangeListsCopy(); Intersection intersection = - myMergeAll - ? getAllChangesIntersection(localChangeLists) - : getChangesIntersection(localChangeLists, myChangeListsToMerge); + myMergeAll ? getAllChangesIntersection(localChangeLists) : getChangesIntersection(localChangeLists, myChangeListsToMerge); if (intersection != null && !intersection.getChangesSubset().isEmpty()) { processIntersection(context, intersection); @@ -89,7 +86,7 @@ public class LocalChangesPromptTask extends BaseMergeTask { //noinspection EnumSwitchStatementWhichMissesCases switch (myInteraction.selectLocalChangesAction(myMergeAll)) { case shelve: - context.next(new ShelveLocalChangesTask(myMergeContext, myInteraction, intersection)); + context.next(new ShelveLocalChangesTask(myMergeProcess, intersection)); break; case cancel: context.cancelEverything(); @@ -97,8 +94,7 @@ public class LocalChangesPromptTask extends BaseMergeTask { case inspect: // here's cast is due to generic's bug @SuppressWarnings("unchecked") Collection changes = (Collection)intersection.getChangesSubset().values(); - myInteraction - .showIntersectedLocalPaths(ContainerUtil.sorted(ChangesUtil.getPaths(changes), FilePathByPathComparator.getInstance())); + myInteraction.showIntersectedLocalPaths(sorted(getPaths(changes), FilePathByPathComparator.getInstance())); context.cancelEverything(); break; } @@ -109,16 +105,8 @@ public class LocalChangesPromptTask extends BaseMergeTask { @Nullable List changeListsToMerge) { Intersection result = null; - if (!ContainerUtil.isEmpty(changeListsToMerge)) { - final Set pathsToMerge = collectPaths(changeListsToMerge); - - result = getChangesIntersection(localChangeLists, new Condition() { - @Override - public boolean value(Change change) { - return notNullAndInSet(ChangesUtil.getBeforePath(change), pathsToMerge) || - notNullAndInSet(ChangesUtil.getAfterPath(change), pathsToMerge); - } - }); + if (!isEmpty(changeListsToMerge)) { + result = getChangesIntersection(localChangeLists, change -> hasPathToMerge(change, collectPaths(changeListsToMerge))); } return result; @@ -126,26 +114,18 @@ public class LocalChangesPromptTask extends BaseMergeTask { @NotNull private Set collectPaths(@NotNull List lists) { - Set result = new HashSet<>(); - - for (CommittedChangeList list : lists) { - SvnChangeList svnList = (SvnChangeList)list; - - for (String path : svnList.getAffectedPaths()) { - File localPath = getLocalPath(path); - - if (localPath != null) { - result.add(VcsUtil.getFilePath(localPath, false)); - } - } - } - - return result; + return lists.stream() + .map(SvnChangeList.class::cast) + .flatMap(list -> list.getAffectedPaths().stream()) + .map(this::getLocalPath) + .filter(Objects::nonNull) + .map(localPath -> VcsUtil.getFilePath(localPath, false)) + .collect(toSet()); } @NotNull private static Intersection getAllChangesIntersection(@NotNull List localChangeLists) { - return getChangesIntersection(localChangeLists, Conditions.alwaysTrue()); + return getChangesIntersection(localChangeLists, alwaysTrue()); } @NotNull @@ -163,7 +143,10 @@ public class LocalChangesPromptTask extends BaseMergeTask { return result; } - private static boolean notNullAndInSet(@Nullable FilePath path, @NotNull Set items) { - return path != null && items.contains(path); + private static boolean hasPathToMerge(@NotNull Change change, @NotNull Set pathsToMerge) { + FilePath beforePath = getBeforePath(change); + FilePath afterPath = getAfterPath(change); + + return beforePath != null && pathsToMerge.contains(beforePath) || afterPath != null && pathsToMerge.contains(afterPath); } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeAllOrSelectedChooserTask.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeAllOrSelectedChooserTask.java index 2f0ec246b9f8..7d4f34d7cb28 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeAllOrSelectedChooserTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeAllOrSelectedChooserTask.java @@ -22,13 +22,10 @@ import com.intellij.util.continuation.Where; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -/** - * @author Konstantin Kolosovsky. - */ public class MergeAllOrSelectedChooserTask extends BaseMergeTask { - public MergeAllOrSelectedChooserTask(@NotNull MergeContext mergeContext, @NotNull QuickMergeInteraction interaction) { - super(mergeContext, interaction, "merge source selector", Where.AWT); + public MergeAllOrSelectedChooserTask(@NotNull QuickMerge mergeProcess) { + super(mergeProcess, "merge source selector", Where.AWT); } @Override @@ -40,7 +37,7 @@ public class MergeAllOrSelectedChooserTask extends BaseMergeTask { break; case showLatest: LoadRecentBranchRevisions loader = new LoadRecentBranchRevisions(myMergeContext, -1); - ShowRecentInDialogTask dialog = new ShowRecentInDialogTask(myMergeContext, myInteraction, loader); + ShowRecentInDialogTask dialog = new ShowRecentInDialogTask(myMergeProcess, loader); context.next(loader, dialog); break; @@ -66,7 +63,7 @@ public class MergeAllOrSelectedChooserTask extends BaseMergeTask { MergeCalculatorTask result = null; try { - result = new MergeCalculatorTask(myMergeContext, myInteraction); + result = new MergeCalculatorTask(myMergeProcess); } catch (VcsException e) { finishWithError(context, e.getMessage(), true); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeAllWithBranchCopyPointTask.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeAllWithBranchCopyPointTask.java index 5951998131df..9dc1a94f43a0 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeAllWithBranchCopyPointTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeAllWithBranchCopyPointTask.java @@ -21,24 +21,17 @@ import com.intellij.util.Consumer; import com.intellij.util.continuation.ContinuationContext; import com.intellij.util.continuation.Where; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.svn.SvnVcs; -import org.jetbrains.idea.svn.update.UpdateEventHandler; -import org.tmatesoft.svn.core.SVNURL; -import java.io.File; import java.util.Collections; import java.util.concurrent.atomic.AtomicReference; -/** - * @author Konstantin Kolosovsky. - */ public class MergeAllWithBranchCopyPointTask extends BaseMergeTask implements Consumer> { @NotNull private final AtomicReference> myData; - public MergeAllWithBranchCopyPointTask(@NotNull MergeContext mergeContext, @NotNull QuickMergeInteraction interaction) { - super(mergeContext, interaction, "merge all", Where.AWT); + public MergeAllWithBranchCopyPointTask(@NotNull QuickMerge mergeProcess) { + super(mergeProcess, "merge all", Where.AWT); myData = new AtomicReference<>(); } @@ -84,23 +77,17 @@ public class MergeAllWithBranchCopyPointTask extends BaseMergeTask context.cancelEverything(); } else { - final MergerFactory mergerFactory = createBranchMergerFactory(reintegrate, inverter); - final String title = "Merging all from " + myMergeContext.getBranchName() + (reintegrate ? " (reintegrate)" : ""); + MergerFactory mergerFactory = createBranchMergerFactory(reintegrate, inverter); + String title = "Merging all from " + myMergeContext.getBranchName() + (reintegrate ? " (reintegrate)" : ""); - context.next(new MergeTask(myMergeContext, myInteraction, mergerFactory, title)); + context.next(new MergeTask(myMergeProcess, mergerFactory, title)); } } @NotNull - private MergerFactory createBranchMergerFactory(final boolean reintegrate, - @NotNull final SvnBranchPointsCalculator.WrapperInvertor inverter) { - return new MergerFactory() { - @Override - public IMerger createMerger(SvnVcs vcs, File target, UpdateEventHandler handler, SVNURL currentBranchUrl, String branchName) { - return new BranchMerger(vcs, currentBranchUrl, myMergeContext.getWcInfo().getPath(), handler, reintegrate, - myMergeContext.getBranchName(), - reintegrate ? inverter.getWrapped().getTargetRevision() : inverter.getWrapped().getSourceRevision()); - } - }; + private MergerFactory createBranchMergerFactory(boolean reintegrate, @NotNull SvnBranchPointsCalculator.WrapperInvertor inverter) { + return (vcs, target, handler, currentBranchUrl, branchName) -> + new BranchMerger(vcs, currentBranchUrl, myMergeContext.getWcInfo().getPath(), handler, reintegrate, myMergeContext.getBranchName(), + reintegrate ? inverter.getWrapped().getTargetRevision() : inverter.getWrapped().getSourceRevision()); } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeCalculatorTask.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeCalculatorTask.java index 07cea9785819..19bed5f90c55 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeCalculatorTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeCalculatorTask.java @@ -17,35 +17,33 @@ package org.jetbrains.idea.svn.integrate; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.changes.TransparentlyFailedValueI; import com.intellij.openapi.vcs.versionBrowser.ChangeBrowserSettings; import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList; import com.intellij.util.Consumer; -import com.intellij.util.PairConsumer; import com.intellij.util.containers.ContainerUtil; 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.annotations.Nullable; -import org.jetbrains.idea.svn.SvnUtil; import org.jetbrains.idea.svn.history.*; import org.jetbrains.idea.svn.mergeinfo.MergeChecker; import org.jetbrains.idea.svn.mergeinfo.OneShotMergeInfoHelper; import org.jetbrains.idea.svn.mergeinfo.SvnMergeInfoCache; -import org.tmatesoft.svn.core.internal.util.SVNPathUtil; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicReference; -/** - * @author Konstantin Kolosovsky. - */ +import static com.intellij.util.containers.ContainerUtil.newArrayList; +import static java.util.Collections.singletonList; +import static org.jetbrains.idea.svn.SvnUtil.ensureStartSlash; +import static org.tmatesoft.svn.core.internal.util.SVNPathUtil.getRelativePath; +import static org.tmatesoft.svn.core.internal.util.SVNPathUtil.isAncestor; + public class MergeCalculatorTask extends BaseMergeTask implements Consumer> { @@ -59,15 +57,15 @@ public class MergeCalculatorTask extends BaseMergeTask myCopyData.set(value); } - public MergeCalculatorTask(@NotNull MergeContext mergeContext, @NotNull QuickMergeInteraction interaction) throws VcsException { - super(mergeContext, interaction, "Calculating not merged revisions", Where.POOLED); + public MergeCalculatorTask(@NotNull QuickMerge mergeProcess) throws VcsException { + super(mergeProcess, "Calculating not merged revisions", Where.POOLED); myMergeTitle = "Merge from " + myMergeContext.getBranchName(); // TODO: Previously it was configurable - either to use OneShotMergeInfoHelper or BranchInfo as merge checker, but later that logic // TODO: was commented (in 80ebdbfea5210f6c998e67ddf28ca9c670fa4efe on 5/28/2010). // TODO: Still check if we need to preserve such configuration or it is sufficient to always use OneShotMergeInfoHelper. myMergeChecker = new OneShotMergeInfoHelper(myMergeContext); - ((OneShotMergeInfoHelper)myMergeChecker).prepare(); + myMergeChecker.prepare(); myCopyData = new AtomicReference<>(); } @@ -101,36 +99,33 @@ public class MergeCalculatorTask extends BaseMergeTask } } catch (VcsException e) { - finishWithError(context, "Merge start wasn't found", Collections.singletonList(e)); + finishWithError(context, "Merge start wasn't found", singletonList(e)); } return result; } @NotNull - private LinkedList> getChangeListsAfter(@NotNull ContinuationContext context, final long revision) { + private List> getChangeListsAfter(@NotNull ContinuationContext context, final long revision) { ChangeBrowserSettings settings = new ChangeBrowserSettings(); settings.CHANGE_AFTER = Long.toString(revision); settings.USE_CHANGE_AFTER_FILTER = true; - final LinkedList> result = ContainerUtil.newLinkedList(); - final ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); + List> result = newArrayList(); + ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); try { ((SvnCommittedChangesProvider)myMergeContext.getVcs().getCommittedChangesProvider()) .getCommittedChangesWithMergedRevisons(settings, new SvnRepositoryLocation(myMergeContext.getSourceUrl()), 0, - new PairConsumer() { - - public void consume(@NotNull SvnChangeList changeList, LogHierarchyNode tree) { - indicator.checkCanceled(); - if (revision < changeList.getNumber()) { - result.add(Pair.create(changeList, tree)); - } + (changeList, tree) -> { + indicator.checkCanceled(); + if (revision < changeList.getNumber()) { + result.add(Pair.create(changeList, tree)); } }); } catch (VcsException e) { - finishWithError(context, "Checking revisions for merge fault", Collections.singletonList(e)); + finishWithError(context, "Checking revisions for merge fault", singletonList(e)); } return result; @@ -140,10 +135,10 @@ public class MergeCalculatorTask extends BaseMergeTask private List getNotMergedChangeLists(@NotNull List> changeLists) { ProgressManager.getInstance().getProgressIndicator().setText("Checking merge information..."); - String repositoryRelativeWorkingCopyRoot = SvnUtil.ensureStartSlash( - SVNPathUtil.getRelativePath(myMergeContext.getWcInfo().getRepositoryRoot(), myMergeContext.getWcInfo().getRootUrl())); + String repositoryRelativeWorkingCopyRoot = + ensureStartSlash(getRelativePath(myMergeContext.getWcInfo().getRepositoryRoot(), myMergeContext.getWcInfo().getRootUrl())); String repositoryRelativeSourceBranch = - SvnUtil.ensureStartSlash(SVNPathUtil.getRelativePath(myMergeContext.getWcInfo().getRepositoryRoot(), myMergeContext.getSourceUrl())); + ensureStartSlash(getRelativePath(myMergeContext.getWcInfo().getRepositoryRoot(), myMergeContext.getSourceUrl())); return getNotMergedChangeLists(changeLists, repositoryRelativeWorkingCopyRoot, repositoryRelativeSourceBranch); } @@ -152,7 +147,7 @@ public class MergeCalculatorTask extends BaseMergeTask private List getNotMergedChangeLists(@NotNull List> changeLists, @NotNull String workingCopyRoot, @NotNull String sourceBranch) { - List result = ContainerUtil.newArrayList(); + List result = newArrayList(); for (Pair pair : changeLists) { SvnChangeList changeList = pair.getFirst(); @@ -204,9 +199,7 @@ public class MergeCalculatorTask extends BaseMergeTask } // true if errors found - static boolean checkListForPaths(@NotNull final String workingCopyRoot, - @NotNull final String sourceBranch, - @NotNull LogHierarchyNode node) { + static boolean checkListForPaths(@NotNull String workingCopyRoot, @NotNull String sourceBranch, @NotNull LogHierarchyNode node) { // TODO: Such filtering logic is not clear enough so far (and probably not correct for all cases - for instance when we perform merge // TODO: from branch1 to branch2 and have revision which contain merge changes from branch3 to branch1. // TODO: In this case paths of child log entries will not contain neither urls from branch1 nor from branch2 - and checkEntry() method @@ -214,12 +207,7 @@ public class MergeCalculatorTask extends BaseMergeTask // TODO: Why do we check entries recursively - we have a revision - set of changes in the "merge from" branch? Why do we need to check // TODO: where they came from - we want avoid some circular merges or what? Does subversion itself perform such checks or not? - boolean isLocalChange = ContainerUtil.or(node.getChildren(), new Condition() { - @Override - public boolean value(@NotNull LogHierarchyNode child) { - return checkForSubtree(child, workingCopyRoot, sourceBranch); - } - }); + boolean isLocalChange = ContainerUtil.or(node.getChildren(), child -> checkForSubtree(child, workingCopyRoot, sourceBranch)); return isLocalChange || checkForEntry(node.getMe(), workingCopyRoot, sourceBranch); } @@ -231,11 +219,11 @@ public class MergeCalculatorTask extends BaseMergeTask */ // true if errors found private static boolean checkForSubtree(@NotNull LogHierarchyNode tree, @NotNull String relativeBranch, @NotNull String localURL) { - final LinkedList queue = new LinkedList<>(); + LinkedList queue = new LinkedList<>(); queue.addLast(tree); while (!queue.isEmpty()) { - final LogHierarchyNode element = queue.removeFirst(); + LogHierarchyNode element = queue.removeFirst(); ProgressManager.checkCanceled(); if (checkForEntry(element.getMe(), localURL, relativeBranch)) return true; @@ -253,10 +241,10 @@ public class MergeCalculatorTask extends BaseMergeTask boolean atLeastOneUnderBranch = false; for (LogEntryPath path : entry.getChangedPaths().values()) { - if (SVNPathUtil.isAncestor(localURL, path.getPath())) { + if (isAncestor(localURL, path.getPath())) { return true; } - if (!atLeastOneUnderBranch && SVNPathUtil.isAncestor(relativeBranch, path.getPath())) { + if (!atLeastOneUnderBranch && isAncestor(relativeBranch, path.getPath())) { atLeastOneUnderBranch = true; } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeInitChecksTask.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeInitChecksTask.java index 18c389c7109d..1714596f2f04 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeInitChecksTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeInitChecksTask.java @@ -15,26 +15,20 @@ */ package org.jetbrains.idea.svn.integrate; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.continuation.ContinuationContext; import com.intellij.util.continuation.Where; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.svn.NestedCopyType; -import org.jetbrains.idea.svn.dialogs.WCInfo; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.util.SVNURLUtil; import java.io.File; -/** - * @author Konstantin Kolosovsky. - */ public class MergeInitChecksTask extends BaseMergeTask { - public MergeInitChecksTask(@NotNull MergeContext mergeContext, @NotNull QuickMergeInteraction interaction) { - super(mergeContext, interaction, "initial checks", Where.AWT); + public MergeInitChecksTask(@NotNull QuickMerge mergeProcess) { + super(mergeProcess, "initial checks", Where.AWT); } @Override @@ -52,14 +46,11 @@ public class MergeInitChecksTask extends BaseMergeTask { } private boolean hasSwitchedRoots() { - final File currentRoot = myMergeContext.getWcInfo().getRootInfo().getIoFile(); + File currentRoot = myMergeContext.getWcInfo().getRootInfo().getIoFile(); - return ContainerUtil.or(myMergeContext.getVcs().getAllWcInfos(), new Condition() { - @Override - public boolean value(WCInfo info) { - return NestedCopyType.switched.equals(info.getType()) && FileUtil.isAncestor(currentRoot, info.getRootInfo().getIoFile(), true); - } - }); + return myMergeContext.getVcs().getAllWcInfos().stream() + .filter(info -> NestedCopyType.switched.equals(info.getType())) + .anyMatch(info -> FileUtil.isAncestor(currentRoot, info.getRootInfo().getIoFile(), true)); } private static boolean areInSameHierarchy(@NotNull SVNURL url1, @NotNull SVNURL url2) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeTask.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeTask.java index 7d90c608cb4d..c46d5162d871 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeTask.java @@ -25,18 +25,12 @@ import com.intellij.util.continuation.Where; import org.jetbrains.annotations.NotNull; import org.tmatesoft.svn.core.SVNURL; -/** - * @author Konstantin Kolosovsky. - */ public class MergeTask extends BaseMergeTask { @NotNull private final MergerFactory myFactory; - public MergeTask(@NotNull MergeContext mergeContext, - @NotNull QuickMergeInteraction interaction, - @NotNull MergerFactory factory, - final String mergeTitle) { - super(mergeContext, interaction, mergeTitle, Where.AWT); + public MergeTask(@NotNull QuickMerge mergeProcess, @NotNull MergerFactory factory, @NotNull String mergeTitle) { + super(mergeProcess, mergeTitle, Where.AWT); myFactory = factory; } @@ -88,10 +82,10 @@ public class MergeTask extends BaseMergeTask { return needRefresh; } - private void refreshChanges(@NotNull final ContinuationContext context) { + private void refreshChanges(@NotNull ContinuationContext context) { context.suspend(); ChangeListManager.getInstance(myMergeContext.getProject()) - .invokeAfterUpdate(() -> context.ping(), InvokeAfterUpdateMode.BACKGROUND_NOT_CANCELLABLE, "", ModalityState.NON_MODAL); + .invokeAfterUpdate(context::ping, InvokeAfterUpdateMode.BACKGROUND_NOT_CANCELLABLE, "", ModalityState.NON_MODAL); } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/QuickMerge.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/QuickMerge.java index a3a9a73798b6..c9f62b0dda27 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/QuickMerge.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/QuickMerge.java @@ -40,6 +40,16 @@ public class QuickMerge { myInteraction = interaction; } + @NotNull + public MergeContext getMergeContext() { + return myMergeContext; + } + + @NotNull + public QuickMergeInteraction getInteraction() { + return myInteraction; + } + @CalledInAwt public void execute() { runMergeTasks(null); @@ -56,8 +66,8 @@ public class QuickMerge { FileDocumentManager.getInstance().saveAllDocuments(); TaskDescriptor[] tasks = { - new MergeInitChecksTask(myMergeContext, myInteraction), - new CheckRepositorySupportsMergeInfoTask(myMergeContext, myInteraction), + new MergeInitChecksTask(this), + new CheckRepositorySupportsMergeInfoTask(this), finalTask }; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ShelveLocalChangesTask.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ShelveLocalChangesTask.java index f1584b34c6e4..3aa3381a4c9c 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ShelveLocalChangesTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ShelveLocalChangesTask.java @@ -23,7 +23,6 @@ import com.intellij.openapi.vcs.changes.Change; import com.intellij.openapi.vcs.changes.shelf.ShelveChangesManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.RefreshQueue; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.continuation.ContinuationContext; import com.intellij.util.continuation.Where; import org.jetbrains.annotations.NotNull; @@ -34,39 +33,30 @@ import java.util.List; import java.util.Map; import static com.intellij.openapi.vcs.changes.ChangesUtil.getAfterRevisionsFiles; +import static com.intellij.util.containers.ContainerUtil.newArrayList; import static java.util.stream.Collectors.toList; -/** - * @author Konstantin Kolosovsky. - */ public class ShelveLocalChangesTask extends BaseMergeTask { @NotNull private final Intersection myIntersection; - public ShelveLocalChangesTask(@NotNull MergeContext mergeContext, - @NotNull QuickMergeInteraction interaction, - @NotNull Intersection intersection) { - super(mergeContext, interaction, "Shelving local changes before merge", Where.POOLED); + public ShelveLocalChangesTask(@NotNull QuickMerge mergeProcess, @NotNull Intersection intersection) { + super(mergeProcess, "Shelving local changes before merge", Where.POOLED); myIntersection = intersection; } @Override - public void run(final ContinuationContext context) { + public void run(ContinuationContext context) { List changedFiles = shelveChanges(context); context.suspend(); - RefreshQueue.getInstance().refresh(true, false, new Runnable() { - @Override - public void run() { - context.ping(); - } - }, changedFiles); + RefreshQueue.getInstance().refresh(true, false, context::ping, changedFiles); } @NotNull private List shelveChanges(@NotNull ContinuationContext context) { - List changedFiles = ContainerUtil.newArrayList(); + List changedFiles = newArrayList(); ShelveChangesManager shelveManager = ShelveChangesManager.getInstance(myMergeContext.getProject()); for (Map.Entry> entry : myIntersection.getChangesSubset().entrySet()) { @@ -92,11 +82,6 @@ public class ShelveLocalChangesTask extends BaseMergeTask { } private static void saveAllDocuments() { - ApplicationManager.getApplication().invokeAndWait(new Runnable() { - @Override - public void run() { - FileDocumentManager.getInstance().saveAllDocuments(); - } - }, ModalityState.NON_MODAL); + ApplicationManager.getApplication().invokeAndWait(() -> FileDocumentManager.getInstance().saveAllDocuments(), ModalityState.NON_MODAL); } } 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 a10dedd75c30..e9e6e531e15e 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ShowRecentInDialogTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ShowRecentInDialogTask.java @@ -22,17 +22,12 @@ import org.jetbrains.annotations.NotNull; import java.util.List; -/** - * @author Konstantin Kolosovsky. - */ public class ShowRecentInDialogTask extends BaseMergeTask { @NotNull private final LoadRecentBranchRevisions myInitialChangeListsLoader; - public ShowRecentInDialogTask(@NotNull MergeContext mergeContext, - @NotNull QuickMergeInteraction interaction, - @NotNull LoadRecentBranchRevisions initialChangeListsLoader) { - super(mergeContext, interaction, "", Where.AWT); + public ShowRecentInDialogTask(@NotNull QuickMerge mergeProcess, @NotNull LoadRecentBranchRevisions initialChangeListsLoader) { + super(mergeProcess, "", Where.AWT); myInitialChangeListsLoader = initialChangeListsLoader; }