RIDER-90456 check root dir sensitivity when creating wsm

(cherry picked from commit 29df6ca6ae69a9e5c38625fd9d9317ce5521a5f4)

IJ-MR-146692

GitOrigin-RevId: cd88ea6cf6b3c698a4daa7626eba613a865d9e9f
This commit is contained in:
Kirill Bochkarev
2024-09-05 00:49:11 +02:00
committed by intellij-monorepo-bot
parent 09c25b2e66
commit c010774a56
6 changed files with 25 additions and 16 deletions

View File

@@ -3,11 +3,19 @@
package com.intellij.workspaceModel.ide
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.io.FileAttributes
import com.intellij.openapi.util.io.FileSystemUtil
import com.intellij.openapi.util.io.FileUtil
import com.intellij.platform.workspace.storage.url.VirtualFileUrl
import org.jetbrains.jps.util.JpsPathUtil
import java.io.File
import java.nio.file.Path
fun VirtualFileUrl.isEqualOrParentOf(other: VirtualFileUrl): Boolean = FileUtil.startsWith(other.url.removeSuffix("/"), url.removeSuffix("/"))
fun VirtualFileUrl.toPath(): Path = Path.of(JpsPathUtil.urlToPath(url))
fun VirtualFileUrl.toPath(): Path = Path.of(JpsPathUtil.urlToPath(url))
val Project.isCaseSensitive: Boolean
get() = basePath?.let { File(it) }?.let { FileSystemUtil.readParentCaseSensitivity(it) == FileAttributes.CaseSensitivity.SENSITIVE }
?: false

View File

@@ -7,7 +7,7 @@ import com.intellij.platform.workspace.storage.url.VirtualFileUrl
import org.jetbrains.annotations.ApiStatus
@ApiStatus.Internal
class IdeVirtualFileUrlManagerImpl : VirtualFileUrlManagerImpl() {
class IdeVirtualFileUrlManagerImpl(isRootDirCaseSensitive: Boolean = false) : VirtualFileUrlManagerImpl(isRootDirCaseSensitive) {
override val virtualFileUrlImplementationClass: Class<out VirtualFileUrl>
get() = VirtualFileUrlBridge::class.java

View File

@@ -30,6 +30,7 @@ import com.intellij.workspaceModel.core.fileIndex.EntityStorageKind
import com.intellij.workspaceModel.core.fileIndex.WorkspaceFileIndex
import com.intellij.workspaceModel.core.fileIndex.impl.WorkspaceFileIndexImpl
import com.intellij.workspaceModel.ide.impl.reactive.WmReactive
import com.intellij.workspaceModel.ide.isCaseSensitive
import io.opentelemetry.api.metrics.Meter
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
@@ -65,7 +66,7 @@ open class WorkspaceModelImpl(private val project: Project, private val cs: Coro
*/
private val updatesFlow = MutableSharedFlow<VersionedStorageChange>(replay = 1)
private val virtualFileManager: VirtualFileUrlManager = IdeVirtualFileUrlManagerImpl()
private val virtualFileManager: VirtualFileUrlManager = IdeVirtualFileUrlManagerImpl(project.isCaseSensitive)
override val currentSnapshot: ImmutableEntityStorage
get() = entityStorage.current

View File

@@ -1,21 +1,21 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.workspace.storage.impl
import com.intellij.openapi.util.SystemInfoRt
import com.intellij.openapi.util.registry.Registry
import com.intellij.util.containers.CollectionFactory
import com.intellij.util.containers.HashingStrategy
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
import org.jetbrains.annotations.TestOnly
internal class VirtualFileNameStore {
internal class VirtualFileNameStore(isRootDirCaseSensitive: Boolean) {
private val generator = IntIdGenerator()
private val id2NameStore = Int2ObjectOpenHashMap<String>()
private val name2IdStore = run {
val checkSensitivityEnabled = Registry.`is`("ide.new.project.model.index.case.sensitivity", false)
if (checkSensitivityEnabled && !SystemInfoRt.isFileSystemCaseSensitive) return@run CollectionFactory.createCustomHashingStrategyMap<String, IdPerCount>(HashingStrategy.caseInsensitive())
return@run CollectionFactory.createSmallMemoryFootprintMap<String, IdPerCount>()
}
private val name2IdStore: MutableMap<String, IdPerCount> =
if (Registry.`is`("ide.new.project.model.index.case.sensitivity", false) && !isRootDirCaseSensitive)
CollectionFactory.createCustomHashingStrategyMap(HashingStrategy.caseInsensitive())
else
CollectionFactory.createSmallMemoryFootprintMap()
fun generateIdForName(name: String): Int {
val idPerCount = name2IdStore[name]
@@ -77,4 +77,4 @@ internal class IntIdGenerator {
fun clear() {
generator = 0
}
}
}

View File

@@ -15,10 +15,10 @@ import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet
import org.jetbrains.annotations.ApiStatus
@ApiStatus.Internal
public open class VirtualFileUrlManagerImpl : VirtualFileUrlManager {
public open class VirtualFileUrlManagerImpl(isRootDirCaseSensitive: Boolean = false) : VirtualFileUrlManager {
private val idGenerator = IntIdGenerator()
private var emptyUrl: VirtualFileUrl? = null
private val fileNameStore = VirtualFileNameStore()
private val fileNameStore = VirtualFileNameStore(isRootDirCaseSensitive)
private val id2NodeMapping = Int2ObjectOpenHashMap<FilePathNode>()
private val rootNode = FilePathNode(0, 0)

View File

@@ -8,7 +8,7 @@ import kotlin.test.assertEquals
class VirtualFileNameStoreTest {
@Test
fun `test 1`() {
val store = VirtualFileNameStore()
val store = VirtualFileNameStore(false)
assertEquals(1, store.generateIdForName("a"))
assertEquals(2, store.generateIdForName("b"))
assertEquals(3, store.generateIdForName("c"))
@@ -16,14 +16,14 @@ class VirtualFileNameStoreTest {
@Test
fun `test 2`() {
val store = VirtualFileNameStore()
val store = VirtualFileNameStore(false)
assertEquals(1, store.generateIdForName("a"))
assertEquals(1, store.generateIdForName("a"))
}
@Test
fun `test 3`() {
val store = VirtualFileNameStore()
val store = VirtualFileNameStore(false)
assertEquals(1, store.generateIdForName("a"))
assertEquals(2, store.generateIdForName("b"))
assertEquals(3, store.generateIdForName("c"))