Skip to content

Commit 96fd846

Browse files
committed
Fix issue #1646, #1644: Filtering qualified files
1 parent 2ed3328 commit 96fd846

File tree

5 files changed

+32
-18
lines changed

5 files changed

+32
-18
lines changed

Src/DirScan.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -844,9 +844,15 @@ static void CompareDiffItem(FolderCmp &fc, DIFFITEM &di)
844844
{
845845
// 1. Test against filters
846846
if (pCtxt->m_piFilterGlobal==nullptr ||
847-
(nDirs == 2 && pCtxt->m_piFilterGlobal->includeFile(di.diffFileInfo[0].filename, di.diffFileInfo[1].filename)) ||
848-
(nDirs == 3 && pCtxt->m_piFilterGlobal->includeFile(di.diffFileInfo[0].filename, di.diffFileInfo[1].filename, di.diffFileInfo[2].filename))
849-
)
847+
(nDirs == 2 && pCtxt->m_piFilterGlobal->includeFile(
848+
paths::ConcatPath(di.diffFileInfo[0].path, di.diffFileInfo[0].filename),
849+
paths::ConcatPath(di.diffFileInfo[1].path, di.diffFileInfo[1].filename)
850+
)) ||
851+
(nDirs == 3 && pCtxt->m_piFilterGlobal->includeFile(
852+
paths::ConcatPath(di.diffFileInfo[0].path, di.diffFileInfo[0].filename),
853+
paths::ConcatPath(di.diffFileInfo[1].path, di.diffFileInfo[1].filename),
854+
paths::ConcatPath(di.diffFileInfo[2].path, di.diffFileInfo[2].filename)
855+
)))
850856
{
851857
di.diffcode.diffcode |= DIFFCODE::INCLUDED;
852858
di.diffcode.diffcode |= fc.prepAndCompareFiles(di);

Src/FileFilter.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,13 @@ struct FileFilterElement
2929
Poco::RegularExpression regexp; /**< Compiled regular expression */
3030
std::string _regex; /**< Regular expression string to set to Poco::RegularExpression */
3131
int _reOpts; /**< Options to set to Poco::RegularExpression */
32-
FileFilterElement(const std::string& regex, int reOpts) : regexp(regex, reOpts), _regex(regex), _reOpts(reOpts)
32+
bool _fileNameOnly; /**< If true, indicates that the filter matches only filenames */
33+
FileFilterElement(const std::string& regex, int reOpts, bool fileFilter) :
34+
regexp(regex, reOpts), _regex(regex), _reOpts(reOpts), _fileNameOnly(fileFilter && regex.find("\\\\", 0) == String::npos)
3335
{
3436
}
35-
FileFilterElement(const FileFilterElement* element) : regexp(element->_regex, element->_reOpts), _regex(element->_regex), _reOpts(element->_reOpts)
37+
FileFilterElement(const FileFilterElement* element) :
38+
regexp(element->_regex, element->_reOpts), _regex(element->_regex), _reOpts(element->_reOpts), _fileNameOnly(element->_fileNameOnly)
3639
{
3740
}
3841
};

Src/FileFilterMgr.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ using Poco::Glob;
2323
using Poco::icompare;
2424
using Poco::RegularExpression;
2525

26-
static void AddFilterPattern(vector<FileFilterElementPtr> *filterList, String & str);
26+
static void AddFilterPattern(vector<FileFilterElementPtr> *filterList, String & str, bool fileFilter);
2727

