shelf: refactoring - update and reuse createChangelistCopy method, remove old

* copy binary resources;
* rename local vars;
* update migration test;

GitOrigin-RevId: b3857465b21f331a7c02ea64934cf76ff7ce1edb
This commit is contained in:
Nadya Zabrodina
2019-06-09 10:12:22 +03:00
committed by intellij-monorepo-bot
parent bc0d0a4894
commit da1723b438
4 changed files with 41 additions and 71 deletions
@@ -33,10 +33,7 @@ import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.project.ProjectKt;
import com.intellij.util.Consumer;
import com.intellij.util.ObjectUtils;
import com.intellij.util.PathUtil;
import com.intellij.util.SmartList;
import com.intellij.util.*;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.messages.MessageBus;
import com.intellij.util.messages.Topic;
@@ -245,13 +242,15 @@ public class ShelveChangesManager implements PersistentStateComponent<Element>,
public void run(@NotNull ProgressIndicator indicator) {
for (ShelvedChangeList list : mySchemeManager.getAllSchemes()) {
if (!list.isValid()) continue;
ShelvedChangeList migratedList = ShelvedChangeList.copy(list);
//find new name;
File newTargetDirectory = suggestPatchName(myProject, migratedList.DESCRIPTION, toFile, "");
migrateResourcesTo(migratedList, newTargetDirectory, false);
newSchemeManager.addScheme(migratedList, false);
// migrate resources and scheme path
indicator.checkCanceled();
try {
File newTargetDirectory = suggestPatchName(myProject, list.DESCRIPTION, toFile, "");
ShelvedChangeList migratedList = createChangelistCopy(list, newTargetDirectory);
newSchemeManager.addScheme(migratedList, false);
indicator.checkCanceled();
}
catch (IOException e) {
LOG.error("Can't copy patch file: " + list.PATH);
}
}
clearShelvedLists(mySchemeManager.getAllSchemes(), false);
}
@@ -332,26 +331,8 @@ public class ShelveChangesManager implements PersistentStateComponent<Element>,
}
@NotNull
static Collection<String> migrateResourcesTo(@NotNull ShelvedChangeList list,
@NotNull File targetDirectory,
boolean deleteOld) {
Collection<String> nonMigratedPaths = new ArrayList<>();
//try to copy/move .patch file
File patchFile = new File(list.PATH);
if (patchFile.exists()) {
File newPatchFile = getPatchFileInConfigDir(targetDirectory);
try {
FileUtil.copy(patchFile, newPatchFile);
list.PATH = toSystemIndependentName(newPatchFile.getPath());
if (deleteOld) {
FileUtil.delete(patchFile);
}
}
catch (IOException e) {
nonMigratedPaths.add(list.PATH);
}
}
private static List<ShelvedBinaryFile> copyBinaryFiles(@NotNull ShelvedChangeList list, @NotNull File targetDirectory) {
List<ShelvedBinaryFile> copied = new ArrayList<>();
for (ShelvedBinaryFile file : list.getBinaryFiles()) {
if (file.SHELVED_PATH != null) {
File shelvedFile = new File(file.SHELVED_PATH);
@@ -359,18 +340,15 @@ public class ShelveChangesManager implements PersistentStateComponent<Element>,
File newShelvedFile = new File(targetDirectory, PathUtil.getFileName(file.AFTER_PATH));
try {
FileUtil.copy(shelvedFile, newShelvedFile);
file.SHELVED_PATH = toSystemIndependentName(newShelvedFile.getPath());
if (deleteOld) {
FileUtil.delete(shelvedFile);
}
copied.add(new ShelvedBinaryFile(file.BEFORE_PATH, file.AFTER_PATH, toSystemIndependentName(newShelvedFile.getPath())));
}
catch (IOException e) {
nonMigratedPaths.add(shelvedFile.getPath());
LOG.error("Can't copy binary file: " + list.PATH);
}
}
}
}
return nonMigratedPaths;
return copied;
}
@NotNull
@@ -1071,7 +1049,8 @@ public class ShelveChangesManager implements PersistentStateComponent<Element>,
boolean delete) {
try {
ShelvedChangeList listCopy = createChangelistCopy(changeList);
ShelvedChangeList listCopy = createChangelistCopy(changeList, generateUniqueSchemePatchDir(changeList.DESCRIPTION, true));
listCopy.updateDate();
saveRemainingChangesInList(changeList, remainingPatches, remainingBinaries, commitContext);
removeFromList(listCopy, changeList.getChanges(myProject), changeList.getBinaryFiles());
@@ -1099,7 +1078,7 @@ public class ShelveChangesManager implements PersistentStateComponent<Element>,
changeList.clearLoadedChanges();
}
private void saveListAsScheme(@NotNull ShelvedChangeList list) {
void saveListAsScheme(@NotNull ShelvedChangeList list) {
if (!list.getBinaryFiles().isEmpty() ||
!list.getChanges(myProject).isEmpty()) {
// all newly create ShelvedChangeList have to be added to SchemesManger as new scheme
@@ -1108,14 +1087,19 @@ public class ShelveChangesManager implements PersistentStateComponent<Element>,
}
@NotNull
private ShelvedChangeList createChangelistCopy(@NotNull ShelvedChangeList changeList) throws IOException {
final File newPatchDir = generateUniqueSchemePatchDir(changeList.DESCRIPTION, true);
final File newPath = getPatchFileInConfigDir(newPatchDir);
ShelvedChangeList createChangelistCopy(@NotNull ShelvedChangeList changeList, @NotNull File targetDir)
throws IOException {
final File newPath = getPatchFileInConfigDir(targetDir);
FileUtil.copy(new File(changeList.PATH), newPath);
final ShelvedChangeList listCopy = new ShelvedChangeList(newPath.getAbsolutePath(), changeList.DESCRIPTION,
new ArrayList<>(changeList.getBinaryFiles()));
final ShelvedChangeList listCopy =
new ShelvedChangeList(newPath.getAbsolutePath(), changeList.DESCRIPTION, copyBinaryFiles(changeList, targetDir),
changeList.DATE.getTime());
listCopy.markToDelete(changeList.isMarkedToDelete());
listCopy.setName(newPatchDir.getName());
listCopy.setRecycled(changeList.isRecycled());
listCopy.setDeleted(changeList.isDeleted());
listCopy.setName(targetDir.getName());
//load changes
listCopy.getChanges(myProject);
return listCopy;
}
@@ -1140,7 +1124,7 @@ public class ShelveChangesManager implements PersistentStateComponent<Element>,
clearShelvedLists(getRecycledShelvedChangeLists(), true);
}
private void clearShelvedLists(@NotNull List<? extends ShelvedChangeList> shelvedLists, boolean updateView) {
void clearShelvedLists(@NotNull List<? extends ShelvedChangeList> shelvedLists, boolean updateView) {
if (shelvedLists.isEmpty()) return;
for (ShelvedChangeList list : shelvedLists) {
deleteResources(list);
@@ -70,22 +70,6 @@ public class ShelvedChangeList implements JDOMExternalizable, ExternalizableSche
mySchemeName = DESCRIPTION;
}
static ShelvedChangeList copy(@NotNull ShelvedChangeList list) {
ShelvedChangeList copied = new ShelvedChangeList();
copied.PATH = list.PATH;
copied.DESCRIPTION = list.DESCRIPTION;
copied.DATE = list.DATE;
copied.myBinaryFiles = new ArrayList<>();
for (ShelvedBinaryFile file : list.getBinaryFiles()) {
copied.myBinaryFiles.add(new ShelvedBinaryFile(file.BEFORE_PATH, file.AFTER_PATH, file.SHELVED_PATH));
}
copied.mySchemeName = list.DESCRIPTION;
copied.myRecycled = list.isRecycled();
copied.myToDelete = list.isMarkedToDelete();
copied.myIsDeleted = list.isDeleted();
return copied;
}
public boolean isRecycled() {
return myRecycled;
}
@@ -1,4 +1,4 @@
<changelist name="test" date="1432034020315" recycled="false">
<changelist name="test2" date="1432034020315" recycled="false">
<option name="PATH" value="$PROJECT_DIR$/.shelf/test/shelved.patch" />
<option name="DESCRIPTION" value="test" />
<binary>
@@ -12,8 +12,10 @@ import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import static com.intellij.openapi.vcs.changes.shelf.ShelveChangesManager.migrateResourcesTo;
import static com.intellij.openapi.vcs.changes.shelf.ShelveChangesManager.getInstance;
public class ShelveChangesManagerMigrationTest extends PlatformTestCase {
@@ -55,26 +57,26 @@ public class ShelveChangesManagerMigrationTest extends PlatformTestCase {
File beforeXmlInfo = new File(testDataPath, "before.xml");
assert (beforeXmlInfo.exists());
Element element = JDOMUtil.load(beforeXmlInfo);
ShelveChangesManager shelveChangesManager = ShelveChangesManager.getInstance(myProject);
ShelveChangesManager shelveChangesManager = getInstance(myProject);
shelveChangesManager.loadState(element);
if (migrateResources) {
checkAndMigrateOldPatchResourcesToNewSchemeStorage(shelveChangesManager);
}
shelfDir.refresh(false, true);
PlatformTestUtil.saveProject(myProject);
shelfDir.refresh(false, true);
PlatformTestUtil.assertDirectoriesEqual(afterDir, shelfDir);
}
/**
* Should be called only once: when Settings Repository plugin runs first time
*/
private static void checkAndMigrateOldPatchResourcesToNewSchemeStorage(@NotNull ShelveChangesManager shelveChangesManager) {
private static void checkAndMigrateOldPatchResourcesToNewSchemeStorage(@NotNull ShelveChangesManager shelveChangesManager)
throws IOException {
for (ShelvedChangeList list : shelveChangesManager.getAllLists()) {
File newPatchDir = new File(shelveChangesManager.getShelfResourcesDirectory(), list.getName());
// it should be enough for migration to check if resource directory exists. If any bugs appeared add isAncestor checks for each path
if (!newPatchDir.exists() && newPatchDir.mkdirs()) {
migrateResourcesTo(list, newPatchDir, true);
}
ShelvedChangeList migrated = shelveChangesManager.createChangelistCopy(list, newPatchDir);
shelveChangesManager.saveListAsScheme(migrated);
shelveChangesManager.clearShelvedLists(Collections.singletonList(list), false);
}
}
}