Skip to content

Commit 1aa45e6

Browse files
authored
Fix URI to Path conversion code (#1097)
Fixes #995 ## Changes Fixed URI to Path conversion code + added tests ## Test plan Unit tests added + manual testing by clicking on the response context links on Windows and MacOs.
1 parent e5ba5fe commit 1aa45e6

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

src/main/kotlin/com/sourcegraph/cody/agent/protocol/ContextItem.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package com.sourcegraph.cody.agent.protocol
22

3-
import com.google.gson.*
3+
import com.google.gson.JsonDeserializationContext
4+
import com.google.gson.JsonDeserializer
5+
import com.google.gson.JsonElement
6+
import com.google.gson.JsonNull
7+
import com.google.gson.JsonObject
8+
import com.google.gson.JsonSerializer
9+
import com.intellij.openapi.vfs.StandardFileSystems
10+
import com.intellij.openapi.vfs.VfsUtil
411
import java.io.File
512
import java.lang.reflect.Type
613
import java.net.URI
714
import java.nio.file.Path
8-
import java.nio.file.Paths
15+
import kotlin.io.path.toPath
916

1017
typealias ContextFileSource =
1118
String // One of: embeddings, user, keyword, editor, filename, search, unified, selection,
@@ -59,8 +66,11 @@ data class ContextItemFile(
5966

6067
fun isLocal() = repoName == null
6168

62-
fun getPath(): Path {
63-
return Paths.get(uri.path).toAbsolutePath()
69+
fun getPath(): Path? {
70+
val newUri = uri.toString().substringBefore("?")
71+
val fileProtocol = StandardFileSystems.FILE_PROTOCOL_PREFIX
72+
val uriWithFileProtocol = if (newUri.startsWith(fileProtocol)) newUri else fileProtocol + newUri
73+
return VfsUtil.toUri(uriWithFileProtocol)?.toPath()
6474
}
6575

6676
fun getLinkActionText(projectPath: String?): String {

src/main/kotlin/com/sourcegraph/cody/chat/ui/ContextFilesPanel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class ContextFilesPanel(
9595

9696
private fun openInEditor(contextItemFile: ContextItemFile) {
9797
val logicalLine = contextItemFile.range?.start?.line ?: 0
98-
val contextFilePath = contextItemFile.getPath()
98+
val contextFilePath = contextItemFile.getPath() ?: return
9999
ApplicationManager.getApplication().executeOnPooledThread {
100100
val findFileByNioFile = LocalFileSystem.getInstance().findFileByNioFile(contextFilePath)
101101
if (findFileByNioFile != null) {

src/test/kotlin/com/sourcegraph/cody/agent/protocol/ContextItemTest.kt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package com.sourcegraph.cody.agent.protocol
22

3+
import com.intellij.openapi.util.SystemInfoRt
4+
import com.intellij.testFramework.fixtures.BasePlatformTestCase
35
import java.net.URI
4-
import junit.framework.TestCase
56

6-
class ContextItemTest : TestCase() {
7+
class ContextItemTest : BasePlatformTestCase() {
78
private val localContextItemFile =
89
ContextItemFile(
910
uri =
@@ -35,4 +36,23 @@ class ContextItemTest : TestCase() {
3536
val linkActionText = remoteContextItemFile.getLinkActionText(projectPath = null)
3637
assertEquals("jetbrains TESTING.md:49-56", linkActionText)
3738
}
39+
40+
fun `test getPath`() {
41+
fun contextFilePath(path: String) = ContextItemFile(uri = URI.create(path)).getPath().toString()
42+
43+
if (SystemInfoRt.isWindows) {
44+
assertEquals("c:\\a\\b\\c\\d.java", contextFilePath("file:///c:/a/b/c/d.java"))
45+
assertEquals("c:\\a\\b\\c\\d.java", contextFilePath("file://c:/a/b/c/d.java"))
46+
assertEquals("c:\\a\\b\\c\\d.java", contextFilePath("file:///c:/a/b/c/d.java?#"))
47+
assertEquals("c:\\a\\b\\c\\d.java", contextFilePath("file://c:/a/b/c/d.java?#"))
48+
assertEquals("c:\\a\\b\\c\\d.java", contextFilePath("/c:/a/b/c/d.java"))
49+
assertEquals("c:\\a\\b\\c\\d.java", contextFilePath("c:/a/b/c/d.java"))
50+
assertEquals("c:\\a\\b\\c\\d.java", contextFilePath("c:/a/b/c/d.java?#"))
51+
assertEquals("c:\\a\\b\\c\\d.java", contextFilePath("c:/a/b/c/d.java?#"))
52+
} else {
53+
assertEquals("/a/b/c/d.java", contextFilePath("/a/b/c/d.java"))
54+
assertEquals("/a/b/c/d.java", contextFilePath("/a/b/c/d.java?#"))
55+
assertEquals("/a/b/c/d.java", contextFilePath("file:///a/b/c/d.java"))
56+
}
57+
}
3858
}

0 commit comments

Comments
 (0)