mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-18861 Apply patch: When project/module file has changed, IDEA should ask to reload the project
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+37
-1
@@ -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);
|
||||
}
|
||||
|
||||
+29
-6
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user