From b8939b4e9e88458616e0927ebc99c68990a71064 Mon Sep 17 00:00:00 2001 From: irengrig Date: Tue, 27 Dec 2011 16:01:28 +0400 Subject: [PATCH] IDEA-18861 Apply patch: When project/module file has changed, IDEA should ask to reload the project --- .../com/intellij/ide/impl/ProjectUtil.java | 6 +++ .../diff/impl/mergeTool/MergeVersion.java | 38 ++++++++++++++++++- .../diff/impl/patch/formove/PatchApplier.java | 35 ++++++++++++++--- .../vcs/merge/MultipleFileMergeDialog.java | 14 ++----- 4 files changed, 75 insertions(+), 18 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java b/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java index 13f8e8ed2cc3..f304cf85b715 100644 --- a/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java +++ b/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java @@ -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); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeVersion.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeVersion.java index 5fb199d9bfdb..3e73523eb032 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeVersion.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeVersion.java @@ -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 files) { + final Set vfs = new HashSet(); + 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); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PatchApplier.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PatchApplier.java index 4d7da2e5d131..87c12abf6c76 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PatchApplier.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PatchApplier.java @@ -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 { } } - protected void refreshFiles(final Collection additionalDirectly, @Nullable final ContinuationPause context) { + protected void refreshFiles(final Collection additionalDirectly, @Nullable final ContinuationContext context) { final List directlyAffected = myVerifier.getDirectlyAffected(); final List indirectlyAffected = myVerifier.getAllAffected(); directlyAffected.addAll(additionalDirectly); @@ -305,11 +305,32 @@ public class PatchApplier { 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 directlyAffected, final Collection indirectlyAffected, final Consumer> 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 { if (targetChangelistMover != null) { targetChangelistMover.consume(directlyAffected); } + scheduleProjectFilesReload.run(); if (context != null) { context.ping(); } @@ -338,6 +360,7 @@ public class PatchApplier { final VcsDirtyScopeManager vcsDirtyScopeManager = VcsDirtyScopeManager.getInstance(project); // will schedule update vcsDirtyScopeManager.filePathsDirty(directlyAffected, null); + scheduleProjectFilesReload.run(); if (context != null) { context.ping(); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/merge/MultipleFileMergeDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/merge/MultipleFileMergeDialog.java index 8bd7388573c2..c64484a612f4 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/merge/MultipleFileMergeDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/merge/MultipleFileMergeDialog.java @@ -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) {