svn: Unified "LoadRecentBranchRevisions" and "MergeCalculatorTask" tasks

Removed "LoadRecentBranchRevisions"
This commit is contained in:
Konstantin Kolosovsky
2016-11-09 23:53:59 +03:00
parent e60c03e0ad
commit 9f9c1a14de
4 changed files with 86 additions and 151 deletions
@@ -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<LoadRecentBranchRevisions> myCallback;
@NotNull private final OneShotMergeInfoHelper myMergeChecker;
@NotNull private final List<SvnChangeList> myCommittedChangeLists;
public LoadRecentBranchRevisions(@NotNull QuickMerge mergeProcess, @NotNull Consumer<LoadRecentBranchRevisions> 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<List<SvnChangeList>, Boolean> loadResult = loadChangeLists(myMergeContext, -1, getBunchSize(-1));
myCommittedChangeLists.addAll(loadResult.first);
myLastLoaded = loadResult.second;
myCallback.consume(this);
}
@NotNull
public static Pair<List<SvnChangeList>, 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<SvnChangeList> 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 <T> List<T> getChangeLists(@NotNull MergeContext mergeContext,
@NotNull ChangeBrowserSettings settings,
long revisionToExclude,
int size,
@NotNull PairFunction<SvnChangeList, LogHierarchyNode, T> resultProvider) throws VcsException {
List<T> 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<SvnChangeList> getChangeLists() {
return myCommittedChangeLists;
}
}
@@ -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 ->
@@ -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<SvnChangeList> myNotMergedChangeLists;
@NotNull private final List<SvnChangeList> myChangeLists;
@NotNull private final Consumer<MergeCalculatorTask> myCallback;
private boolean myAllListsLoaded;
public MergeCalculatorTask(@NotNull QuickMerge mergeProcess, @NotNull Consumer<MergeCalculatorTask> callback) {
this(mergeProcess, "Loading recent " + mergeProcess.getMergeContext().getBranchName() + " revisions", null, callback);
}
public MergeCalculatorTask(@NotNull QuickMerge mergeProcess,
@NotNull SvnBranchPointsCalculator.WrapperInvertor copyPoint,
@NotNull Consumer<MergeCalculatorTask> 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<MergeCalculatorTask> 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<SvnChangeList> 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<List<SvnChangeList>, 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<Pair<SvnChangeList, LogHierarchyNode>> getChangeListsAfter(final long revision) {
private List<Pair<SvnChangeList, LogHierarchyNode>> getChangeListsAfter(long revision) throws VcsException {
ChangeBrowserSettings settings = new ChangeBrowserSettings();
settings.CHANGE_AFTER = Long.toString(revision);
settings.USE_CHANGE_AFTER_FILTER = true;
List<Pair<SvnChangeList, LogHierarchyNode>> 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<List<SvnChangeList>, 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<SvnChangeList> 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 <T> List<T> getChangeLists(@NotNull MergeContext mergeContext,
@NotNull ChangeBrowserSettings settings,
long revisionToExclude,
int size,
@NotNull PairFunction<SvnChangeList, LogHierarchyNode, T> resultProvider) throws VcsException {
List<T> 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;
}
}
@@ -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;