diff --git a/plugins/git4idea/src/git4idea/GitStatisticsCollector.kt b/plugins/git4idea/src/git4idea/GitStatisticsCollector.kt index 7364ad25a612..f670a619172f 100644 --- a/plugins/git4idea/src/git4idea/GitStatisticsCollector.kt +++ b/plugins/git4idea/src/git4idea/GitStatisticsCollector.kt @@ -21,7 +21,6 @@ import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.Project import com.intellij.openapi.project.getProjectCacheFileName import com.intellij.openapi.util.Comparing -import com.intellij.openapi.vcs.FileStatus import com.intellij.openapi.vcs.VcsException import com.intellij.util.io.URLUtil import com.intellij.vcs.log.impl.VcsLogApplicationSettings @@ -32,7 +31,7 @@ import com.intellij.vcs.log.ui.VcsLogUiImpl import com.intellij.vcsUtil.VcsUtil import git4idea.branch.GitBranchUtil import git4idea.config.* -import git4idea.index.getFileStatus +import git4idea.index.getStatus import git4idea.repo.GitCommitTemplateTracker import git4idea.repo.GitRemote import git4idea.repo.GitRepository @@ -123,7 +122,7 @@ internal class GitStatisticsCollector : ProjectUsagesCollector() { set.add(repositoryMetric) for (configDirName in ALL_IDE_CONFIG_NAMES) { - getConfigFileStatus(executable, repository, configDirName)?.let { status -> + getConfigFileStatus(repository, configDirName)?.let { status -> set.add(SHARED_IDE_CONFIG.metric( IDE_CONFIG_NAME.with(configDirName), IDE_CONFIG_STATUS.with(status) @@ -343,20 +342,22 @@ private fun GitRepository.isWorkTreeUsed(): Boolean { } } -private fun getConfigFileStatus(executable: GitExecutable, repository: GitRepository, configDirName: String): ConfigStatus? { +private fun getConfigFileStatus(repository: GitRepository, configDirName: String): ConfigStatus? { return try { val rootPath = repository.root.toNioPath() val configDir = rootPath.resolve(configDirName) - if (!configDir.exists() || !configDir.isDirectory()) return null - - val file = repository.root.findChild(configDirName) ?: return null - val filePath = VcsUtil.getFilePath(file) - - val status = getFileStatus(repository.root, filePath, executable) - when (status.getFileStatus()) { - FileStatus.IGNORED -> return ConfigStatus.IGNORED - else -> ConfigStatus.SHARED + if (!configDir.exists() || !configDir.isDirectory()) { + return null } + + val filePath = VcsUtil.getFilePath(configDir, true) + + val status = getStatus(repository.project, repository.root, listOf(filePath), false, true, true) + val fileStatus = status.singleOrNull() ?: return ConfigStatus.SHARED + if (fileStatus.isIgnored() && fileStatus.path.path == filePath.path) { // GitFileStatus has invalid FilePath.isDirectory values + return ConfigStatus.IGNORED + } + return ConfigStatus.SHARED } catch (e: Exception) { if (e is ControlFlowException) throw e @@ -369,7 +370,7 @@ internal enum class ConfigStatus { SHARED } -enum class FsMonitor { NONE, BUILTIN, EXTERNAL_FS_MONITOR } +internal enum class FsMonitor { NONE, BUILTIN, EXTERNAL_FS_MONITOR } private fun GitRepository.detectFsMonitor(): FsMonitor { try {