Skip to content

Commit 5b52f49

Browse files
authored
Implement support for passing multiple file filters (#3479)
1 parent b80e242 commit 5b52f49

7 files changed

Lines changed: 26 additions & 16 deletions

File tree

cli/cmdlineparser.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
362362

363363
// use a file filter
364364
else if (std::strncmp(argv[i], "--file-filter=", 14) == 0)
365-
mSettings->fileFilter = argv[i] + 14;
365+
mSettings->fileFilters.push_back(argv[i] + 14);
366366

367367
// file list specified
368368
else if (std::strncmp(argv[i], "--file-list=", 12) == 0)
@@ -1055,6 +1055,7 @@ void CmdLineParser::printHelp()
10551055
" Used when certain messages should be displayed but\n"
10561056
" should not cause a non-zero exitcode.\n"
10571057
" --file-filter=<str> Analyze only those files matching the given filter str\n"
1058+
" Can be used multiple times\n"
10581059
" Example: --file-filter=*bar.cpp analyzes only files\n"
10591060
" that end with bar.cpp.\n"
10601061
" --file-list=<file> Specify the files to check in a text file. Add one\n"

cli/cppcheckexecutor.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,12 +167,12 @@ bool CppCheckExecutor::parseFromArgs(CppCheck *cppcheck, int argc, const char* c
167167
#else
168168
const bool caseSensitive = true;
169169
#endif
170-
if (!mSettings->project.fileSettings.empty() && !mSettings->fileFilter.empty()) {
170+
if (!mSettings->project.fileSettings.empty() && !mSettings->fileFilters.empty()) {
171171
// filter only for the selected filenames from all project files
172172
std::list<ImportProject::FileSettings> newList;
173173

174174
for (const ImportProject::FileSettings &fsetting : settings.project.fileSettings) {
175-
if (matchglob(mSettings->fileFilter, fsetting.filename)) {
175+
if (matchglobs(mSettings->fileFilters, fsetting.filename)) {
176176
newList.emplace_back(fsetting);
177177
}
178178
}
@@ -198,10 +198,10 @@ bool CppCheckExecutor::parseFromArgs(CppCheck *cppcheck, int argc, const char* c
198198
if (!ignored.empty())
199199
std::cout << "cppcheck: Maybe all paths were ignored?" << std::endl;
200200
return false;
201-
} else if (!mSettings->fileFilter.empty() && settings.project.fileSettings.empty()) {
201+
} else if (!mSettings->fileFilters.empty() && settings.project.fileSettings.empty()) {
202202
std::map<std::string, std::size_t> newMap;
203203
for (std::map<std::string, std::size_t>::const_iterator i = mFiles.begin(); i != mFiles.end(); ++i)
204-
if (matchglob(mSettings->fileFilter, i->first)) {
204+
if (matchglobs(mSettings->fileFilters, i->first)) {
205205
newMap[i->first] = i->second;
206206
}
207207
mFiles = newMap;

lib/importproject.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -195,19 +195,20 @@ ImportProject::Type ImportProject::import(const std::string &filename, Settings
195195
if (!mPath.empty() && !endsWith(mPath,'/'))
196196
mPath += '/';
197197

198-
const std::string fileFilter = settings ? settings->fileFilter : std::string();
198+
const std::vector<std::string> fileFilters =
199+
settings ? settings->fileFilters : std::vector<std::string>();
199200

200201
if (endsWith(filename, ".json")) {
201202
importCompileCommands(fin);
202203
setRelativePaths(filename);
203204
return ImportProject::Type::COMPILE_DB;
204205
} else if (endsWith(filename, ".sln")) {
205-
importSln(fin, mPath, fileFilter);
206+
importSln(fin, mPath, fileFilters);
206207
setRelativePaths(filename);
207208
return ImportProject::Type::VS_SLN;
208209
} else if (endsWith(filename, ".vcxproj")) {
209210
std::map<std::string, std::string, cppcheck::stricmp> variables;
210-
importVcxproj(filename, variables, emptyString, fileFilter);
211+
importVcxproj(filename, variables, emptyString, fileFilters);
211212
setRelativePaths(filename);
212213
return ImportProject::Type::VS_VCXPROJ;
213214
} else if (endsWith(filename, ".bpr")) {
@@ -447,7 +448,7 @@ void ImportProject::importCompileCommands(std::istream &istr)
447448
}
448449
}
449450

450-
void ImportProject::importSln(std::istream &istr, const std::string &path, const std::string &fileFilter)
451+
void ImportProject::importSln(std::istream &istr, const std::string &path, const std::vector<std::string> &fileFilters)
451452
{
452453
std::map<std::string,std::string,cppcheck::stricmp> variables;
453454
variables["SolutionDir"] = path;
@@ -465,7 +466,7 @@ void ImportProject::importSln(std::istream &istr, const std::string &path, const
465466
std::string vcxproj(line.substr(pos1+1, pos-pos1+7));
466467
if (!Path::isAbsolute(vcxproj))
467468
vcxproj = path + vcxproj;
468-
importVcxproj(Path::fromNativeSeparators(vcxproj), variables, emptyString, fileFilter);
469+
importVcxproj(Path::fromNativeSeparators(vcxproj), variables, emptyString, fileFilters);
469470
}
470471
}
471472

@@ -658,7 +659,7 @@ static void loadVisualStudioProperties(const std::string &props, std::map<std::s
658659
}
659660
}
660661

661-
void ImportProject::importVcxproj(const std::string &filename, std::map<std::string, std::string, cppcheck::stricmp> &variables, const std::string &additionalIncludeDirectories, const std::string &fileFilter)
662+
void ImportProject::importVcxproj(const std::string &filename, std::map<std::string, std::string, cppcheck::stricmp> &variables, const std::string &additionalIncludeDirectories, const std::vector<std::string> &fileFilters)
662663
{
663664
variables["ProjectDir"] = Path::simplifyPath(Path::getPathFromFilename(filename));
664665

@@ -718,7 +719,7 @@ void ImportProject::importVcxproj(const std::string &filename, std::map<std::str
718719

719720
for (const std::string &c : compileList) {
720721
const std::string cfilename = Path::simplifyPath(Path::isAbsolute(c) ? c : Path::getPathFromFilename(filename) + c);
721-
if (!fileFilter.empty() && !matchglob(fileFilter, cfilename))
722+
if (!fileFilters.empty() && !matchglobs(fileFilters, cfilename))
722723
continue;
723724

724725
for (const ProjectConfiguration &p : projectConfigurationList) {

lib/importproject.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ class CPPCHECKLIB ImportProject {
109109
void importCompileCommands(std::istream &istr);
110110
bool importCppcheckGuiProject(std::istream &istr, Settings *settings);
111111
private:
112-
void importSln(std::istream &istr, const std::string &path, const std::string &fileFilter);
113-
void importVcxproj(const std::string &filename, std::map<std::string, std::string, cppcheck::stricmp> &variables, const std::string &additionalIncludeDirectories, const std::string &fileFilter);
112+
void importSln(std::istream &istr, const std::string &path, const std::vector<std::string> &fileFilters);
113+
void importVcxproj(const std::string &filename, std::map<std::string, std::string, cppcheck::stricmp> &variables, const std::string &additionalIncludeDirectories, const std::vector<std::string> &fileFilters);
114114
void importBcb6Prj(const std::string &projectFilename);
115115

116116
void setRelativePaths(const std::string &filename);

lib/settings.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ class CPPCHECKLIB Settings : public cppcheck::Platform {
193193
Default value is 0. */
194194
int exitCode;
195195

196-
/** @brief --file-filter for analyzing special files */
197-
std::string fileFilter;
196+
/** @brief List of --file-filter for analyzing special files */
197+
std::vector<std::string> fileFilters;
198198

199199
/** @brief Force checking the files with "too many" configurations (--force). */
200200
bool force;

lib/utils.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,9 @@ bool matchglob(const std::string& pattern, const std::string& name)
112112
n++;
113113
}
114114
}
115+
116+
bool matchglobs(const std::vector<std::string> &patterns, const std::string &name) {
117+
return std::any_of(begin(patterns), end(patterns), [&name](const std::string &pattern) {
118+
return matchglob(pattern, name);
119+
});
120+
}

lib/utils.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ CPPCHECKLIB bool isValidGlobPattern(const std::string& pattern);
152152

153153
CPPCHECKLIB bool matchglob(const std::string& pattern, const std::string& name);
154154

155+
CPPCHECKLIB bool matchglobs(const std::vector<std::string> &patterns, const std::string &name);
156+
155157
#define UNUSED(x) (void)(x)
156158

157159
// Use the nonneg macro when you want to assert that a variable/argument is not negative

0 commit comments

Comments
 (0)