Skip to content

Commit 6fe20f0

Browse files
committed
Merge branch 'refs/heads/improve-symlink-resolve'
2 parents 1438268 + ca29b2b commit 6fe20f0

File tree

2 files changed

+18
-28
lines changed

2 files changed

+18
-28
lines changed

src/main/kotlin/com/wsl/symlinks/vfs/WslVirtualFileSystem.kt

+17-28
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,13 @@ import ai.grazie.utils.WeakHashMap
44
import com.intellij.ide.AppLifecycleListener
55
import com.intellij.openapi.components.service
66
import com.intellij.openapi.diagnostic.Logger
7-
import com.intellij.openapi.extensions.ExtensionPointListener
8-
import com.intellij.openapi.extensions.PluginDescriptor
9-
import com.intellij.openapi.extensions.impl.ExtensionPointImpl
107
import com.intellij.openapi.util.io.FileAttributes
118
import com.intellij.openapi.vfs.VirtualFile
129
import com.intellij.openapi.vfs.VirtualFileManager
1310
import com.intellij.openapi.vfs.VirtualFileSystem
1411
import com.intellij.openapi.vfs.impl.local.LocalFileSystemImpl
1512
import com.intellij.openapi.vfs.newvfs.impl.StubVirtualFile
1613
import com.intellij.platform.workspace.storage.url.VirtualFileUrl
17-
import com.intellij.util.KeyedLazyInstance
18-
import com.intellij.util.KeyedLazyInstanceEP
1914
import com.intellij.util.io.URLUtil
2015
import java.io.*
2116
import java.util.concurrent.ConcurrentHashMap
@@ -28,7 +23,9 @@ import kotlin.concurrent.withLock
2823

2924
class StartupListener: AppLifecycleListener {
3025
override fun appFrameCreated(commandLineArgs: MutableList<String>) {
31-
26+
val point = VirtualFileSystem.EP_NAME.point
27+
val extension = point.extensionList.find { it.instance is LocalFileSystemImpl && it.instance.javaClass.name.contains("LocalFileSystemImpl") }
28+
point.unregisterExtension(extension)
3229
}
3330
}
3431

@@ -37,6 +34,10 @@ class FakeVirtualFile(val resPath: String, val vfile: VirtualFile, fs: WslVirtua
3734
return resPath
3835
}
3936

37+
override fun getLength(): Long {
38+
return vfile.length
39+
}
40+
4041
override fun getParent(): VirtualFile? {
4142
return vfile.parent
4243
}
@@ -226,25 +227,7 @@ class WslVirtualFileSystem: LocalFileSystemImpl() {
226227
private var wslSymlinksProviders: MutableMap<String, WslSymlinksProvider> = HashMap()
227228

228229
init {
229-
val classNameToUnregister = LocalFileSystemImpl::class.java.canonicalName
230-
VirtualFileSystem.EP_NAME.point.addExtensionPointListener(object : ExtensionPointListener<KeyedLazyInstance<VirtualFileSystem>> {
231-
override fun extensionRemoved(
232-
extension: KeyedLazyInstance<VirtualFileSystem>,
233-
pluginDescriptor: PluginDescriptor
234-
) {
235-
val ext = (extension as? KeyedLazyInstanceEP)
236-
if (ext != null) {
237-
pluginDescriptor.isEnabled = false
238-
ext.implementationClass = null
239-
}
240230

241-
}
242-
}, false, this)
243-
val point: ExtensionPointImpl<Any> = VirtualFileSystem.EP_NAME.point as ExtensionPointImpl<Any>
244-
point.unregisterExtensions({ className, adapter ->
245-
className != "com.intellij.openapi.vfs.impl.VirtualFileManagerImpl\$VirtualFileSystemBean"
246-
|| adapter.createInstance<KeyedLazyInstanceEP<VirtualFileSystem>>(point.componentManager)?.implementationClass != "com.intellij.openapi.vfs.impl.local.LocalFileSystemImpl" },
247-
/* stopAfterFirstMatch = */true)
248231
}
249232

250233
override fun getProtocol(): String {
@@ -264,26 +247,32 @@ class WslVirtualFileSystem: LocalFileSystemImpl() {
264247
return symlkinkWsl?.let { virtualFile -> this.resolveSymLink(virtualFile) } ?: file.path
265248
}
266249

250+
fun getFakeVirtualFile(file: VirtualFile): VirtualFile {
251+
val filePath = getRealPath(file.parent)
252+
return FakeVirtualFile(filePath + "/" + file.name, file, this)
253+
}
254+
267255
fun getRealVirtualFile(file: VirtualFile): VirtualFile {
268256
val symlkinkWsl = file.parents.find { it.isFromWSL() && this.getWslSymlinksProviders(file).isWslSymlink(it) }
269257
val relative = symlkinkWsl?.path?.let { file.path.replace(it, "") }
270-
val resolved = symlkinkWsl?.let { virtualFile -> this.resolveSymLink(virtualFile)?.let { this.findFileByPath(it) } }
258+
val resolved =
259+
symlkinkWsl?.let { virtualFile -> this.resolveSymLink(virtualFile)?.let { this.findFileByPath(it) } }
271260
val r = relative?.let { resolved?.findFileByRelativePath(it) } ?: file
272261
return r
273262
}
274263

275264
override fun getInputStream(vfile: VirtualFile): InputStream {
276-
val file = this.getRealVirtualFile(vfile)
265+
val file = this.getFakeVirtualFile(vfile)
277266
return super.getInputStream(file)
278267
}
279268

280269
override fun contentsToByteArray(vfile: VirtualFile): ByteArray {
281-
val file = this.getRealVirtualFile(vfile)
270+
val file = this.getFakeVirtualFile(vfile)
282271
return super.contentsToByteArray(file)
283272
}
284273

285274
override fun getOutputStream(vfile: VirtualFile, requestor: Any?, modStamp: Long, timeStamp: Long): OutputStream {
286-
val file = this.getRealVirtualFile(vfile)
275+
val file = this.getFakeVirtualFile(vfile)
287276
return super.getOutputStream(file, requestor, modStamp, timeStamp)
288277
}
289278

src/main/resources/files.sh

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ while IFS='$\n' read line; do
44
id=${command[0]};
55
type=${command[1]};
66
value=${command[2]};
7+
# echo "$id;$type;$value" > /var/log/intellij-idea-symlink.log
78
if [ "$type" == "is-symlink" ]; then
89
(test -L "$value") && echo "$id;true" || echo "$id;false";
910
fi

0 commit comments

Comments
 (0)