2828
/**
2929
* @brief Destructor, frees all filters.
@@ -119,7 +119,7 @@ void FileFilterMgr::DeleteAllFilters()
119119
* @param [in] filterList List where pattern is added.
120120
* @param [in] str Temporary variable (ie, it may be altered)
121121
*/
122-
static void AddFilterPattern(vector<FileFilterElementPtr> *filterList, String & str)
122+
static void AddFilterPattern(vector<FileFilterElementPtr> *filterList, String & str, bool fileFilter)
123123
{
124124
const String& commentLeader = _T("##"); // Starts comment
125125
str = strutils::trim_ws_begin(str);
@@ -145,7 +145,7 @@ static void AddFilterPattern(vector<FileFilterElementPtr> *filterList, String &
145145
re_opts |= RegularExpression::RE_UTF8;
146146
try
147147
{
148-
filterList->push_back(FileFilterElementPtr(new FileFilterElement(regexString, re_opts)));
148+
filterList->push_back(FileFilterElementPtr(new FileFilterElement(regexString, re_opts, fileFilter)));
149149
}
150150
catch (...)
151151
{
@@ -218,25 +218,25 @@ FileFilter * FileFilterMgr::LoadFilterFile(const String& szFilepath, int & error
218218
{
219219
// file filter
220220
String str = sLine.substr(2);
221-
AddFilterPattern(&pfilter->filefilters, str);
221+
AddFilterPattern(&pfilter->filefilters, str, true);
222222
}
223223
else if (0 == sLine.compare(0, 2, _T("d:"), 2))
224224
{
225225
// directory filter
226226
String str = sLine.substr(2);
227-
AddFilterPattern(&pfilter->dirfilters, str);
227+
AddFilterPattern(&pfilter->dirfilters, str, false);
228228
}
229229
else if (0 == sLine.compare(0, 3, _T("f!:"), 3))
230230
{
231231
// file filter
232232
String str = sLine.substr(3);
233-
AddFilterPattern(&pfilter->filefiltersExclude, str);
233+
AddFilterPattern(&pfilter->filefiltersExclude, str, true);
234234
}
235235
else if (0 == sLine.compare(0, 3, _T("d!:"), 3))
236236
{
237237
// directory filter
238238
String str = sLine.substr(3);
239-
AddFilterPattern(&pfilter->dirfiltersExclude, str);
239+
AddFilterPattern(&pfilter->dirfiltersExclude, str, false);
240240
}
241241
} while (bLinesLeft);
242242

@@ -289,15 +289,17 @@ bool TestAgainstRegList(const vector<FileFilterElementPtr> *filterList, const St
289289
if (filterList->size() == 0)
290290
return false;
291291

292-
std::string compString;
292+
std::string compString, compStringFileName;
293293
ucr::toUTF8(szTest, compString);
294294
vector<FileFilterElementPtr>::const_iterator iter = filterList->begin();
295295
while (iter != filterList->end())
296296
{
297297
RegularExpression::Match match;
298298
try
299299
{
300-
if ((*iter)->regexp.match(compString, 0, match) > 0)
300+
if ((*iter)->_fileNameOnly && compStringFileName.empty())
301+
ucr::toUTF8(paths::FindFileName(szTest), compStringFileName);
302+
if ((*iter)->regexp.match((*iter)->_fileNameOnly ? compStringFileName : compString, 0, match) > 0)
301303
return true;
302304
}
303305
catch (...)

Src/FolderCmp.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,12 @@ int FolderCmp::prepAndCompareFiles(DIFFITEM &di)
7878
nCompMethod = CMP_BINARY_CONTENT;
7979
}
8080
else if (m_pCtxt->m_bEnableImageCompare && (
81-
di.diffFileInfo[0].size != DirItem::FILE_SIZE_NONE && m_pCtxt->m_pImgfileFilter->includeFile(di.diffFileInfo[0].filename) ||
82-
di.diffFileInfo[1].size != DirItem::FILE_SIZE_NONE && m_pCtxt->m_pImgfileFilter->includeFile(di.diffFileInfo[1].filename) ||
83-
nDirs > 2 && di.diffFileInfo[2].size != DirItem::FILE_SIZE_NONE && m_pCtxt->m_pImgfileFilter->includeFile(di.diffFileInfo[2].filename)))
81+
di.diffFileInfo[0].size != DirItem::FILE_SIZE_NONE && m_pCtxt->m_pImgfileFilter->includeFile(
82+
paths::ConcatPath(di.diffFileInfo[0].path, di.diffFileInfo[0].filename)) ||
83+
di.diffFileInfo[1].size != DirItem::FILE_SIZE_NONE && m_pCtxt->m_pImgfileFilter->includeFile(
84+
paths::ConcatPath(di.diffFileInfo[1].path, di.diffFileInfo[1].filename)) ||
85+
nDirs > 2 && di.diffFileInfo[2].size != DirItem::FILE_SIZE_NONE && m_pCtxt->m_pImgfileFilter->includeFile(
86+
paths::ConcatPath(di.diffFileInfo[2].path, di.diffFileInfo[2].filename))))
8487
{
8588
nCompMethod = CMP_IMAGE_CONTENT;
8689
}

Src/Plugins.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ void PluginInfo::LoadFilterString()
246246
re_opts |= RegularExpression::RE_UTF8;
247247
try
248248
{
249-
m_filters.emplace_back(std::make_shared<FileFilterElement>(regexString, re_opts));
249+
m_filters.emplace_back(std::make_shared<FileFilterElement>(regexString, re_opts, true));
250250
}
251251
catch (...)
252252
{

0 commit comments

Comments
 (0)