From 3b271e2255bcd4404758343127ebc799c36733b9 Mon Sep 17 00:00:00 2001 From: Konstantin Kolosovsky Date: Thu, 20 Oct 2016 13:58:11 +0300 Subject: [PATCH] svn: Refactored "LocalChangesPromptTask", "Intersection" - code simplified --- .../idea/svn/integrate/BaseMergeTask.java | 2 +- .../idea/svn/integrate/Intersection.java | 46 +++++++++++-------- .../svn/integrate/LocalChangesPromptTask.java | 33 ++++++------- .../svn/integrate/ShelveLocalChangesTask.java | 3 +- 4 files changed, 45 insertions(+), 39 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 a0fb41c9f7c3..a1409dd936d9 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/BaseMergeTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/BaseMergeTask.java @@ -91,7 +91,7 @@ public abstract class BaseMergeTask extends TaskDescriptor { : new LookForBranchOriginTask(myMergeProcess, true, copyPoint -> next(new MergeAllWithBranchCopyPointTask(myMergeProcess, copyPoint, supportsMergeInfo))); - return ar(new LocalChangesPromptTask(myMergeProcess), mergeAllTask); + return ar(new LocalChangesPromptTask(myMergeProcess, null), mergeAllTask); } protected void runChangeListsMerge(@NotNull List lists, @NotNull String title) { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/Intersection.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/Intersection.java index c2aca16e83f3..674ddde1adec 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/Intersection.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/Intersection.java @@ -16,36 +16,46 @@ package org.jetbrains.idea.svn.integrate; import com.intellij.openapi.vcs.changes.Change; -import com.intellij.util.containers.MultiMap; +import com.intellij.openapi.vcs.changes.LocalChangeList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; +import java.util.List; import java.util.Map; -/** -* @author Konstantin Kolosovsky. -*/ +import static com.intellij.util.ObjectUtils.notNull; +import static com.intellij.util.containers.ContainerUtil.*; + public class Intersection { - private final Map myLists; - private final MultiMap myChangesSubset; - public Intersection() { - myLists = new HashMap<>(); - myChangesSubset = new MultiMap<>(); + @NotNull private final Map myListComments = newHashMap(); + @NotNull private final Map> myChangesByLists = newHashMap(); + + public void add(@NotNull LocalChangeList list, @NotNull Change change) { + myChangesByLists.computeIfAbsent(list.getName(), key -> newArrayList()).add(change); + myListComments.put(list.getName(), notNull(list.getComment(), list.getName())); } - public void add(@NotNull final String listName, @Nullable final String comment, final Change change) { - myChangesSubset.putValue(listName, change); - final String commentToPut = comment == null ? listName : comment; - myLists.put(listName, commentToPut); + @NotNull + public String getComment(@NotNull String listName) { + return myListComments.get(listName); } - public String getComment(final String listName) { - return myLists.get(listName); + @NotNull + public Map> getChangesByLists() { + return myChangesByLists; } - public MultiMap getChangesSubset() { - return myChangesSubset; + public boolean isEmpty() { + return myChangesByLists.isEmpty(); + } + + @NotNull + public List getAllChanges() { + return concat(myChangesByLists.values()); + } + + public static boolean isEmpty(@Nullable Intersection intersection) { + return intersection == null || intersection.isEmpty(); } } 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 462e8d95a834..8da1a2dcb9de 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LocalChangesPromptTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/LocalChangesPromptTask.java @@ -28,7 +28,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.history.SvnChangeList; import java.io.File; -import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.Set; @@ -38,6 +37,8 @@ import static com.intellij.openapi.util.text.StringUtil.isEmptyOrSpaces; import static com.intellij.openapi.vcs.changes.ChangesUtil.*; import static com.intellij.util.containers.ContainerUtil.sorted; import static java.util.stream.Collectors.toSet; +import static org.jetbrains.idea.svn.integrate.Intersection.isEmpty; +import static org.jetbrains.idea.svn.integrate.LocalChangesAction.continueMerge; import static org.tmatesoft.svn.core.internal.util.SVNPathUtil.append; import static org.tmatesoft.svn.core.internal.util.SVNPathUtil.getRelativePath; @@ -45,12 +46,7 @@ public class LocalChangesPromptTask extends BaseMergeTask { @Nullable private final List myChangeListsToMerge; - public LocalChangesPromptTask(@NotNull QuickMerge mergeProcess) { - super(mergeProcess, "local changes intersection check", Where.AWT); - myChangeListsToMerge = null; - } - - public LocalChangesPromptTask(@NotNull QuickMerge mergeProcess, @NotNull List changeListsToMerge) { + public LocalChangesPromptTask(@NotNull QuickMerge mergeProcess, @Nullable List changeListsToMerge) { super(mergeProcess, "local changes intersection check", Where.AWT); myChangeListsToMerge = changeListsToMerge; } @@ -70,14 +66,16 @@ public class LocalChangesPromptTask extends BaseMergeTask { ? getChangesIntersection(localChangeLists, myChangeListsToMerge) : getAllChangesIntersection(localChangeLists); - if (intersection != null && !intersection.getChangesSubset().isEmpty()) { - processIntersection(intersection); - } + processIntersection(intersection); } - private void processIntersection(@NotNull Intersection intersection) { - //noinspection EnumSwitchStatementWhichMissesCases - switch (myInteraction.selectLocalChangesAction(myChangeListsToMerge == null)) { + private void processIntersection(@Nullable Intersection intersection) { + boolean mergeAll = myChangeListsToMerge == null; + LocalChangesAction nextAction = !isEmpty(intersection) ? myInteraction.selectLocalChangesAction(mergeAll) : continueMerge; + + switch (nextAction) { + case continueMerge: + break; case shelve: next(new ShelveLocalChangesTask(myMergeProcess, intersection)); break; @@ -85,9 +83,9 @@ public class LocalChangesPromptTask extends BaseMergeTask { end(); break; case inspect: - // here's cast is due to generic's bug - @SuppressWarnings("unchecked") Collection changes = (Collection)intersection.getChangesSubset().values(); - myInteraction.showIntersectedLocalPaths(sorted(getPaths(changes), FilePathByPathComparator.getInstance())); + List intersectedPaths = sorted(getPaths(intersection.getAllChanges()), FilePathByPathComparator.getInstance()); + + myInteraction.showIntersectedLocalPaths(intersectedPaths); end(); break; } @@ -96,7 +94,6 @@ public class LocalChangesPromptTask extends BaseMergeTask { @Nullable private Intersection getChangesIntersection(@NotNull List localChangeLists, @NotNull List changeListsToMerge) { - Set pathsToMerge = collectPaths(changeListsToMerge); return !changeListsToMerge.isEmpty() ? getChangesIntersection(localChangeLists, change -> hasPathToMerge(change, pathsToMerge)) : null; @@ -124,7 +121,7 @@ public class LocalChangesPromptTask extends BaseMergeTask { for (LocalChangeList changeList : changeLists) { for (Change change : changeList.getChanges()) { if (filter.value(change)) { - result.add(changeList.getName(), changeList.getComment(), change); + result.add(changeList, change); } } } 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 03220916e7a8..778a2d411ec0 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ShelveLocalChangesTask.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/integrate/ShelveLocalChangesTask.java @@ -27,7 +27,6 @@ import com.intellij.util.continuation.Where; import org.jetbrains.annotations.NotNull; import java.io.IOException; -import java.util.Collection; import java.util.List; import java.util.Map; @@ -58,7 +57,7 @@ public class ShelveLocalChangesTask extends BaseMergeTask { List changedFiles = newArrayList(); ShelveChangesManager shelveManager = ShelveChangesManager.getInstance(myMergeContext.getProject()); - for (Map.Entry> entry : myIntersection.getChangesSubset().entrySet()) { + for (Map.Entry> entry : myIntersection.getChangesByLists().entrySet()) { try { // TODO: Could this be done once before for loop? saveAllDocuments();