Skip to content

Commit 8fdf40c

Browse files
committed
Add e:/e!: filter prefixes for files and directories
1 parent 5f1e035 commit 8fdf40c

File tree

12 files changed

+952
-759
lines changed

12 files changed

+952
-759
lines changed

Docs/Manual/English/Filters.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,8 @@
11991199
<varlistentry><term>fe!: <replaceable>expr</replaceable></term><listitem><para>Filter expression to exclude files (Available since 2.16.49)</para></listitem></varlistentry>
12001200
<varlistentry><term>de: <replaceable>expr</replaceable></term><listitem><para>Filter expression for folders (Available since 2.16.49)</para></listitem></varlistentry>
12011201
<varlistentry><term>de!: <replaceable>expr</replaceable></term><listitem><para>Filter expression to exclude folders (Available since 2.16.49)</para></listitem></varlistentry>
1202+
<varlistentry><term>e: <replaceable>expr</replaceable></term><listitem><para>Filter expression applied to both files and folders (e.g. e:Name like "Common*.*") (Available since 2.16.56)</para></listitem></varlistentry>
1203+
<varlistentry><term>e!: <replaceable>expr</replaceable></term><listitem><para>Filter expression to exclude both files and folders (Available since 2.16.56)</para></listitem></varlistentry>
12021204
</variablelist>
12031205

12041206
<para>Among the many regexp special characters, the following are

Docs/Manual/French/Filters.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,6 +1317,10 @@ depuis 2.16.49)</para></listitem></varlistentry>
13171317
<varlistentry><term>fe!: <replaceable>expr</replaceable></term><listitem><para>Expression de filtre pour exclure des fichiers (disponible depuis 2.16.49)</para></listitem></varlistentry>
13181318
<varlistentry><term>de: <replaceable>expr</replaceable></term><listitem><para>Expression de filtre pour les dossiers (disponible depuis 2.16.49)</para></listitem></varlistentry>
13191319
<varlistentry><term>de!: <replaceable>expr</replaceable></term><listitem><para>Expression de filtre pour exclure des dossiers (disponible depuis 2.16.49)</para></listitem></varlistentry>
1320+
<varlistentry><term>e: <replaceable>expr</replaceable></term><listitem><para>Filter expression applied to both files and folders (e.g. e:Name like
1321+
"Common*.*") (Available since 2.16.56)</para></listitem></varlistentry>
1322+
<varlistentry><term>e!: <replaceable>expr</replaceable></term><listitem><para>Filter expression to exclude both files and folders (Available since
1323+
2.16.56)</para></listitem></varlistentry>
13201324
</variablelist>
13211325

13221326
<para>Parmi les nombreux caractères spéciaux de regex, les suivants sont

Docs/Manual/Hebrew/Filters.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,6 +1239,10 @@ expression. The supported type designators are:</para>
12391239
<varlistentry><term>fe!: <replaceable>expr</replaceable></term><listitem><para>Filter expression to exclude files (Available since 2.16.49)</para></listitem></varlistentry>
12401240
<varlistentry><term>de: <replaceable>expr</replaceable></term><listitem><para>Filter expression for folders (Available since 2.16.49)</para></listitem></varlistentry>
12411241
<varlistentry><term>de!: <replaceable>expr</replaceable></term><listitem><para>Filter expression to exclude folders (Available since 2.16.49)</para></listitem></varlistentry>
1242+
<varlistentry><term>e: <replaceable>expr</replaceable></term><listitem><para>Filter expression applied to both files and folders (e.g. e:Name like
1243+
"Common*.*") (Available since 2.16.56)</para></listitem></varlistentry>
1244+
<varlistentry><term>e!: <replaceable>expr</replaceable></term><listitem><para>Filter expression to exclude both files and folders (Available since
1245+
2.16.56)</para></listitem></varlistentry>
12421246
</variablelist>
12431247

12441248
<para>בין רבים מתווים מיוחדים של regexp, הבאים חשובים במיוחד בכללי מסנן

