[git] IJPL-149354 FUS: Add a collector to report if .idea is ignored, or tracked in VCS

GitOrigin-RevId: e95ad00dbb7d621e548856dc67163aa591637023
This commit is contained in:
Yuriy Artamonov
2024-12-03 13:22:40 +00:00
committed by intellij-monorepo-bot
parent ecc62c47f3
commit 47915601d4
@@ -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 {