diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsShelveUtils.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsShelveUtils.java index 91c072e1ea61..4ebc21b28992 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsShelveUtils.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsShelveUtils.java @@ -28,6 +28,7 @@ import java.io.IOException; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Objects; public class VcsShelveUtils { private static final Logger LOG = Logger.getInstance(VcsShelveUtils.class.getName()); @@ -41,7 +42,9 @@ public class VcsShelveUtils { VirtualFile baseDir = project.getBaseDir(); assert baseDir != null; final String projectPath = baseDir.getPath() + "/"; - final List changes = shelvedChangeList.getChanges(project); + + shelvedChangeList.loadChangesIfNeeded(project); + final List changes = Objects.requireNonNull(shelvedChangeList.getChanges()); List binaryFiles = shelvedChangeList.getBinaryFiles(); LOG.info("refreshing files "); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/DiffShelvedChangesActionProvider.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/DiffShelvedChangesActionProvider.java index 17823949a17d..1539859990d7 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/DiffShelvedChangesActionProvider.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/DiffShelvedChangesActionProvider.java @@ -99,7 +99,7 @@ public class DiffShelvedChangesActionProvider implements AnActionExtensionProvid List changeLists = ShelvedChangesViewManager.getShelvedLists(dc); ShelvedChangeList changeList = assertNotNull(ContainerUtil.getFirstItem(changeLists)); - final List textChanges = changeList.getChanges(project); + final List textChanges = Objects.requireNonNull(changeList.getChanges()); final List binaryChanges = changeList.getBinaryFiles(); final List diffRequestProducers = new ArrayList<>(); 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 2febdc3ce595..48824cfccde5 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 @@ -35,6 +35,7 @@ import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.project.ProjectKt; import com.intellij.util.*; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.Topic; import com.intellij.util.text.CharArrayCharSequence; @@ -66,9 +67,11 @@ import static com.intellij.openapi.util.io.FileUtil.toSystemIndependentName; import static com.intellij.openapi.util.text.StringUtil.notNullize; import static com.intellij.openapi.vcs.changes.ChangeListUtil.getChangeListNameForUnshelve; import static com.intellij.openapi.vcs.changes.ChangeListUtil.getPredefinedChangeList; +import static com.intellij.openapi.vcs.changes.shelf.ShelvedChangeList.createShelvedChangesFromFilePatches; import static com.intellij.util.ObjectUtils.assertNotNull; import static com.intellij.util.ObjectUtils.chooseNotNull; import static com.intellij.util.containers.ContainerUtil.*; +import static java.util.Objects.requireNonNull; @State(name = "ShelveChangesManager", storages = {@Storage(StoragePathMacros.WORKSPACE_FILE)}) public class ShelveChangesManager implements PersistentStateComponent, ProjectComponent { @@ -244,7 +247,7 @@ public class ShelveChangesManager implements PersistentStateComponent, if (!list.isValid()) continue; try { File newTargetDirectory = suggestPatchName(myProject, list.DESCRIPTION, toFile, ""); - ShelvedChangeList migratedList = createChangelistCopy(list, newTargetDirectory); + ShelvedChangeList migratedList = createChangelistCopyWithChanges(list, newTargetDirectory); newSchemeManager.addScheme(migratedList, false); indicator.checkCanceled(); } @@ -435,7 +438,9 @@ public class ShelveChangesManager implements PersistentStateComponent, baseRevisionsOfDvcsIntoContext(textChanges, commitContext); ShelfFileProcessorUtil.savePatchFile(myProject, patchFile, patches, null, commitContext); - final ShelvedChangeList changeList = new ShelvedChangeList(patchFile.toString(), commitMessage.replace('\n', ' '), binaryFiles); + final ShelvedChangeList changeList = new ShelvedChangeList(patchFile.toString(), commitMessage.replace('\n', ' '), binaryFiles, + createShelvedChangesFromFilePatches(myProject, patchFile.toString(), + patches)); changeList.markToDelete(markToBeDeleted); changeList.setName(schemePatchDir.getName()); ProgressManager.checkCanceled(); @@ -485,7 +490,9 @@ public class ShelveChangesManager implements PersistentStateComponent, File schemePatchDir = generateUniqueSchemePatchDir(fileName, true); File patchFile = getPatchFileInConfigDir(schemePatchDir); ShelfFileProcessorUtil.savePatchFile(myProject, patchFile, patches, patchTransitExtensions, new CommitContext()); - final ShelvedChangeList changeList = new ShelvedChangeList(patchFile.toString(), fileName.replace('\n', ' '), new SmartList<>()); + final ShelvedChangeList changeList = new ShelvedChangeList(patchFile.toString(), fileName.replace('\n', ' '), new SmartList<>(), + createShelvedChangesFromFilePatches(myProject, patchFile.getPath(), + patches)); changeList.setName(schemePatchDir.getName()); mySchemeManager.addScheme(changeList, false); return changeList; @@ -514,6 +521,7 @@ public class ShelveChangesManager implements PersistentStateComponent, return result; } + @CalledInBackground public List importChangeLists(final Collection files, final Consumer exceptionConsumer) { final List result = new ArrayList<>(files.size()); @@ -523,20 +531,22 @@ public class ShelveChangesManager implements PersistentStateComponent, filesProgress.updateIndicator(file); final String description = file.getNameWithoutExtension().replace('_', ' '); File schemeNameDir = generateUniqueSchemePatchDir(description, true); - final File patchPath = getPatchFileInConfigDir(schemeNameDir); - final ShelvedChangeList list = new ShelvedChangeList(patchPath.getPath(), description, new SmartList<>(), - file.getTimeStamp()); - list.setName(schemeNameDir.getName()); + final File patchFile = getPatchFileInConfigDir(schemeNameDir); + String patchPath = patchFile.getPath(); try { - final List patchesList = loadPatches(myProject, file.getPath(), new CommitContext()); - if (!patchesList.isEmpty()) { - FileUtil.copy(new File(file.getPath()), patchPath); - // add only if ok to read patch + List filePatches = loadPatchesWithoutContent(myProject, patchPath, new CommitContext()); + if (!filePatches.isEmpty()) { + FileUtil.copy(new File(file.getPath()), patchFile); + final ShelvedChangeList list = + new ShelvedChangeList(patchPath, description, new SmartList<>(), + createShelvedChangesFromFilePatches(myProject, patchPath, filePatches), + file.getTimeStamp()); + list.setName(schemeNameDir.getName()); mySchemeManager.addScheme(list, false); result.add(list); } } - catch (IOException | PatchSyntaxException e) { + catch (Exception e) { exceptionConsumer.consume(new VcsException(e)); } } @@ -930,7 +940,7 @@ public class ShelveChangesManager implements PersistentStateComponent, public void run(@NotNull ProgressIndicator indicator) { for (ShelvedChangeList changeList : selectedChangeLists) { List changesForChangelist = - new ArrayList<>(intersection(changeList.getChanges(myProject), selectedChanges)); + new ArrayList<>(intersection(requireNonNull(changeList.getChanges()), selectedChanges)); List binariesForChangelist = new ArrayList<>(intersection(changeList.getBinaryFiles(), selectedBinaryChanges)); boolean shouldUnshelveAllList = changesForChangelist.isEmpty() && binariesForChangelist.isEmpty(); @@ -1049,11 +1059,12 @@ public class ShelveChangesManager implements PersistentStateComponent, boolean delete) { try { - ShelvedChangeList listCopy = createChangelistCopy(changeList, generateUniqueSchemePatchDir(changeList.DESCRIPTION, true)); + ShelvedChangeList listCopy = createChangelistCopyWithChanges(changeList, generateUniqueSchemePatchDir(changeList.DESCRIPTION, true)); listCopy.updateDate(); + //changes should be loaded saveRemainingChangesInList(changeList, remainingPatches, remainingBinaries, commitContext); - removeFromList(listCopy, changeList.getChanges(myProject), changeList.getBinaryFiles()); + removeFromListWithChanges(listCopy, requireNonNull(changeList.getChanges()), changeList.getBinaryFiles()); if (delete) { markChangeListAsDeleted(listCopy); } @@ -1075,31 +1086,30 @@ public class ShelveChangesManager implements PersistentStateComponent, writePatchesToFile(myProject, changeList.PATH, remainingPatches, commitContext); changeList.getBinaryFiles().retainAll(remainingBinaries); - changeList.clearLoadedChanges(); + changeList.setChanges(createShelvedChangesFromFilePatches(myProject, changeList.PATH, remainingPatches)); } void saveListAsScheme(@NotNull ShelvedChangeList list) { - if (!list.getBinaryFiles().isEmpty() || - !list.getChanges(myProject).isEmpty()) { + if (!list.getBinaryFiles().isEmpty() || !isEmpty(list.getChanges())) { // all newly create ShelvedChangeList have to be added to SchemesManger as new scheme mySchemeManager.addScheme(list, false); } } @NotNull - ShelvedChangeList createChangelistCopy(@NotNull ShelvedChangeList changeList, @NotNull File targetDir) + ShelvedChangeList createChangelistCopyWithChanges(@NotNull ShelvedChangeList changeList, @NotNull File targetDir) throws IOException { final File newPath = getPatchFileInConfigDir(targetDir); FileUtil.copy(new File(changeList.PATH), newPath); + changeList.loadChangesIfNeeded(myProject); + final ShelvedChangeList listCopy = new ShelvedChangeList(newPath.getAbsolutePath(), changeList.DESCRIPTION, copyBinaryFiles(changeList, targetDir), - changeList.DATE.getTime()); + ContainerUtilRt.newArrayList(requireNonNull(changeList.getChanges())), changeList.DATE.getTime()); listCopy.markToDelete(changeList.isMarkedToDelete()); listCopy.setRecycled(changeList.isRecycled()); listCopy.setDeleted(changeList.isDeleted()); listCopy.setName(targetDir.getName()); - //load changes - listCopy.getChanges(myProject); return listCopy; } @@ -1140,9 +1150,10 @@ public class ShelveChangesManager implements PersistentStateComponent, return new HashSet<>(ContainerUtil.notNullize(myShelvingFiles)); } - private void removeFromList(@NotNull final ShelvedChangeList listCopy, - @NotNull List shelvedChanges, - @NotNull List shelvedBinaryChanges) { + private void removeFromListWithChanges(@NotNull final ShelvedChangeList listCopy, + @NotNull List shelvedChanges, + @NotNull List shelvedBinaryChanges) { + //listCopy should contain loaded changes removeBinaries(listCopy, shelvedBinaryChanges); removeChanges(listCopy, shelvedChanges); @@ -1151,7 +1162,7 @@ public class ShelveChangesManager implements PersistentStateComponent, final CommitContext commitContext = new CommitContext(); final List patches = new ArrayList<>(); List filePatches = loadPatches(myProject, listCopy.PATH, commitContext); - for (ShelvedChange change : Objects.requireNonNull(listCopy.getChanges(myProject))) { + for (ShelvedChange change : requireNonNull(listCopy.getChanges())) { patches.add(find(filePatches, patch -> change.getBeforePath().equals(patch.getBeforeName()))); } writePatchesToFile(myProject, listCopy.PATH, patches, commitContext); @@ -1162,8 +1173,8 @@ public class ShelveChangesManager implements PersistentStateComponent, } } - private void removeChanges(@NotNull ShelvedChangeList list, @NotNull List shelvedChanges) { - for (Iterator iterator = list.getChanges(myProject).iterator(); iterator.hasNext(); ) { + private static void removeChanges(@NotNull ShelvedChangeList list, @NotNull List shelvedChanges) { + for (Iterator iterator = requireNonNull(list.getChanges()).iterator(); iterator.hasNext(); ) { final ShelvedChange change = iterator.next(); for (ShelvedChange newChange : shelvedChanges) { if (Comparing.equal(change.getBeforePath(), newChange.getBeforePath()) && diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelvedChangeList.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelvedChangeList.java index 780f0761fe04..baba3bbc7b34 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelvedChangeList.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelvedChangeList.java @@ -29,9 +29,11 @@ import com.intellij.openapi.vcs.FileStatus; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.List; @@ -48,26 +50,34 @@ public class ShelvedChangeList implements JDOMExternalizable, ExternalizableSche public String PATH; public String DESCRIPTION; public Date DATE; - private List myChanges; + private volatile List myChanges; private List myBinaryFiles; private boolean myRecycled; private boolean myToDelete; private boolean myIsDeleted; private String mySchemeName; - public ShelvedChangeList() { + ShelvedChangeList() { } - public ShelvedChangeList(final String path, final String description, final List binaryFiles) { - this(path, description, binaryFiles, System.currentTimeMillis()); + public ShelvedChangeList(final String path, + final String description, + final List binaryFiles, + @NotNull List shelvedChanges) { + this(path, description, binaryFiles, shelvedChanges, System.currentTimeMillis()); } - public ShelvedChangeList(final String path, final String description, final List binaryFiles, final long time) { + ShelvedChangeList(final String path, + final String description, + final List binaryFiles, + @NotNull List shelvedChanges, + final long time) { PATH = FileUtil.toSystemIndependentName(path); DESCRIPTION = description; DATE = new Date(time); myBinaryFiles = binaryFiles; mySchemeName = DESCRIPTION; + myChanges = shelvedChanges; } public boolean isRecycled() { @@ -124,34 +134,52 @@ public class ShelvedChangeList implements JDOMExternalizable, ExternalizableSche return DESCRIPTION; } - public List getChanges(Project project) { + public void loadChangesIfNeeded(@NotNull Project project) { if (myChanges == null) { try { - myChanges = new ArrayList<>(); final List list = ShelveChangesManager.loadPatchesWithoutContent(project, PATH, null); - for (FilePatch patch : list) { - FileStatus status; - if (patch.isNewFile()) { - status = FileStatus.ADDED; - } - else if (patch.isDeletedFile()) { - status = FileStatus.DELETED; - } - else { - status = FileStatus.MODIFIED; - } - myChanges.add(new ShelvedChange(project, PATH, patch.getBeforeName(), patch.getAfterName(), status)); - } + myChanges = createShelvedChangesFromFilePatches(project, PATH, list); } catch (Exception e) { LOG.error("Failed to parse the file patch: [" + PATH + "]", e); } } + } + + @Nullable + public List getChanges() { return myChanges; } - public void clearLoadedChanges() { - myChanges = null; + @Deprecated + public List getChanges(Project project) { + loadChangesIfNeeded(project); + return getChanges(); + } + + void setChanges(List shelvedChanges) { + myChanges = shelvedChanges; + } + + @NotNull + static List createShelvedChangesFromFilePatches(@NotNull Project project, + @NotNull String patchPath, + @NotNull Collection filePatches) { + List changes = new ArrayList<>(); + for (FilePatch patch : filePatches) { + FileStatus status; + if (patch.isNewFile()) { + status = FileStatus.ADDED; + } + else if (patch.isDeletedFile()) { + status = FileStatus.DELETED; + } + else { + status = FileStatus.MODIFIED; + } + changes.add(new ShelvedChange(project, patchPath, patch.getBeforeName(), patch.getAfterName(), status)); + } + return changes; } public List getBinaryFiles() { @@ -174,7 +202,7 @@ public class ShelvedChangeList implements JDOMExternalizable, ExternalizableSche } public void markToDelete(boolean toDeleted) { - myToDelete = toDeleted; + myToDelete = toDeleted; } public boolean isMarkedToDelete() { 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 b046628a366f..14e842296bb3 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 @@ -82,6 +82,7 @@ import static com.intellij.util.ObjectUtils.assertNotNull; import static com.intellij.util.containers.ContainerUtil.*; import static com.intellij.util.containers.UtilKt.isEmpty; import static java.util.Comparator.comparing; +import static java.util.Objects.requireNonNull; public class ShelvedChangesViewManager implements Disposable { private static final Logger LOG = Logger.getInstance(ShelvedChangesViewManager.class); @@ -246,10 +247,12 @@ public class ShelvedChangesViewManager implements Disposable { createShelvedListsWithChangesNode(shelvedLists, createTagNode("Recently Deleted")); } + @CalledInBackground private void createShelvedListsWithChangesNode(@NotNull List shelvedLists, @NotNull MutableTreeNode parentNode) { shelvedLists.forEach(changeList -> { List shelvedChanges = new ArrayList<>(); - changeList.getChanges(myProject).stream().map(ShelvedWrapper::new).forEach(shelvedChanges::add); + changeList.loadChangesIfNeeded(myProject); + requireNonNull(changeList.getChanges()).stream().map(ShelvedWrapper::new).forEach(shelvedChanges::add); changeList.getBinaryFiles().stream().map(ShelvedWrapper::new).forEach(shelvedChanges::add); shelvedChanges.sort(comparing(s -> s.getChange(myProject), CHANGE_COMPARATOR)); @@ -542,9 +545,8 @@ public class ShelvedChangesViewManager implements Disposable { private List getChangesNotInLists(@NotNull List listsToDelete, @NotNull List shelvedChanges) { List result = new ArrayList<>(shelvedChanges); - for (ShelvedChangeList list : listsToDelete) { - result.removeAll(list.getChanges(myProject)); - } + // all changes should be loaded because action performed from loaded shelf tab + listsToDelete.stream().map(list -> requireNonNull(list.getChanges())).forEach(result::removeAll); return result; } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/UnshelveWithDialogAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/UnshelveWithDialogAction.java index 0a242a305ebf..c5d0cf27b4f8 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/UnshelveWithDialogAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/UnshelveWithDialogAction.java @@ -44,6 +44,7 @@ import java.awt.event.KeyEvent; import java.io.File; import java.util.Collections; import java.util.List; +import java.util.Objects; import static com.intellij.openapi.vcs.changes.ChangeListUtil.getChangeListNameForUnshelve; import static com.intellij.openapi.vcs.changes.ChangeListUtil.getPredefinedChangeList; @@ -100,8 +101,8 @@ public class UnshelveWithDialogAction extends DumbAwareAction { chooser.getSelectedList()); } - private static boolean hasNotAllSelectedChanges(@NotNull Project project, @NotNull ShelvedChangeList list, @Nullable Change[] changes) { - return changes != null && (list.getChanges(project).size() + list.getBinaryFiles().size()) != changes.length; + private static boolean hasNotAllSelectedChanges(@NotNull ShelvedChangeList list, @Nullable Change[] changes) { + return changes != null && (Objects.requireNonNull(list.getChanges()).size() + list.getBinaryFiles().size()) != changes.length; } @Override @@ -118,7 +119,7 @@ public class UnshelveWithDialogAction extends DumbAwareAction { @Nullable Change[] preselectedChanges) { super(project, new UnshelvePatchDefaultExecutor(project, changeList), Collections.emptyList(), ApplyPatchMode.UNSHELVE, patchFile, null, getPredefinedChangeList(changeList, ChangeListManager.getInstance(project)), binaryShelvedPatches, - hasNotAllSelectedChanges(project, changeList, preselectedChanges) ? newArrayList(preselectedChanges) : null, + hasNotAllSelectedChanges(changeList, preselectedChanges) ? newArrayList(preselectedChanges) : null, getChangeListNameForUnshelve(changeList), true); setOKButtonText(VcsBundle.getString("unshelve.changes.action")); } diff --git a/platform/vcs-tests/testSrc/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManagerMigrationTest.java b/platform/vcs-tests/testSrc/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManagerMigrationTest.java index e326f74e0204..ede77b4d485c 100644 --- a/platform/vcs-tests/testSrc/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManagerMigrationTest.java +++ b/platform/vcs-tests/testSrc/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManagerMigrationTest.java @@ -74,7 +74,7 @@ public class ShelveChangesManagerMigrationTest extends PlatformTestCase { throws IOException { for (ShelvedChangeList list : shelveChangesManager.getAllLists()) { File newPatchDir = new File(shelveChangesManager.getShelfResourcesDirectory(), list.getName()); - ShelvedChangeList migrated = shelveChangesManager.createChangelistCopy(list, newPatchDir); + ShelvedChangeList migrated = shelveChangesManager.createChangelistCopyWithChanges(list, newPatchDir); shelveChangesManager.saveListAsScheme(migrated); shelveChangesManager.clearShelvedLists(Collections.singletonList(list), false); } diff --git a/platform/vcs-tests/testSrc/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManagerTest.kt b/platform/vcs-tests/testSrc/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManagerTest.kt index ef11f8f47e80..346fd7a07d6d 100644 --- a/platform/vcs-tests/testSrc/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManagerTest.kt +++ b/platform/vcs-tests/testSrc/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManagerTest.kt @@ -89,8 +89,9 @@ class ShelveChangesManagerTest : PlatformTestCase() { removeFilesFromShelf: Boolean = true) { myShelvedChangesManager.isRemoveFilesFromShelf = removeFilesFromShelf val shelvedChangeList = myShelvedChangesManager.shelvedChangeLists[0] + shelvedChangeList.loadChangesIfNeeded(project) val originalDate = shelvedChangeList.DATE - val changes = if (changesNum == 0) null else shelvedChangeList.getChanges(myProject).subList(0, changesNum) + val changes = if (changesNum == 0) null else shelvedChangeList.changes!!.subList(0, changesNum) val binaries = if (changesNum == 0) null else shelvedChangeList.binaryFiles.subList(0, binariesNum) myShelvedChangesManager.unshelveChangeList(shelvedChangeList, changes, binaries, null, false) @@ -108,7 +109,8 @@ class ShelveChangesManagerTest : PlatformTestCase() { expectedDeletedNum: Int, undoDeletion: Boolean = false) { val originalDate = shelvedChangeList.DATE - val changes = if (changesNum == 0) emptyList() else shelvedChangeList.getChanges(myProject).subList(0, changesNum) + shelvedChangeList.loadChangesIfNeeded(project) + val changes = if (changesNum == 0) emptyList() else shelvedChangeList.changes!!.subList(0, changesNum) val binaries = if (changesNum == 0) emptyList() else shelvedChangeList.binaryFiles.subList(0, binariesNum) val shouldDeleteEntireList = changesNum == 0 && binariesNum == 0