String (@NotNull final ContentRevision fromRevision, @NotNull final ContentRevision toRevision) { final FilePath fromPath = fromRevision.getFile(); final FilePath toPath = toRevision.getFile(); final VirtualFile fromParent = VcsImplUtil.findValidParentAccurately(fromPath); final VirtualFile toParent = VcsImplUtil.findValidParentAccurately(toPath); if (fromParent != null && toParent != null) { String moduleResult = ReadAction.compute(() -> { if (myProject.isDisposed()) return null; final boolean hideExcludedFiles = Registry.is("ide.hide.excluded.files"); ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex(); Module fromModule = fileIndex.getModuleForFile(fromParent, hideExcludedFiles); Module toModule = fileIndex.getModuleForFile(toParent, hideExcludedFiles); if (fromModule == null) return null; if (toModule == null || fromModule.equals(toModule)) { String relativePath = RelativePathCalculator.computeRelativePath(toPath.getPath(), fromPath.getPath(), true); if (relativePath != null) return FileUtilRt.toSystemDependentName(relativePath); //NON-NLS } VirtualFile fromContentRoot = fileIndex.getContentRootForFile(fromParent, hideExcludedFiles); if (fromContentRoot == null) return null; String relativePath = VfsUtilCore.getRelativePath(fromParent, fromContentRoot, File.separatorChar); if (relativePath == null) return null; if (!relativePath.isEmpty()) { relativePath += File.separatorChar; } if (!fromPath.getName().equals(toPath.getName())) { relativePath += fromPath.getName(); } return getPresentableRelativePathFor(fromModule, fromContentRoot, relativePath); }); if (moduleResult != null) return moduleResult; } return PlatformVcsPathPresenter.getPresentableRelativePath(toPath, fromPath); }