in src/main/kotlin/mobi/hsz/idea/gitignore/IgnoreManager.kt [139:199]
fun isFileIgnored(file: VirtualFile): Boolean {
expiringStatusCache[file]?.let {
return it
}
if (ApplicationManager.getApplication().isDisposed || project.isDisposed ||
DumbService.isDumb(project) || !isEnabled || !Utils.isInProject(file, project) ||
NoAccessDuringPsiEvents.isInsideEventProcessing() ||
EDT.isCurrentThreadEdt()
) {
return false
}
var ignored = changeListManager.isIgnoredFile(file)
var matched = false
var valuesCount = 0
for (fileType in FILE_TYPES) {
ProgressManager.checkCanceled()
if (IgnoreBundle.ENABLED_LANGUAGES[fileType] != true) {
continue
}
val values = cachedIgnoreFilesIndex[fileType] ?: emptyList()
valuesCount += values.size
@Suppress("LoopWithTooManyJumpStatements")
for (value in values) {
ProgressManager.checkCanceled()
val entryFile = value.file
var relativePath = if (entryFile == null) {
continue
} else {
Utils.getRelativePath(entryFile.parent, file)
} ?: continue
relativePath = StringUtil.trimEnd(StringUtil.trimStart(relativePath, "/"), "/")
if (StringUtil.isEmpty(relativePath)) {
continue
}
if (file.isDirectory) {
relativePath += "/"
}
value.items.forEach {
val pattern = Glob.getPattern(it.first!!)
if (matcher.match(pattern, relativePath)) {
ignored = !it.second
matched = true
}
}
}
}
if (valuesCount > 0 && !ignored && !matched) {
file.parent.let { directory ->
vcsRoots.forEach { vcsRoot ->
ProgressManager.checkCanceled()
if (directory == vcsRoot.path) {
return expiringStatusCache.set(file, false)
}
}
return expiringStatusCache.set(file, isFileIgnored(directory))
}
}
return expiringStatusCache.set(file, ignored)
}