From 9f9c1a14decba2b15a76301a2cc1bdae4a0c6c0e Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 20 Oct 2016 02:24:20 +0300 Subject: [PATCH] svn: Unified "LoadRecentBranchRevisions" and "MergeCalculatorTask" tasks Removed "LoadRecentBranchRevisions" --- .../integrate/LoadRecentBranchRevisions.java | 123 ------------------ .../MergeAllOrSelectedChooserTask.java | 4 +- .../svn/integrate/MergeCalculatorTask.java | 106 +++++++++++---- .../idea/svn/integrate/ToBeMergedDialog.java | 4 +- 4 files changed, 86 insertions(+), 151 deletions(-) delete mode 100644 plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LoadRecentBranchRevisions.java diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LoadRecentBranchRevisions.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LoadRecentBranchRevisions.java deleted file mode 100644 index 648e509f5cef..000000000000 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LoadRecentBranchRevisions.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2000-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.idea.svn.integrate; - -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.vcs.VcsException; -import com.intellij.openapi.vcs.versionBrowser.ChangeBrowserSettings; -import com.intellij.util.Consumer; -import com.intellij.util.PairFunction; -import com.intellij.util.continuation.Where; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.svn.history.LogHierarchyNode; -import org.jetbrains.idea.svn.history.SvnChangeList; -import org.jetbrains.idea.svn.history.SvnCommittedChangesProvider; -import org.jetbrains.idea.svn.history.SvnRepositoryLocation; -import org.jetbrains.idea.svn.mergeinfo.MergeChecker; -import org.jetbrains.idea.svn.mergeinfo.OneShotMergeInfoHelper; - -import java.util.List; - -import static com.intellij.openapi.progress.ProgressManager.progress; -import static com.intellij.util.containers.ContainerUtil.newArrayList; -import static java.lang.Math.min; - -public class LoadRecentBranchRevisions extends BaseMergeTask { - public static final String PROP_BUNCH_SIZE = "idea.svn.quick.merge.bunch.size"; - private final static int BUNCH_SIZE = 100; - - private boolean myLastLoaded; - @NotNull private final Consumer myCallback; - @NotNull private final OneShotMergeInfoHelper myMergeChecker; - @NotNull private final List myCommittedChangeLists; - - public LoadRecentBranchRevisions(@NotNull QuickMerge mergeProcess, @NotNull Consumer callback) { - super(mergeProcess, "Loading recent " + mergeProcess.getMergeContext().getBranchName() + " revisions", Where.POOLED); - myCallback = callback; - myCommittedChangeLists = newArrayList(); - myMergeChecker = new OneShotMergeInfoHelper(myMergeContext); - } - - public boolean isLastLoaded() { - return myLastLoaded; - } - - /** - * TODO: Try to unify collecting and filtering change lists with similar logic in MergeCalculatorTask. - */ - @Override - public void run() throws VcsException { - progress("Collecting merge information"); - myMergeChecker.prepare(); - - Pair, Boolean> loadResult = loadChangeLists(myMergeContext, -1, getBunchSize(-1)); - myCommittedChangeLists.addAll(loadResult.first); - myLastLoaded = loadResult.second; - - myCallback.consume(this); - } - - @NotNull - public static Pair, Boolean> loadChangeLists(@NotNull MergeContext mergeContext, long beforeRevision, int size) - throws VcsException { - ChangeBrowserSettings settings = new ChangeBrowserSettings(); - if (beforeRevision > 0) { - settings.CHANGE_BEFORE = String.valueOf(beforeRevision); - settings.USE_CHANGE_BEFORE_FILTER = true; - } - - List changeLists = getChangeLists(mergeContext, settings, beforeRevision, size, (changeList, tree) -> changeList); - return Pair.create( - changeLists.subList(0, min(size, changeLists.size())), - changeLists.size() < size + 1); - } - - public static int getBunchSize(int size) { - Integer configuredSize = Integer.getInteger(PROP_BUNCH_SIZE); - - return configuredSize != null ? configuredSize : size > 0 ? size : BUNCH_SIZE; - } - - @NotNull - private static List getChangeLists(@NotNull MergeContext mergeContext, - @NotNull ChangeBrowserSettings settings, - long revisionToExclude, - int size, - @NotNull PairFunction resultProvider) throws VcsException { - List result = newArrayList(); - - ((SvnCommittedChangesProvider)mergeContext.getVcs().getCommittedChangesProvider()) - .getCommittedChangesWithMergedRevisons(settings, new SvnRepositoryLocation(mergeContext.getSourceUrl()), - size + (revisionToExclude > 0 ? 2 : 1), - (changeList, tree) -> { - if (revisionToExclude != changeList.getNumber()) { - result.add(resultProvider.fun(changeList, tree)); - } - }); - - return result; - } - - @NotNull - public MergeChecker getMergeChecker() { - return myMergeChecker; - } - - @NotNull - public List getChangeLists() { - return myCommittedChangeLists; - } -} 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 87436ca8bca3..cf4c195ae44c 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeAllOrSelectedChooserTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeAllOrSelectedChooserTask.java @@ -32,8 +32,8 @@ public class MergeAllOrSelectedChooserTask extends BaseMergeTask { next(getMergeAllTasks(true)); break; case showLatest: - next(new LoadRecentBranchRevisions(myMergeProcess, task -> - next(new ShowRevisionSelector(myMergeProcess, task.getChangeLists(), task.getMergeChecker(), false, task.isLastLoaded())))); + next(new MergeCalculatorTask(myMergeProcess, task -> + next(new ShowRevisionSelector(myMergeProcess, task.getChangeLists(), task.getMergeChecker(), false, task.areAllListsLoaded())))); break; case select: next(new LookForBranchOriginTask(myMergeProcess, false, copyPoint -> 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 4320b04bb528..0fbc9d1707cb 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeCalculatorTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/MergeCalculatorTask.java @@ -19,8 +19,10 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.versionBrowser.ChangeBrowserSettings; import com.intellij.util.Consumer; +import com.intellij.util.PairFunction; import com.intellij.util.continuation.Where; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.history.LogHierarchyNode; import org.jetbrains.idea.svn.history.SvnChangeList; import org.jetbrains.idea.svn.history.SvnCommittedChangesProvider; @@ -33,29 +35,49 @@ import java.util.List; import static com.intellij.openapi.progress.ProgressManager.progress; import static com.intellij.openapi.progress.ProgressManager.progress2; import static com.intellij.util.containers.ContainerUtil.newArrayList; +import static java.lang.Math.min; import static org.jetbrains.idea.svn.SvnBundle.message; import static org.jetbrains.idea.svn.mergeinfo.SvnMergeInfoCache.MergeCheckResult; public class MergeCalculatorTask extends BaseMergeTask { - @NotNull private final SvnBranchPointsCalculator.WrapperInvertor myCopyPoint; + public static final String PROP_BUNCH_SIZE = "idea.svn.quick.merge.bunch.size"; + private final static int BUNCH_SIZE = 100; + + @Nullable private final SvnBranchPointsCalculator.WrapperInvertor myCopyPoint; @NotNull private final OneShotMergeInfoHelper myMergeChecker; - @NotNull private final List myNotMergedChangeLists; + @NotNull private final List myChangeLists; @NotNull private final Consumer myCallback; + private boolean myAllListsLoaded; + + public MergeCalculatorTask(@NotNull QuickMerge mergeProcess, @NotNull Consumer callback) { + this(mergeProcess, "Loading recent " + mergeProcess.getMergeContext().getBranchName() + " revisions", null, callback); + } public MergeCalculatorTask(@NotNull QuickMerge mergeProcess, @NotNull SvnBranchPointsCalculator.WrapperInvertor copyPoint, @NotNull Consumer callback) { - super(mergeProcess, "Filtering " + mergeProcess.getMergeContext().getBranchName() + " revisions", Where.POOLED); + this(mergeProcess, "Filtering " + mergeProcess.getMergeContext().getBranchName() + " revisions", copyPoint, callback); + } + + private MergeCalculatorTask(@NotNull QuickMerge mergeProcess, + @NotNull String title, + @Nullable SvnBranchPointsCalculator.WrapperInvertor copyPoint, + @NotNull Consumer callback) { + super(mergeProcess, title, Where.POOLED); myCopyPoint = copyPoint; myCallback = callback; - myNotMergedChangeLists = newArrayList(); + myChangeLists = newArrayList(); // 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); } + public boolean areAllListsLoaded() { + return myAllListsLoaded; + } + @NotNull public MergeChecker getMergeChecker() { return myMergeChecker; @@ -63,7 +85,7 @@ public class MergeCalculatorTask extends BaseMergeTask { @NotNull public List getChangeLists() { - return myNotMergedChangeLists; + return myChangeLists; } @Override @@ -71,8 +93,18 @@ public class MergeCalculatorTask extends BaseMergeTask { progress("Collecting merge information"); myMergeChecker.prepare(); - myNotMergedChangeLists.addAll(getNotMergedChangeLists(getChangeListsAfter(myCopyPoint.getTrue().getTargetRevision()))); - if (!myNotMergedChangeLists.isEmpty()) { + if (myCopyPoint != null) { + myChangeLists.addAll(getNotMergedChangeLists(getChangeListsAfter(myCopyPoint.getTrue().getTargetRevision()))); + myAllListsLoaded = true; + } + else { + Pair, Boolean> loadResult = loadChangeLists(myMergeContext, -1, getBunchSize(-1)); + + myChangeLists.addAll(loadResult.first); + myAllListsLoaded = loadResult.second; + } + + if (!myChangeLists.isEmpty()) { myCallback.consume(this); } else { @@ -81,27 +113,12 @@ public class MergeCalculatorTask extends BaseMergeTask { } @NotNull - private List> getChangeListsAfter(final long revision) { + private List> getChangeListsAfter(long revision) throws VcsException { ChangeBrowserSettings settings = new ChangeBrowserSettings(); settings.CHANGE_AFTER = Long.toString(revision); settings.USE_CHANGE_AFTER_FILTER = true; - List> result = newArrayList(); - - try { - ((SvnCommittedChangesProvider)myMergeContext.getVcs().getCommittedChangesProvider()) - .getCommittedChangesWithMergedRevisons(settings, new SvnRepositoryLocation(myMergeContext.getSourceUrl()), 0, - (changeList, tree) -> { - if (revision < changeList.getNumber()) { - result.add(Pair.create(changeList, tree)); - } - }); - } - catch (VcsException e) { - end("Checking revisions for merge fault", e); - } - - return result; + return getChangeLists(myMergeContext, settings, revision, -1, Pair::create); } @NotNull @@ -120,4 +137,45 @@ public class MergeCalculatorTask extends BaseMergeTask { return result; } + + @NotNull + public static Pair, Boolean> loadChangeLists(@NotNull MergeContext mergeContext, long beforeRevision, int size) + throws VcsException { + ChangeBrowserSettings settings = new ChangeBrowserSettings(); + if (beforeRevision > 0) { + settings.CHANGE_BEFORE = String.valueOf(beforeRevision); + settings.USE_CHANGE_BEFORE_FILTER = true; + } + + List changeLists = getChangeLists(mergeContext, settings, beforeRevision, size, (changeList, tree) -> changeList); + return Pair.create( + changeLists.subList(0, min(size, changeLists.size())), + changeLists.size() < size + 1); + } + + public static int getBunchSize(int size) { + Integer configuredSize = Integer.getInteger(PROP_BUNCH_SIZE); + + return configuredSize != null ? configuredSize : size > 0 ? size : BUNCH_SIZE; + } + + @NotNull + private static List getChangeLists(@NotNull MergeContext mergeContext, + @NotNull ChangeBrowserSettings settings, + long revisionToExclude, + int size, + @NotNull PairFunction resultProvider) throws VcsException { + List result = newArrayList(); + + ((SvnCommittedChangesProvider)mergeContext.getVcs().getCommittedChangesProvider()) + .getCommittedChangesWithMergedRevisons(settings, new SvnRepositoryLocation(mergeContext.getSourceUrl()), + size > 0 ? size + (revisionToExclude > 0 ? 2 : 1) : 0, + (changeList, tree) -> { + if (revisionToExclude != changeList.getNumber()) { + result.add(resultProvider.fun(changeList, tree)); + } + }); + + return result; + } } 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 cee31264a5eb..22cb13e84c37 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ToBeMergedDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ToBeMergedDialog.java @@ -69,8 +69,8 @@ import static com.intellij.util.containers.ContainerUtilRt.emptyList; import static com.intellij.util.containers.ContainerUtilRt.newHashSet; import static java.util.Collections.singletonList; import static java.util.Collections.synchronizedMap; -import static org.jetbrains.idea.svn.integrate.LoadRecentBranchRevisions.getBunchSize; -import static org.jetbrains.idea.svn.integrate.LoadRecentBranchRevisions.loadChangeLists; +import static org.jetbrains.idea.svn.integrate.MergeCalculatorTask.getBunchSize; +import static org.jetbrains.idea.svn.integrate.MergeCalculatorTask.loadChangeLists; public class ToBeMergedDialog extends DialogWrapper { public static final int MERGE_ALL_CODE = 222;