[git-index] catch exceptions during loading of base content
authorJulia Beliaeva <Julia.Beliaeva@jetbrains.com>
Mon, 10 Aug 2020 18:17:48 +0000 (21:17 +0300)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Tue, 11 Aug 2020 10:53:44 +0000 (10:53 +0000)
EA-236650

GitOrigin-RevId: 0359149f9b890dc1ff14a75382ccbae76111fe52

plugins/git4idea/src/git4idea/index/GitStageLineStatusTrackerProvider.kt

index fb1a4c9aac3f1d0423d90c479be7f1d034f25ac2..8e0136eb6dd882ab28dcdb3a54f6760e275d8762 100644 (file)
@@ -4,10 +4,12 @@ package git4idea.index.lst
 import com.intellij.diff.DiffContentFactoryImpl
 import com.intellij.openapi.application.runReadAction
 import com.intellij.openapi.components.service
+import com.intellij.openapi.diagnostic.Logger
 import com.intellij.openapi.editor.Document
 import com.intellij.openapi.fileEditor.FileDocumentManager
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.util.text.StringUtil
+import com.intellij.openapi.vcs.VcsException
 import com.intellij.openapi.vcs.ex.LocalLineStatusTracker
 import com.intellij.openapi.vcs.impl.LineStatusTrackerContentLoader
 import com.intellij.openapi.vcs.impl.LineStatusTrackerContentLoader.ContentInfo
@@ -24,6 +26,8 @@ import git4idea.util.GitFileUtils
 import java.nio.charset.Charset
 
 class GitStageLineStatusTrackerProvider : LineStatusTrackerContentLoader {
+  private val LOG = Logger.getInstance(GitStageLineStatusTrackerProvider::class.java)
+
   override fun isMyTracker(tracker: LocalLineStatusTracker<*>): Boolean = tracker is GitStageLineStatusTracker
 
   override fun isTrackedFile(project: Project, file: VirtualFile): Boolean {
@@ -76,13 +80,18 @@ class GitStageLineStatusTrackerProvider : LineStatusTrackerContentLoader {
     val indexFile = indexFileCache.get(repository.root, status.path(ContentVersion.STAGED))
     val indexDocument = runReadAction { FileDocumentManager.getInstance().getDocument(indexFile) } ?: return null
 
-    val bytes = GitFileUtils.getFileContent(project, repository.root, GitUtil.HEAD,
-                                            VcsFileUtil.relativePath(repository.root, status.path(ContentVersion.HEAD)))
-    val charset: Charset = DiffContentFactoryImpl.guessCharset(project, bytes, filePath)
-    val headContent = CharsetToolkit.decodeString(bytes, charset)
-    val correctedText = StringUtil.convertLineSeparators(headContent)
-
-    return StagedTrackerContent(correctedText, indexDocument)
+    try {
+      val bytes = GitFileUtils.getFileContent(project, repository.root, GitUtil.HEAD,
+                                              VcsFileUtil.relativePath(repository.root, status.path(ContentVersion.HEAD)))
+      val charset: Charset = DiffContentFactoryImpl.guessCharset(project, bytes, filePath)
+      val headContent = CharsetToolkit.decodeString(bytes, charset)
+      val correctedText = StringUtil.convertLineSeparators(headContent)
+
+      return StagedTrackerContent(correctedText, indexDocument)
+    } catch (e : VcsException) {
+      LOG.warn("Can't load base revision content for ${file.path} with status $status", e)
+      return null
+    }
   }
 
   override fun setLoadedContent(tracker: LocalLineStatusTracker<*>, content: TrackerContent) {