Docs/Manual/Japanese/Filters.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,8 @@ expression. The supported type designators are:</para>
11291129
<varlistentry><term>fe!: <replaceable>式</replaceable></term><listitem><para>ファイルを除外するためのフィルター式(2.16.49 以降で使用可能)</para></listitem></varlistentry>
11301130
<varlistentry><term>de: <replaceable>式</replaceable></term><listitem><para>フォルダーに対するフィルター式(2.16.49 以降で使用可能)</para></listitem></varlistentry>
11311131
<varlistentry><term>de!: <replaceable>式</replaceable></term><listitem><para>フォルダーを除外するためのフィルター式(2.16.49 以降で使用可能)</para></listitem></varlistentry>
1132+
<varlistentry><term>e: <replaceable>式</replaceable></term><listitem><para>ファイルtpフォルダー両方に適用されるフィルター式(例: e:Name like "Common*.*")(2.16.56 以降で使用可能)</para></listitem></varlistentry>
1133+
<varlistentry><term>e!: <replaceable>式</replaceable></term><listitem><para>ファイルとフォルダー両方を除外するためのフィルター式(2.16.56 以降で使用可能)</para></listitem></varlistentry>
11321134
</variablelist>
11331135

11341136
<para>多くの正規表現の特殊文字の中で、次の文字は、ファイルフィルターでは特に重要です: <indexterm>

