fun isFileIgnored()

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)
    }