diff --git a/platform/diff-api/src/com/intellij/diff/contents/BinaryFileContent.java b/platform/diff-api/src/com/intellij/diff/contents/BinaryFileContent.java index b65e55b01c81..600027f58507 100644 --- a/platform/diff-api/src/com/intellij/diff/contents/BinaryFileContent.java +++ b/platform/diff-api/src/com/intellij/diff/contents/BinaryFileContent.java @@ -15,10 +15,13 @@ */ package com.intellij.diff.contents; +import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import java.io.IOException; +@Deprecated +/** @deprecated Use {@link FileContent} and {@link VirtualFile#contentsToByteArray()} */ public interface BinaryFileContent extends FileContent { /** * @return Binary representation of content. diff --git a/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java b/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java index 8acca83b1b90..af73b7ecf550 100644 --- a/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java +++ b/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java @@ -101,7 +101,7 @@ public class DiffContentFactoryImpl extends DiffContentFactory { if (file.isDirectory()) return new DirectoryContentImpl(project, file); DocumentContent content = createDocument(project, file); if (content != null) return content; - return new BinaryFileContentImpl(project, file); + return new FileContentImpl(project, file); } @Override diff --git a/platform/diff-impl/src/com/intellij/diff/contents/BinaryFileContentImpl.java b/platform/diff-impl/src/com/intellij/diff/contents/FileContentImpl.java similarity index 90% rename from platform/diff-impl/src/com/intellij/diff/contents/BinaryFileContentImpl.java rename to platform/diff-impl/src/com/intellij/diff/contents/FileContentImpl.java index 155e3fd27bc2..cf458199e8c9 100644 --- a/platform/diff-impl/src/com/intellij/diff/contents/BinaryFileContentImpl.java +++ b/platform/diff-impl/src/com/intellij/diff/contents/FileContentImpl.java @@ -25,14 +25,14 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; /** - * Allows to compare binary files + * Allows to compare files */ -public class BinaryFileContentImpl implements DiffContent, BinaryFileContent { +public class FileContentImpl implements FileContent, BinaryFileContent { @NotNull private final VirtualFile myFile; @Nullable private final Project myProject; @NotNull private final FileType myType; - public BinaryFileContentImpl(@Nullable Project project, @NotNull VirtualFile file) { + public FileContentImpl(@Nullable Project project, @NotNull VirtualFile file) { assert file.isValid() && !file.isDirectory(); myProject = project; myFile = file; diff --git a/platform/diff-impl/src/com/intellij/diff/tools/binary/BinaryDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/binary/BinaryDiffViewer.java index 877a6bbe23a3..f8a9b63b4d70 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/binary/BinaryDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/binary/BinaryDiffViewer.java @@ -26,6 +26,7 @@ import com.intellij.diff.util.DiffUtil; import com.intellij.diff.util.Side; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; @@ -42,6 +43,7 @@ import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Couple; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Pair; @@ -172,9 +174,9 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { @NotNull private Pair createEditor(@NotNull final DiffContent content) throws IOException { if (content instanceof EmptyContent) return Pair.empty(); - if (content instanceof BinaryFileContent) { + if (content instanceof FileContent) { Project project = myProject != null ? myProject : ProjectManager.getInstance().getDefaultProject(); - VirtualFile file = ((BinaryFileContent)content).getFile(); + VirtualFile file = ((FileContent)content).getFile(); FileEditorProvider[] providers = FileEditorProviderManager.getInstance().getProviders(project, file); if (providers.length == 0) throw new IOException("Can't find FileEditorProvider"); @@ -269,8 +271,7 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { }; } - // TODO: compare text with image by-byte? - if (!(contents.get(0) instanceof BinaryFileContent) || !(contents.get(1) instanceof BinaryFileContent)) { + if (!(contents.get(0) instanceof FileContent) || !(contents.get(1) instanceof FileContent)) { return new Runnable() { @Override public void run() { @@ -279,12 +280,35 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { }; } - final BinaryFileContent content1 = (BinaryFileContent)contents.get(0); - final BinaryFileContent content2 = (BinaryFileContent)contents.get(1); - byte[] bytes1 = content1.getBytes(); - byte[] bytes2 = content2.getBytes(); + final VirtualFile file1 = ((FileContent)contents.get(0)).getFile(); + final VirtualFile file2 = ((FileContent)contents.get(1)).getFile(); + if (!file1.isValid() || !file2.isValid()) { + return new Runnable() { + @Override + public void run() { + myPanel.addDiffErrorNotification(); + clearDiffPresentation(); + } + }; + } - final boolean equal = Arrays.equals(bytes1, bytes2); + final boolean equal = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Boolean compute() { + try { + // we can't use getInputStream() here because we can't restore BOM marker + // (getBom() can return null for binary files, while getInputStream() strips BOM for all files). + // It can be made for files from VFS that implements FileSystemInterface though. + byte[] bytes1 = file1.contentsToByteArray(); + byte[] bytes2 = file2.contentsToByteArray(); + return Arrays.equals(bytes1, bytes2); + } + catch (IOException e) { + LOG.warn(e); + return false; + } + } + }); return new Runnable() { @Override @@ -401,10 +425,10 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { public static boolean canShowContent(@NotNull DiffContent content, @NotNull DiffContext context) { if (content instanceof EmptyContent) return true; if (content instanceof DocumentContent) return true; - if (content instanceof BinaryFileContent) { + if (content instanceof FileContent) { Project project = context.getProject(); if (project == null) project = ProjectManager.getInstance().getDefaultProject(); - VirtualFile file = ((BinaryFileContent)content).getFile(); + VirtualFile file = ((FileContent)content).getFile(); return FileEditorProviderManager.getInstance().getProviders(project, file).length != 0; } @@ -413,8 +437,7 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase { public static boolean wantShowContent(@NotNull DiffContent content, @NotNull DiffContext context) { if (content instanceof EmptyContent) return false; - if (content instanceof DocumentContent) return false; - if (content instanceof BinaryFileContent) { + if (content instanceof FileContent) { if (content.getContentType() == null) return false; if (content.getContentType().isBinary()) return true; if (content.getContentType() instanceof UIBasedFileType) return true; diff --git a/platform/diff-impl/src/com/intellij/diff/tools/dir/DirDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/dir/DirDiffViewer.java index a4dd1e76416f..da228f70dbc8 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/dir/DirDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/dir/DirDiffViewer.java @@ -153,6 +153,7 @@ class DirDiffViewer implements FrameDiffTool.DiffViewer { if (content instanceof DirectoryContent) return true; if (content instanceof FileContent && content.getContentType() instanceof ArchiveFileType && + ((FileContent)content).getFile().isValid() && ((FileContent)content).getFile().isInLocalFileSystem()) { return true; } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/base/ListenerDiffViewerBase.java b/platform/diff-impl/src/com/intellij/diff/tools/util/base/ListenerDiffViewerBase.java index 45cc5114a85c..d6385862296c 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/base/ListenerDiffViewerBase.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/base/ListenerDiffViewerBase.java @@ -16,9 +16,9 @@ package com.intellij.diff.tools.util.base; import com.intellij.diff.DiffContext; -import com.intellij.diff.contents.BinaryFileContent; import com.intellij.diff.contents.DiffContent; import com.intellij.diff.contents.DocumentContent; +import com.intellij.diff.contents.FileContent; import com.intellij.diff.requests.ContentDiffRequest; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.event.DocumentAdapter; @@ -79,8 +79,8 @@ public abstract class ListenerDiffViewerBase extends DiffViewerBase { protected VirtualFileListener createFileListener(@NotNull ContentDiffRequest request) { final List files = new ArrayList(0); for (DiffContent content : request.getContents()) { - if (content instanceof BinaryFileContent) { - files.add(((BinaryFileContent)content).getFile()); + if (content instanceof FileContent && !(content instanceof DocumentContent)) { + files.add(((FileContent)content).getFile()); } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/migrate/MigrateToNewDiffUtil.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/migrate/MigrateToNewDiffUtil.java index 2c69ab6725c6..bacab1d07f6e 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/migrate/MigrateToNewDiffUtil.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/migrate/MigrateToNewDiffUtil.java @@ -1,5 +1,6 @@ package com.intellij.openapi.vcs.changes.actions.migrate; +import com.intellij.diff.contents.FileContentImpl; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -22,7 +23,6 @@ import com.intellij.diff.chains.DiffRequestChain; import com.intellij.diff.chains.DiffRequestProducer; import com.intellij.diff.chains.DiffRequestProducerException; import com.intellij.diff.chains.SimpleDiffRequestChain; -import com.intellij.diff.contents.BinaryFileContentImpl; import com.intellij.diff.contents.DiffContent; import com.intellij.diff.contents.DocumentContentImpl; import com.intellij.diff.contents.EmptyContent; @@ -118,7 +118,7 @@ public class MigrateToNewDiffUtil { if (oldContent.isBinary()) { VirtualFile file = oldContent.getFile(); if (file == null) return null; - return new BinaryFileContentImpl(project, file); + return new FileContentImpl(project, file); } else { Document document = oldContent.getDocument();