Src/FileFilterHelper.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ static std::size_t findSeparator(const String& str, String& prefix, std::size_t
390390
bool allowOnlyBasicSeparators = false;
391391
while (startPos < str.size() && str[startPos] == ' ')
392392
++startPos;
393-
const String prefixes[] = { _T("f:"), _T("d:"), _T("f!:"), _T("d!:"), _T("fe:"), _T("de:"), _T("fe!:"), _T("de!:"), _T("pf:") };
393+
const String prefixes[] = { _T("f:"), _T("d:"), _T("f!:"), _T("d!:"), _T("fe:"), _T("de:"), _T("e:"), _T("fe!:"), _T("de!:"), _T("e!:"), _T("pf:")};
394394
for (const auto& pf : prefixes)
395395
{
396396
if (str.compare(startPos, pf.size(), pf) == 0)
@@ -567,6 +567,20 @@ FileFilterHelper::ParseExtensions(const String &extensions) const
567567
else if (prefix == _T("de!:"))
568568
pRegexOrExpressionFilter->AddFilterExpression(
569569
&pRegexOrExpressionFilter->dirExpressionFiltersExclude, token, 0);
570+
else if (prefix == _T("e:"))
571+
{
572+
pRegexOrExpressionFilter->AddFilterExpression(
573+
&pRegexOrExpressionFilter->fileExpressionFilters, token, 0);
574+
pRegexOrExpressionFilter->AddFilterExpression(
575+
&pRegexOrExpressionFilter->dirExpressionFilters, token, 0);
576+
}
577+
else if (prefix == _T("e!:"))
578+
{
579+
pRegexOrExpressionFilter->AddFilterExpression(
580+
&pRegexOrExpressionFilter->fileExpressionFiltersExclude, token, 0);
581+
pRegexOrExpressionFilter->AddFilterExpression(
582+
&pRegexOrExpressionFilter->dirExpressionFiltersExclude, token, 0);
583+
}
570584
else if (prefix == _T("pf:"))
571585
{
572586
const String path = GetFileFilterPath(token);

Src/FileFilterMgr.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,14 @@ FileFilter * FileFilterMgr::LoadFilterFile(const String& szFilepath, int & error
249249
String str = sLine.substr(3);
250250
AddFilterExpression(pfilter, &pfilter->dirExpressionFilters, str, lineNumber);
251251
}
252+
else if (0 == sLine.compare(0, 2, _T("e:"), 2))
253+
{
254+
// file expression filter
255+
String str = sLine.substr(2);
256+
AddFilterExpression(pfilter, &pfilter->fileExpressionFilters, str, lineNumber);
257+
// directory expression filter
258+
AddFilterExpression(pfilter, &pfilter->dirExpressionFilters, str, lineNumber);
259+
}
252260
else if (0 == sLine.compare(0, 3, _T("f!:"), 3))
253261
{
254262
// file filter
@@ -273,6 +281,14 @@ FileFilter * FileFilterMgr::LoadFilterFile(const String& szFilepath, int & error
273281
String str = sLine.substr(4);
274282
AddFilterExpression(pfilter, &pfilter->dirExpressionFiltersExclude, str, lineNumber);
275283
}
284+
else if (0 == sLine.compare(0, 3, _T("e!:"), 3))
285+
{
286+
// file expression filter
287+
String str = sLine.substr(3);
288+
AddFilterExpression(pfilter, &pfilter->fileExpressionFiltersExclude, str, lineNumber);
289+
// directory expression filter
290+
AddFilterExpression(pfilter, &pfilter->dirExpressionFiltersExclude, str, lineNumber);
291+
}
276292
lineNumber++;
277293
} while (bLinesLeft);
278294

Testing/GoogleTest/FileFilter/FileFilterHelper_test.cpp

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ namespace
115115
filtername = m_fileFilterHelper.GetFileFilterName(filterpath.c_str());
116116
EXPECT_TRUE(filtername.compare(_T("simple include dir")) == 0);
117117

118+
filterpath = m_fileFilterHelper.GetFileFilterPath(_T("simple include file and dir"));
119+
EXPECT_TRUE(filterpath.find_first_of(_T("Filters\\simple_include_both.flt")) != String::npos);
120+
filtername = m_fileFilterHelper.GetFileFilterName(filterpath.c_str());
121+
EXPECT_TRUE(filtername.compare(_T("simple include file and dir")) == 0);
122+
118123
filterpath = m_fileFilterHelper.GetFileFilterPath(_T("error include"));
119124
EXPECT_TRUE(filterpath.find_first_of(_T("Filters\\error_include.flt")) != String::npos);
120125
filtername = m_fileFilterHelper.GetFileFilterName(filterpath.c_str());
@@ -129,7 +134,7 @@ namespace
129134

130135
TEST_F(FileFilterHelperTest, GetFileFilters)
131136
{
132-
int n = 3;
137+
int n = 4;
133138
std::vector<FileFilterInfo> filters = m_fileFilterHelper.GetFileFilters();
134139

135140
for (std::vector<FileFilterInfo>::iterator it = filters.begin(); it != filters.end(); it++)
@@ -146,6 +151,12 @@ namespace
146151
EXPECT_TRUE((*it).description.compare(_T("simple directory filter long description")) == 0);
147152
--n;
148153
}
154+
else if ((*it).name.compare(_T("simple include file and dir")) == 0)
155+
{
156+
EXPECT_TRUE((*it).fullpath.find_first_of(_T("Filters\\simple_include_both.flt")) != String::npos);
157+
EXPECT_TRUE((*it).description.compare(_T("simple file and dir filter long description")) == 0);
158+
--n;
159+
}
149160
else if ((*it).name.compare(_T("error include")) == 0)
150161
{
151162
EXPECT_TRUE((*it).fullpath.find_first_of(_T("Filters\\error_include.flt")) != String::npos);
@@ -245,6 +256,27 @@ namespace
245256
EXPECT_EQ(true, m_fileFilterHelper.includeDir(di));
246257
SetDiffItemRightOnly(_T("abc"), _T("a.b.c"), false, di);
247258
EXPECT_EQ(true, m_fileFilterHelper.includeDir(di));
259+
260+
m_fileFilterHelper.SetMaskOrExpression(_T("pf:simple include file and dir"));
261+
262+
m_fileFilterHelper.SetDiffContext(&ctxt);
263+
SetDiffItem(_T(""), _T("file.exp"), _T("file.exp"), true, di);
264+
EXPECT_EQ(true, m_fileFilterHelper.includeFile(di));
265+
SetDiffItem(_T(""), _T("exp.exp"), _T("exp.exp"), true, di);
266+
EXPECT_EQ(false, m_fileFilterHelper.includeFile(di));
267+
SetDiffItem(_T(""), _T("Common.txt"), _T("Common.txt"), true, di);
268+
EXPECT_EQ(true, m_fileFilterHelper.includeFile(di));
269+
SetDiffItem(_T(""), _T("CommonBak"), _T("CommonBak"), true, di);
270+
EXPECT_EQ(false, m_fileFilterHelper.includeFile(di));
271+
272+
SetDiffItem(_T(""), _T("file.exp"), _T("file.exp"), false, di);
273+
EXPECT_EQ(true, m_fileFilterHelper.includeDir(di));
274+
SetDiffItem(_T(""), _T("exp.exp"), _T("exp.exp"), false, di);
275+
EXPECT_EQ(false, m_fileFilterHelper.includeDir(di));
276+
SetDiffItem(_T(""), _T("Common.txt"), _T("Common.txt"), false, di);
277+
EXPECT_EQ(true, m_fileFilterHelper.includeDir(di));
278+
SetDiffItem(_T(""), _T("CommonBak"), _T("CommonBak"), false, di);
279+
EXPECT_EQ(false, m_fileFilterHelper.includeDir(di));
248280
}
249281

250282
TEST_F(FileFilterHelperTest, SetMaskOrExpression2)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
name: simple include file and dir
2+
desc: simple file and dir filter long description
3+
def: exclude
4+
e: Name like "*.exp" or Name like "Common*"
5+
e!: Name = "exp.exp" or Name like "CommonBak"

0 commit comments

Comments
 (0)