[vcs-log] extract VcsLogMultiplePatternsTextFilter class to filter by multiple strings

Use VcsLogMultiplePatternsTextFilter for finding commits whith specified hashes in commit messages.

IDEA-130970
This commit is contained in:
Julia Beliaeva
2018-08-20 18:17:14 +03:00
parent 72282a4982
commit df98979fb5
2 changed files with 29 additions and 5 deletions
@@ -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<String>, 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()}"
}
}
}
class VcsLogMultiplePatternsTextFilter internal constructor(private val patterns: List<String>,
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"})"
@@ -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;