From 5c3bdfbc02e7d394816dc1455bff1ae99a448341 Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Tue, 23 Oct 2018 15:33:05 +0300 Subject: [PATCH] shelf: cleanUp - extract shelf delete logic to ShelveChangesManager --- .../changes/shelf/ShelveChangesManager.java | 60 +++++++++++++++++ .../shelf/ShelvedChangesViewManager.java | 65 ++++--------------- 2 files changed, 71 insertions(+), 54 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java index f78ee56e16fe..9bf4e2c81df4 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java @@ -42,6 +42,7 @@ import com.intellij.util.messages.Topic; import com.intellij.util.text.CharArrayCharSequence; import com.intellij.util.ui.UIUtil; import com.intellij.vcsUtil.FilesProgress; +import com.intellij.vcsUtil.VcsImplUtil; import com.intellij.vcsUtil.VcsUtil; import org.jdom.Element; import org.jdom.Parent; @@ -688,6 +689,65 @@ public class ShelveChangesManager implements JDOMExternalizable, ProjectComponen }); } + @NotNull + Map deleteShelves(@NotNull List shelvedListsToDelete, + @NotNull List shelvedListsFromChanges, + @NotNull List changesToDelete, + @NotNull List binariesToDelete) { + // filter changes + ArrayList shelvedListsFromChangesToDelete = newArrayList(shelvedListsFromChanges); + shelvedListsFromChangesToDelete.removeAll(shelvedListsToDelete); + + if (shelvedListsFromChangesToDelete.size() + binariesToDelete.size() == 0 && shelvedListsToDelete.isEmpty()) { + return Collections.emptyMap(); + } + + //store original dates to restore if needed + Map createdDeletedListsWithOriginalDate = newHashMap(); + for (ShelvedChangeList changeList : shelvedListsToDelete) { + Date originalDate = changeList.DATE; + ShelvedChangeList recentlyDeleted = deleteChangeList(changeList); + //was not completely deleted + if (recentlyDeleted != null) { + createdDeletedListsWithOriginalDate.put(recentlyDeleted, originalDate); + } + } + for (ShelvedChangeList list : shelvedListsFromChangesToDelete) { + Date originalDate = list.DATE; + ShelvedChangeList listWithDeletedChanges = removeChangesFromChangeList(list, changesToDelete, binariesToDelete); + if (listWithDeletedChanges != null) { + createdDeletedListsWithOriginalDate.put(listWithDeletedChanges, originalDate); + } + } + return createdDeletedListsWithOriginalDate; + } + + @Nullable + private ShelvedChangeList removeChangesFromChangeList(@NotNull ShelvedChangeList list, + @NotNull List changes, + @NotNull List binaryFiles) { + final ArrayList remainingBinaries = new ArrayList<>(list.getBinaryFiles()); + remainingBinaries.removeAll(binaryFiles); + + final CommitContext commitContext = new CommitContext(); + final List remainingPatches = new ArrayList<>(); + try { + loadTextPatches(myProject, list, changes, remainingPatches, commitContext); + } + catch (IOException | PatchSyntaxException e) { + LOG.info(e); + VcsImplUtil.showErrorMessage(myProject, e.getMessage(), "Cannot delete files from " + list.DESCRIPTION); + return null; + } + if (remainingPatches.isEmpty() && remainingBinaries.isEmpty()) { + return deleteChangeList(list); + } + else { + return saveRemainingPatches(list, remainingPatches, remainingBinaries, commitContext, true); + } + } + + static List loadTextPatches(final Project project, final ShelvedChangeList changeList, final List changes, diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelvedChangesViewManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelvedChangesViewManager.java index 2127025a04ab..d3515703e305 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelvedChangesViewManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelvedChangesViewManager.java @@ -19,8 +19,6 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.diff.impl.patch.FilePatch; -import com.intellij.openapi.diff.impl.patch.PatchSyntaxException; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; @@ -34,7 +32,10 @@ import com.intellij.openapi.util.Couple; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.*; -import com.intellij.openapi.vcs.changes.*; +import com.intellij.openapi.vcs.changes.Change; +import com.intellij.openapi.vcs.changes.DiffPreviewUpdateProcessor; +import com.intellij.openapi.vcs.changes.DnDActivateOnHoldTargetContent; +import com.intellij.openapi.vcs.changes.PreviewDiffSplitterComponent; import com.intellij.openapi.vcs.changes.actions.ShowDiffPreviewAction; import com.intellij.openapi.vcs.changes.issueLinks.IssueLinkRenderer; import com.intellij.openapi.vcs.changes.issueLinks.TreeLinkMouseListener; @@ -59,7 +60,6 @@ import com.intellij.util.ui.GraphicsUtil; import com.intellij.util.ui.tree.TreeUtil; import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.Update; -import com.intellij.vcsUtil.VcsImplUtil; import com.intellij.vcsUtil.VcsUtil; import one.util.streamex.StreamEx; import org.jetbrains.annotations.CalledInAwt; @@ -94,9 +94,9 @@ public class ShelvedChangesViewManager implements Disposable { private final ChangesViewContentManager myContentManager; private final ShelveChangesManager myShelveChangesManager; private final Project myProject; - private final ShelfTree myTree; + final ShelfTree myTree; private MyShelfContent myContent = null; - private final DeleteProvider myDeleteProvider = new MyShelveDeleteProvider(); + final DeleteProvider myDeleteProvider = new MyShelveDeleteProvider(); private final MergingUpdateQueue myUpdateQueue; private final VcsConfiguration myVcsConfiguration; @@ -613,32 +613,15 @@ public class ShelvedChangesViewManager implements Disposable { if (project == null) return; List shelvedListsToDelete = TreeUtil.collectSelectedObjectsOfType(myTree, ShelvedChangeList.class); - ArrayList shelvedListsFromChanges = newArrayList(getShelvedLists(dataContext)); - // filter changes - shelvedListsFromChanges.removeAll(shelvedListsToDelete); + List changesToDelete = getChangesNotInLists(shelvedListsToDelete, getShelveChanges(dataContext)); List binariesToDelete = getBinariesNotInLists(shelvedListsToDelete, getBinaryShelveChanges(dataContext)); int fileListSize = binariesToDelete.size() + changesToDelete.size(); - if (fileListSize == 0 && shelvedListsToDelete.isEmpty()) return; - - Map createdDeletedListsWithOriginalDate = newHashMap(); - for (ShelvedChangeList changeList : shelvedListsToDelete) { - Date originalDate = changeList.DATE; - ShelvedChangeList recentlyDeleted = ShelveChangesManager.getInstance(myProject).deleteChangeList(changeList); - if (recentlyDeleted != null) { - createdDeletedListsWithOriginalDate.put(recentlyDeleted, originalDate); - } - } - for (ShelvedChangeList list : shelvedListsFromChanges) { - Date originalDate = list.DATE; - ShelvedChangeList listWithDeletedChanges = removeChangesFromChangeList(project, list, changesToDelete, binariesToDelete); - if (listWithDeletedChanges != null) { - createdDeletedListsWithOriginalDate.put(listWithDeletedChanges, originalDate); - } - } - if (!createdDeletedListsWithOriginalDate.isEmpty()) { - showUndoDeleteNotification(shelvedListsToDelete, fileListSize, createdDeletedListsWithOriginalDate); + Map createdDeletedListsWithOriginalDates = + myShelveChangesManager.deleteShelves(shelvedListsToDelete, getShelvedLists(dataContext), changesToDelete, binariesToDelete); + if (!createdDeletedListsWithOriginalDates.isEmpty()) { + showUndoDeleteNotification(shelvedListsToDelete, fileListSize, createdDeletedListsWithOriginalDates); } } @@ -710,32 +693,6 @@ public class ShelvedChangesViewManager implements Disposable { return (size == 1 ? "one" : size) + StringUtil.pluralize(" file", size); } - @Nullable - private ShelvedChangeList removeChangesFromChangeList(@NotNull Project project, - @NotNull ShelvedChangeList list, - @NotNull List changes, - @NotNull List binaryFiles) { - final ArrayList remainingBinaries = new ArrayList<>(list.getBinaryFiles()); - remainingBinaries.removeAll(binaryFiles); - - final CommitContext commitContext = new CommitContext(); - final List remainingPatches = new ArrayList<>(); - try { - ShelveChangesManager.loadTextPatches(myProject, list, changes, remainingPatches, commitContext); - } - catch (IOException | PatchSyntaxException e) { - LOG.info(e); - VcsImplUtil.showErrorMessage(myProject, e.getMessage(), "Cannot delete files from " + list.DESCRIPTION); - return null; - } - if (remainingPatches.isEmpty() && remainingBinaries.isEmpty()) { - return myShelveChangesManager.deleteChangeList(list); - } - else { - return myShelveChangesManager.saveRemainingPatches(list, remainingPatches, remainingBinaries, commitContext, true); - } - } - @Override public boolean canDeleteElement(@NotNull DataContext dataContext) { return !getShelvedLists(dataContext).isEmpty();