diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogTextFilterImpl.kt b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogTextFilterImpl.kt index 111ff3059118..f6b23e98db67 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogTextFilterImpl.kt +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/filter/VcsLogTextFilterImpl.kt @@ -36,7 +36,7 @@ class VcsLogTextFilterImpl internal constructor(private val text: String, override fun matchesCase(): Boolean = isMatchCase override fun toString(): String { - return "containing $text (case ${if (isMatchCase) "sensitive" else "insensitive"})" + return "containing $text ${caseSensitiveText()}" } companion object { @@ -51,6 +51,13 @@ class VcsLogTextFilterImpl internal constructor(private val text: String, } return VcsLogTextFilterImpl(text, isMatchCase) } + + @JvmStatic + fun createTextFilter(patterns: List, isMatchCase: Boolean = false): VcsLogTextFilter { + if (patterns.isEmpty()) return createTextFilter("", false, isMatchCase) + if (patterns.size == 1) return createTextFilter(patterns.single(), false, isMatchCase) + return VcsLogMultiplePatternsTextFilter(patterns, isMatchCase) + } } } @@ -64,6 +71,24 @@ class VcsLogRegexTextFilter internal constructor(private val pattern: Pattern) : override fun matchesCase(): Boolean = (pattern.flags() and Pattern.CASE_INSENSITIVE) == 0 override fun toString(): String { - return "matching $text (case ${if (matchesCase()) "sensitive" else "insensitive"})" + return "matching $text ${caseSensitiveText()}" } -} \ No newline at end of file +} + +class VcsLogMultiplePatternsTextFilter internal constructor(private val patterns: List, + private val isMatchCase: Boolean) : VcsLogDetailsFilter, VcsLogTextFilter { + override fun getText(): String = if (patterns.size == 1) patterns.single() else patterns.joinToString("|") { Pattern.quote(it) } + + override fun isRegex(): Boolean = patterns.size > 1 + + override fun matchesCase(): Boolean = isMatchCase + + override fun matches(message: String): Boolean = patterns.any { message.contains(it, !isMatchCase) } + + override fun toString(): String { + return "containing at least one of the ${patterns.joinToString(", ")} ${caseSensitiveText()}" + } + +} + +private fun VcsLogTextFilter.caseSensitiveText() = "(case ${if (matchesCase()) "sensitive" else "insensitive"})" \ No newline at end of file diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VcsLogFiltererImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VcsLogFiltererImpl.java index 40ce2f57d24e..3739a9ecf01d 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VcsLogFiltererImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VcsLogFiltererImpl.java @@ -18,7 +18,6 @@ package com.intellij.vcs.log.visible; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vfs.VirtualFile; @@ -202,7 +201,7 @@ public class VcsLogFiltererImpl implements VcsLogFilterer { if (commitId != null) hashFilterResult.add(myStorage.getCommitIndex(commitId.getHash(), commitId.getRoot())); } } - VcsLogTextFilter textFilter = VcsLogTextFilterImpl.createTextFilter(StringUtil.join(hashes, "|"), true, false); + VcsLogTextFilter textFilter = VcsLogTextFilterImpl.createTextFilter(ContainerUtil.newArrayList(hashes), false); FilterByDetailsResult textFilterResult = filterByDetails(dataPack, new VcsLogFilterCollectionBuilder(textFilter).build(), commitCount, dataPack.getLogProviders().keySet(), null); if (hashFilterResult.isEmpty() && matchesNothing(textFilterResult.matchingCommits)) return null;