IDEA-18861 Apply patch: When project/module file has changed, IDEA should ask to reload the project

This commit is contained in:
irengrig
2011-12-27 16:01:28 +04:00
parent 44681c9a95
commit b8939b4e9e
4 changed files with 75 additions and 18 deletions
@@ -18,12 +18,14 @@ package com.intellij.ide.impl;
import com.intellij.CommonBundle;
import com.intellij.ide.GeneralSettings;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.highlighter.InternalFileType;
import com.intellij.ide.highlighter.ProjectFileType;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.components.StorageScheme;
import com.intellij.openapi.components.impl.stores.IProjectStore;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.project.ex.ProjectEx;
@@ -262,4 +264,8 @@ public class ProjectUtil {
IdeFocusManager.getInstance(p).requestFocus(cmd, false);
}
}
public static boolean isProjectOrWorkspaceFile(final VirtualFile file) {
return com.intellij.openapi.project.ProjectUtil.isProjectOrWorkspaceFile(file);
}
}
@@ -30,10 +30,16 @@ import com.intellij.openapi.fileTypes.FileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectUtil;
import com.intellij.openapi.project.ex.ProjectManagerEx;
import com.intellij.openapi.util.EmptyRunnable;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.projectImport.ProjectOpenProcessor;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public interface MergeVersion {
Document createWorkingDocument(Project project);
@@ -91,13 +97,38 @@ public interface MergeVersion {
FileDocumentManager.getInstance().saveDocument(myDocument);
final VirtualFile file = getFile();
reportProjectFileChangeIfNeeded(project, file);
}
public static void reportProjectFileChangeIfNeeded(Project project, VirtualFile file) {
if (file != null) {
if (ProjectUtil.isProjectOrWorkspaceFile(file)) {
if (ProjectUtil.isProjectOrWorkspaceFile(file) || isProjectFile(file)) {
ProjectManagerEx.getInstanceEx().saveChangedProjectFile(file, project);
}
}
}
@Nullable
public static Runnable prepareToReportChangedProjectFiles(final Project project, final Collection<VirtualFile> files) {
final Set<VirtualFile> vfs = new HashSet<VirtualFile>();
for (VirtualFile vf : files) {
if (vf != null) {
if (ProjectUtil.isProjectOrWorkspaceFile(vf) || isProjectFile(vf)) {
vfs.add(vf);
}
}
}
return vfs.isEmpty() ? null : new Runnable() {
@Override
public void run() {
ProjectManagerEx ex = ProjectManagerEx.getInstanceEx();
for (VirtualFile vf : vfs) {
ex.saveChangedProjectFile(vf, project);
}
}
};
}
@Override
public void restoreOriginalContent(final Project project) {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@@ -107,6 +138,11 @@ public interface MergeVersion {
});
}
public static boolean isProjectFile(VirtualFile file) {
final ProjectOpenProcessor importProvider = ProjectOpenProcessor.getImportProvider(file);
return importProvider != null && importProvider.lookForProjectsInDirectory();
}
protected void doRestoreOriginalContent(Project project) {
setDocumentText(myDocument, myTextBeforeMerge, "", project);
}
@@ -18,6 +18,7 @@ package com.intellij.openapi.diff.impl.patch.formove;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.diff.impl.mergeTool.MergeVersion;
import com.intellij.openapi.diff.impl.patch.ApplyPatchContext;
import com.intellij.openapi.diff.impl.patch.ApplyPatchStatus;
import com.intellij.openapi.diff.impl.patch.FilePatch;
@@ -33,10 +34,7 @@ import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.FilePathImpl;
import com.intellij.openapi.vcs.VcsBundle;
import com.intellij.openapi.vcs.VcsFileListenerContextHelper;
import com.intellij.openapi.vcs.*;
import com.intellij.openapi.vcs.changes.*;
import com.intellij.openapi.vcs.changes.patch.ApplyPatchAction;
import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier;
@@ -45,12 +43,14 @@ import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.RefreshQueue;
import com.intellij.openapi.vfs.newvfs.RefreshSession;
import com.intellij.ui.GuiUtils;
import com.intellij.util.Consumer;
import com.intellij.util.WaitForProgressToShow;
import com.intellij.util.continuation.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.io.IOException;
import java.util.*;
@@ -289,7 +289,7 @@ public class PatchApplier<BinaryType extends FilePatch> {
}
}
protected void refreshFiles(final Collection<FilePath> additionalDirectly, @Nullable final ContinuationPause context) {
protected void refreshFiles(final Collection<FilePath> additionalDirectly, @Nullable final ContinuationContext context) {
final List<FilePath> directlyAffected = myVerifier.getDirectlyAffected();
final List<VirtualFile> indirectlyAffected = myVerifier.getAllAffected();
directlyAffected.addAll(additionalDirectly);
@@ -305,11 +305,32 @@ public class PatchApplier<BinaryType extends FilePatch> {
return myVerifier.getAllAffected();
}
public static void refreshPassedFilesAndMoveToChangelist(final Project project, final ContinuationPause context,
public static void refreshPassedFilesAndMoveToChangelist(final Project project, final ContinuationContext context,
final Collection<FilePath> directlyAffected, final Collection<VirtualFile> indirectlyAffected, final Consumer<Collection<FilePath>> targetChangelistMover) {
if (context != null) {
context.suspend();
}
final Runnable projectFilesReload =
MergeVersion.MergeDocumentVersion.prepareToReportChangedProjectFiles(project, ObjectsConvertor.fp2vf(directlyAffected));
final TaskDescriptor projectFilesReloadTaskDescriptor = projectFilesReload == null ? null : new TaskDescriptor("", Where.AWT) {
@Override
public void run(final ContinuationContext context) {
projectFilesReload.run();
}
};
final Runnable scheduleProjectFilesReload = new Runnable() {
public void run() {
if (projectFilesReloadTaskDescriptor != null) {
if (context != null) {
context.last(projectFilesReloadTaskDescriptor);
} else {
SwingUtilities.invokeLater(projectFilesReload);
}
}
}
};
final RefreshSession session = RefreshQueue.getInstance().createSession(false, true, new Runnable() {
public void run() {
if (project.isDisposed()) return;
@@ -322,6 +343,7 @@ public class PatchApplier<BinaryType extends FilePatch> {
if (targetChangelistMover != null) {
targetChangelistMover.consume(directlyAffected);
}
scheduleProjectFilesReload.run();
if (context != null) {
context.ping();
}
@@ -338,6 +360,7 @@ public class PatchApplier<BinaryType extends FilePatch> {
final VcsDirtyScopeManager vcsDirtyScopeManager = VcsDirtyScopeManager.getInstance(project);
// will schedule update
vcsDirtyScopeManager.filePathsDirty(directlyAffected, null);
scheduleProjectFilesReload.run();
if (context != null) {
context.ping();
}
@@ -17,12 +17,14 @@
package com.intellij.openapi.vcs.merge;
import com.intellij.CommonBundle;
import com.intellij.ide.impl.ProjectUtil;
import com.intellij.ide.presentation.VirtualFilePresentation;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diff.ActionButtonPresentation;
import com.intellij.openapi.diff.DiffManager;
import com.intellij.openapi.diff.DiffRequestFactory;
import com.intellij.openapi.diff.MergeRequest;
import com.intellij.openapi.diff.impl.mergeTool.MergeVersion;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.project.Project;
@@ -323,17 +325,7 @@ public class MultipleFileMergeDialog extends DialogWrapper {
}
private void checkMarkModifiedProject(final VirtualFile file) {
if (file.getFileType() == StdFileTypes.IDEA_MODULE ||
file.getFileType() == StdFileTypes.IDEA_PROJECT ||
file.getFileType() == StdFileTypes.IDEA_WORKSPACE ||
isProjectFile(file)) {
myProjectManager.saveChangedProjectFile(file, myProject);
}
}
private static boolean isProjectFile(VirtualFile file) {
final ProjectOpenProcessor importProvider = ProjectOpenProcessor.getImportProvider(file);
return importProvider != null && importProvider.lookForProjectsInDirectory();
MergeVersion.MergeDocumentVersion.reportProjectFileChangeIfNeeded(myProject, file);
}
private static String decodeContent(final VirtualFile file, final byte[] content) {