[vcs-log] extract VcsLogRegexTextFilter class

This commit is contained in:
Julia Beliaeva
2018-08-20 18:17:13 +03:00
parent 9e4483b547
commit 72282a4982
5 changed files with 52 additions and 54 deletions
@@ -148,7 +148,7 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi {
return Pair.empty();
}
VcsLogTextFilter textFilter = new VcsLogTextFilterImpl(text, isRegexAllowed, matchesCase);
VcsLogTextFilter textFilter = VcsLogTextFilterImpl.createTextFilter(text, isRegexAllowed, matchesCase);
VcsLogHashFilterImpl hashFilter = createHashFilter(text);
return Pair.create(textFilter, hashFilter);
}
@@ -286,9 +286,9 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi {
@NotNull
@Override
protected VcsLogTextFilter createFilter(@NotNull List<String> values) {
return new VcsLogTextFilterImpl(ObjectUtils.assertNotNull(ContainerUtil.getFirstItem(values)),
myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_REGEX),
myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_MATCH_CASE));
return VcsLogTextFilterImpl.createTextFilter(ObjectUtils.assertNotNull(ContainerUtil.getFirstItem(values)),
myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_REGEX),
myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_MATCH_CASE));
}
@NotNull
@@ -465,10 +465,9 @@ public class VcsLogClassicFilterUi implements VcsLogFilterUi {
}
protected void applyFilter() {
myTextFilterModel.setFilter(new VcsLogTextFilterImpl(getText(),
myTextFilterModel.myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_REGEX),
myTextFilterModel.myUiProperties
.get(MainVcsLogUiProperties.TEXT_FILTER_MATCH_CASE)));
boolean isRegexpAllowed = myTextFilterModel.myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_REGEX);
boolean isMatchCase = myTextFilterModel.myUiProperties.get(MainVcsLogUiProperties.TEXT_FILTER_MATCH_CASE);
myTextFilterModel.setFilter(VcsLogTextFilterImpl.createTextFilter(getText(), isRegexpAllowed, isMatchCase));
addCurrentTextToHistory();
}
@@ -21,51 +21,49 @@ import com.intellij.vcs.log.util.VcsLogUtil
import java.util.regex.Pattern
import java.util.regex.PatternSyntaxException
class VcsLogTextFilterImpl(private val text: String,
isRegexAllowed: Boolean,
private val matchCase: Boolean) : VcsLogDetailsFilter, VcsLogTextFilter {
private val pattern: Pattern?
init {
pattern = createPattern(text, isRegexAllowed, matchCase)
}
class VcsLogTextFilterImpl internal constructor(private val text: String,
private val isMatchCase: Boolean) : VcsLogDetailsFilter, VcsLogTextFilter {
@Suppress("unused")
// used in upsource
constructor(text: String) : this(text, false, false)
constructor(text: String) : this(text, false)
override fun matches(message: String): Boolean {
if (pattern != null) return pattern.matcher(message).find()
return message.contains(text, !matchCase)
}
override fun matches(message: String): Boolean = message.contains(text, !isMatchCase)
override fun getText(): String {
return text
}
override fun getText(): String = text
override fun isRegex(): Boolean {
return pattern != null
}
override fun isRegex(): Boolean = false
override fun matchesCase(): Boolean {
return matchCase
}
override fun matchesCase(): Boolean = isMatchCase
override fun toString(): String {
return (if (isRegex) "matching " else "containing ") + text + " (case " + (if (matchCase) "sensitive" else "insensitive") + ")"
return "containing $text (case ${if (isMatchCase) "sensitive" else "insensitive"})"
}
companion object {
private fun createPattern(text: String, isRegexAllowed: Boolean, matchCase: Boolean): Pattern? {
if (isRegexAllowed && VcsLogUtil.maybeRegexp(text)) {
@JvmStatic
fun createTextFilter(text: String, isRegexpAllowed: Boolean = false, isMatchCase: Boolean = false): VcsLogTextFilter {
if (isRegexpAllowed && VcsLogUtil.maybeRegexp(text)) {
try {
return if (matchCase) Pattern.compile(text) else Pattern.compile(text, Pattern.CASE_INSENSITIVE)
return VcsLogRegexTextFilter(Pattern.compile(text, if (isMatchCase) 0 else Pattern.CASE_INSENSITIVE))
}
catch (ignored: PatternSyntaxException) {
}
}
return null
return VcsLogTextFilterImpl(text, isMatchCase)
}
}
}
class VcsLogRegexTextFilter internal constructor(private val pattern: Pattern) : VcsLogDetailsFilter, VcsLogTextFilter {
override fun matches(message: String): Boolean = pattern.matcher(message).find()
override fun getText(): String = pattern.pattern()
override fun isRegex(): Boolean = true
override fun matchesCase(): Boolean = (pattern.flags() and Pattern.CASE_INSENSITIVE) == 0
override fun toString(): String {
return "matching $text (case ${if (matchesCase()) "sensitive" else "insensitive"})"
}
}
@@ -202,7 +202,7 @@ public class VcsLogFiltererImpl implements VcsLogFilterer {
if (commitId != null) hashFilterResult.add(myStorage.getCommitIndex(commitId.getHash(), commitId.getRoot()));
}
}
VcsLogTextFilterImpl textFilter = new VcsLogTextFilterImpl(StringUtil.join(hashes, "|"), true, false);
VcsLogTextFilter textFilter = VcsLogTextFilterImpl.createTextFilter(StringUtil.join(hashes, "|"), true, false);
FilterByDetailsResult textFilterResult = filterByDetails(dataPack, new VcsLogFilterCollectionBuilder(textFilter).build(),
commitCount, dataPack.getLogProviders().keySet(), null);
if (hashFilterResult.isEmpty() && matchesNothing(textFilterResult.matchingCommits)) return null;
@@ -12,7 +12,6 @@ import com.intellij.vcs.log.*;
import com.intellij.vcs.log.data.VcsLogBranchFilterImpl;
import com.intellij.vcs.log.impl.*;
import com.intellij.vcs.log.impl.VcsLogFilterCollectionImpl.VcsLogFilterCollectionBuilder;
import com.intellij.vcs.log.ui.filter.VcsLogTextFilterImpl;
import git4idea.config.GitVersion;
import git4idea.test.GitSingleRepoTest;
import git4idea.test.GitTestUtil;
@@ -25,6 +24,7 @@ import java.util.Set;
import static com.intellij.openapi.vcs.Executor.echo;
import static com.intellij.openapi.vcs.Executor.touch;
import static com.intellij.vcs.log.ui.filter.VcsLogTextFilterImpl.createTextFilter;
import static git4idea.test.GitExecutor.*;
import static git4idea.test.GitTestUtil.readAllRefs;
import static java.util.Collections.singleton;
@@ -173,12 +173,12 @@ public class GitLogProviderTest extends GitSingleRepoTest {
String bigNoBrackets = addCommit(repo, "GIT " + fileName);
String text = "[git]";
assertEquals(Collections.singletonList(smallBrackets), getFilteredHashes(
new VcsLogFilterCollectionBuilder().with(new VcsLogTextFilterImpl(text, false, true)).build()));
assertEquals(Collections.singletonList(smallBrackets),
getFilteredHashes(new VcsLogFilterCollectionBuilder().with(createTextFilter(text, false, true)).build()));
assertEquals(Arrays.asList(bigNoBrackets, smallNoBrackets, bigBrackets, smallBrackets, initial),
getFilteredHashes(new VcsLogFilterCollectionBuilder().with(new VcsLogTextFilterImpl(text, true, false)).build()));
getFilteredHashes(new VcsLogFilterCollectionBuilder(createTextFilter(text, true, false)).build()));
assertEquals(Arrays.asList(smallNoBrackets, smallBrackets, initial),
getFilteredHashes(new VcsLogFilterCollectionBuilder().with(new VcsLogTextFilterImpl(text, true, true)).build()));
getFilteredHashes(new VcsLogFilterCollectionBuilder(createTextFilter(text, true, true)).build()));
}
public void test_filter_by_text_no_regex() throws Exception {
@@ -193,7 +193,7 @@ public class GitLogProviderTest extends GitSingleRepoTest {
echo(fileName, "content" + Math.random());
assertEquals(Arrays.asList(bigBrackets, smallBrackets), getFilteredHashes(
new VcsLogFilterCollectionBuilder().with(new VcsLogTextFilterImpl("[git]", false, false)).build()));
new VcsLogFilterCollectionBuilder().with(createTextFilter("[git]", false, false)).build()));
}
private void assumeFixedStringsWorks() {
@@ -209,7 +209,7 @@ public class GitLogProviderTest extends GitSingleRepoTest {
Collections.emptyMap(),
singleton(user));
assertEquals(hashes, getFilteredHashes(new VcsLogFilterCollectionBuilder().with(userFilter).
with(new VcsLogTextFilterImpl(regexp ? ".*" : "", regexp, false)).build()));
with(createTextFilter(regexp ? ".*" : "", regexp, false)).build()));
}
public void test_filter_by_text_with_regex_and_user() throws Exception {
@@ -18,8 +18,8 @@ package hg4idea.test.log;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.vcs.log.TimedVcsCommit;
import com.intellij.vcs.log.VcsLogTextFilter;
import com.intellij.vcs.log.impl.VcsLogFilterCollectionImpl;
import com.intellij.vcs.log.ui.filter.VcsLogTextFilterImpl;
import hg4idea.test.HgPlatformTest;
import org.jetbrains.annotations.NotNull;
import org.zmlx.hg4idea.command.HgWorkingCopyRevisionsCommand;
@@ -32,6 +32,7 @@ import java.util.List;
import static com.intellij.openapi.vcs.Executor.cd;
import static com.intellij.openapi.vcs.Executor.overwrite;
import static com.intellij.vcs.log.ui.filter.VcsLogTextFilterImpl.createTextFilter;
import static hg4idea.test.HgExecutor.hg;
import static hg4idea.test.log.HgUserFilterTest.findLogProvider;
@@ -52,11 +53,11 @@ public class HgTextFilterTest extends HgPlatformTest {
String text = "[hg]";
assertSameElements(Arrays.asList(bigBrackets, smallBrackets),
getFilteredCommits(provider, new VcsLogTextFilterImpl(text, false, false)));
getFilteredCommits(provider, createTextFilter(text, false, false)));
assertSameElements(Collections.singletonList(smallBrackets),
getFilteredCommits(provider, new VcsLogTextFilterImpl(text, false, true)));
getFilteredCommits(provider, createTextFilter(text, false, true)));
assertSameElements(Arrays.asList(bigNoBrackets, smallNoBrackets, bigBrackets, smallBrackets),
getFilteredCommits(provider, new VcsLogTextFilterImpl(text, true, false)));
getFilteredCommits(provider, createTextFilter(text, true, false)));
}
public void testRegexp() throws Exception {
@@ -69,9 +70,9 @@ public class HgTextFilterTest extends HgPlatformTest {
HgLogProvider provider = findLogProvider(myProject);
assertSameElements(Collections.singletonList(numberedBigBug),
getFilteredCommits(provider, new VcsLogTextFilterImpl("Bug \\d+", true, true)));
getFilteredCommits(provider, createTextFilter("Bug \\d+", true, true)));
assertSameElements(Collections.singletonList(bigBug),
getFilteredCommits(provider, new VcsLogTextFilterImpl("BUG.*", true, true)));
getFilteredCommits(provider, createTextFilter("BUG.*", true, true)));
}
public void _testRegexpCaseInsensitive() throws Exception {
@@ -84,13 +85,13 @@ public class HgTextFilterTest extends HgPlatformTest {
HgLogProvider provider = findLogProvider(myProject);
assertSameElements(Arrays.asList(numberedSmallBug, numberedBigBug),
getFilteredCommits(provider, new VcsLogTextFilterImpl("Bug \\d+", true, false)));
getFilteredCommits(provider, createTextFilter("Bug \\d+", true, false)));
assertSameElements(Arrays.asList(numberedBigBug, numberedSmallBug, smallBug, bigBug),
getFilteredCommits(provider, new VcsLogTextFilterImpl("BUG.*", true, false)));
getFilteredCommits(provider, createTextFilter("BUG.*", true, false)));
}
@NotNull
private List<String> getFilteredCommits(@NotNull HgLogProvider provider, @NotNull VcsLogTextFilterImpl filter) throws VcsException {
private List<String> getFilteredCommits(@NotNull HgLogProvider provider, @NotNull VcsLogTextFilter filter) throws VcsException {
VcsLogFilterCollectionImpl filterCollection = new VcsLogFilterCollectionImpl(null, null, null, null,
filter, null, null);
List<TimedVcsCommit> commits = provider.getCommitsMatchingFilter(myProject.getBaseDir(), filterCollection, -1);