From a3e42ff85f1e1861234bbe0ed2df285dbdf9d78e Mon Sep 17 00:00:00 2001 From: Leon De Andrade Date: Mon, 4 Oct 2021 17:36:12 +0200 Subject: [PATCH 1/5] Implement support for passing multiple file filters --- cli/cmdlineparser.cpp | 2 +- cli/cppcheckexecutor.cpp | 8 ++++---- lib/importproject.cpp | 16 ++++++++-------- lib/importproject.h | 4 ++-- lib/settings.h | 4 ++-- lib/utils.cpp | 6 ++++++ lib/utils.h | 3 +++ 7 files changed, 26 insertions(+), 17 deletions(-) diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 3d0dcd32cb1..df34e6d28e7 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -362,7 +362,7 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[]) // use a file filter else if (std::strncmp(argv[i], "--file-filter=", 14) == 0) - mSettings->fileFilter = argv[i] + 14; + mSettings->fileFilters.push_back(argv[i] + 14); // file list specified else if (std::strncmp(argv[i], "--file-list=", 12) == 0) diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index 3cef91f8727..97cc5867227 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -161,12 +161,12 @@ bool CppCheckExecutor::parseFromArgs(CppCheck *cppcheck, int argc, const char* c #else const bool caseSensitive = true; #endif - if (!mSettings->project.fileSettings.empty() && !mSettings->fileFilter.empty()) { + if (!mSettings->project.fileSettings.empty() && !mSettings->fileFilters.empty()) { // filter only for the selected filenames from all project files std::list newList; for (const ImportProject::FileSettings &fsetting : settings.project.fileSettings) { - if (matchglob(mSettings->fileFilter, fsetting.filename)) { + if (matchglobs(mSettings->fileFilters, fsetting.filename)) { newList.emplace_back(fsetting); } } @@ -192,10 +192,10 @@ bool CppCheckExecutor::parseFromArgs(CppCheck *cppcheck, int argc, const char* c if (!ignored.empty()) std::cout << "cppcheck: Maybe all paths were ignored?" << std::endl; return false; - } else if (!mSettings->fileFilter.empty() && settings.project.fileSettings.empty()) { + } else if (!mSettings->fileFilters.empty() && settings.project.fileSettings.empty()) { std::map newMap; for (std::map::const_iterator i = mFiles.begin(); i != mFiles.end(); ++i) - if (matchglob(mSettings->fileFilter, i->first)) { + if (matchglobs(mSettings->fileFilters, i->first)) { newMap[i->first] = i->second; } mFiles = newMap; diff --git a/lib/importproject.cpp b/lib/importproject.cpp index 4ce6ac4f022..e7c4ece55b8 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -195,19 +195,19 @@ ImportProject::Type ImportProject::import(const std::string &filename, Settings if (!mPath.empty() && !endsWith(mPath,'/')) mPath += '/'; - const std::string fileFilter = settings ? settings->fileFilter : std::string(); + const std::list fileFilters = settings ? settings->fileFilters : std::list(); if (endsWith(filename, ".json")) { importCompileCommands(fin); setRelativePaths(filename); return ImportProject::Type::COMPILE_DB; } else if (endsWith(filename, ".sln")) { - importSln(fin, mPath, fileFilter); + importSln(fin, mPath, fileFilters); setRelativePaths(filename); return ImportProject::Type::VS_SLN; } else if (endsWith(filename, ".vcxproj")) { std::map variables; - importVcxproj(filename, variables, emptyString, fileFilter); + importVcxproj(filename, variables, emptyString, fileFilters); setRelativePaths(filename); return ImportProject::Type::VS_VCXPROJ; } else if (endsWith(filename, ".bpr")) { @@ -447,7 +447,7 @@ void ImportProject::importCompileCommands(std::istream &istr) } } -void ImportProject::importSln(std::istream &istr, const std::string &path, const std::string &fileFilter) +void ImportProject::importSln(std::istream &istr, const std::string &path, const std::list &fileFilters) { std::map variables; variables["SolutionDir"] = path; @@ -465,7 +465,7 @@ void ImportProject::importSln(std::istream &istr, const std::string &path, const std::string vcxproj(line.substr(pos1+1, pos-pos1+7)); if (!Path::isAbsolute(vcxproj)) vcxproj = path + vcxproj; - importVcxproj(Path::fromNativeSeparators(vcxproj), variables, emptyString, fileFilter); + importVcxproj(Path::fromNativeSeparators(vcxproj), variables, emptyString, fileFilters); } } @@ -658,7 +658,7 @@ static void loadVisualStudioProperties(const std::string &props, std::map &variables, const std::string &additionalIncludeDirectories, const std::string &fileFilter) +void ImportProject::importVcxproj(const std::string &filename, std::map &variables, const std::string &additionalIncludeDirectories, const std::list &fileFilters) { variables["ProjectDir"] = Path::simplifyPath(Path::getPathFromFilename(filename)); @@ -718,8 +718,8 @@ void ImportProject::importVcxproj(const std::string &filename, std::map &variables, const std::string &additionalIncludeDirectories, const std::string &fileFilter); + void importSln(std::istream &istr, const std::string &path, const std::list &fileFilters); + void importVcxproj(const std::string &filename, std::map &variables, const std::string &additionalIncludeDirectories, const std::list &fileFilters); void importBcb6Prj(const std::string &projectFilename); void setRelativePaths(const std::string &filename); diff --git a/lib/settings.h b/lib/settings.h index 9c080a91ac8..f5d4e9d20bf 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -191,8 +191,8 @@ class CPPCHECKLIB Settings : public cppcheck::Platform { Default value is 0. */ int exitCode; - /** @brief --file-filter for analyzing special files */ - std::string fileFilter; + /** @brief List of --file-filter for analyzing special files */ + std::list fileFilters; /** @brief Force checking the files with "too many" configurations (--force). */ bool force; diff --git a/lib/utils.cpp b/lib/utils.cpp index cb0de92c7ae..c55efec68cc 100644 --- a/lib/utils.cpp +++ b/lib/utils.cpp @@ -112,3 +112,9 @@ bool matchglob(const std::string& pattern, const std::string& name) n++; } } + +bool matchglobs(const std::list &patterns, const std::string &name) { + return std::any_of(begin(patterns), end(patterns), [&name](const std::string &pattern) { + return matchglob(pattern, name); + }); +} diff --git a/lib/utils.h b/lib/utils.h index 41edc3a518b..c8c412c4227 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -152,6 +153,8 @@ CPPCHECKLIB bool isValidGlobPattern(const std::string& pattern); CPPCHECKLIB bool matchglob(const std::string& pattern, const std::string& name); +CPPCHECKLIB bool matchglobs(const std::list &patterns, const std::string &name); + #define UNUSED(x) (void)(x) // Use the nonneg macro when you want to assert that a variable/argument is not negative From c4c3288f9fec5c583068159ae5b66c4bd264442f Mon Sep 17 00:00:00 2001 From: Leon De Andrade Date: Tue, 5 Oct 2021 09:02:29 +0200 Subject: [PATCH 2/5] Use std::vector --- cli/cmdlineparser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index df34e6d28e7..00ca4fc3908 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -1055,6 +1055,7 @@ void CmdLineParser::printHelp() " Used when certain messages should be displayed but\n" " should not cause a non-zero exitcode.\n" " --file-filter= Analyze only those files matching the given filter str\n" + " Can be used multiple times\n" " Example: --file-filter=*bar.cpp analyzes only files\n" " that end with bar.cpp.\n" " --file-list= Specify the files to check in a text file. Add one\n" From 63cc2ab01a8bded9d7366ac4bc5b037dd2e71921 Mon Sep 17 00:00:00 2001 From: Leon De Andrade Date: Tue, 5 Oct 2021 09:02:41 +0200 Subject: [PATCH 3/5] Use std::vector --- lib/importproject.cpp | 9 +++++---- lib/importproject.h | 4 ++-- lib/settings.h | 2 +- lib/utils.cpp | 6 +++--- lib/utils.h | 2 +- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/importproject.cpp b/lib/importproject.cpp index e7c4ece55b8..d86d9450fc1 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -195,7 +195,8 @@ ImportProject::Type ImportProject::import(const std::string &filename, Settings if (!mPath.empty() && !endsWith(mPath,'/')) mPath += '/'; - const std::list fileFilters = settings ? settings->fileFilters : std::list(); + const std::vector fileFilters = + settings ? settings->fileFilters : std::vector(); if (endsWith(filename, ".json")) { importCompileCommands(fin); @@ -447,7 +448,7 @@ void ImportProject::importCompileCommands(std::istream &istr) } } -void ImportProject::importSln(std::istream &istr, const std::string &path, const std::list &fileFilters) +void ImportProject::importSln(std::istream &istr, const std::string &path, const std::vector &fileFilters) { std::map variables; variables["SolutionDir"] = path; @@ -658,7 +659,7 @@ static void loadVisualStudioProperties(const std::string &props, std::map &variables, const std::string &additionalIncludeDirectories, const std::list &fileFilters) +void ImportProject::importVcxproj(const std::string &filename, std::map &variables, const std::string &additionalIncludeDirectories, const std::vector &fileFilters) { variables["ProjectDir"] = Path::simplifyPath(Path::getPathFromFilename(filename)); @@ -719,7 +720,7 @@ void ImportProject::importVcxproj(const std::string &filename, std::map &fileFilters); - void importVcxproj(const std::string &filename, std::map &variables, const std::string &additionalIncludeDirectories, const std::list &fileFilters); + void importSln(std::istream &istr, const std::string &path, const std::vector &fileFilters); + void importVcxproj(const std::string &filename, std::map &variables, const std::string &additionalIncludeDirectories, const std::vector &fileFilters); void importBcb6Prj(const std::string &projectFilename); void setRelativePaths(const std::string &filename); diff --git a/lib/settings.h b/lib/settings.h index f5d4e9d20bf..1303e180f0b 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -192,7 +192,7 @@ class CPPCHECKLIB Settings : public cppcheck::Platform { int exitCode; /** @brief List of --file-filter for analyzing special files */ - std::list fileFilters; + std::vector fileFilters; /** @brief Force checking the files with "too many" configurations (--force). */ bool force; diff --git a/lib/utils.cpp b/lib/utils.cpp index c55efec68cc..7dcbe948daf 100644 --- a/lib/utils.cpp +++ b/lib/utils.cpp @@ -113,8 +113,8 @@ bool matchglob(const std::string& pattern, const std::string& name) } } -bool matchglobs(const std::list &patterns, const std::string &name) { - return std::any_of(begin(patterns), end(patterns), [&name](const std::string &pattern) { - return matchglob(pattern, name); +bool matchglobs(const std::vector &patterns, const std::string &name) { + return std::any_of(begin(patterns), end(patterns), [&name](const std::string &pattern) { + return matchglob(pattern, name); }); } diff --git a/lib/utils.h b/lib/utils.h index c8c412c4227..abc2fb265f1 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -153,7 +153,7 @@ CPPCHECKLIB bool isValidGlobPattern(const std::string& pattern); CPPCHECKLIB bool matchglob(const std::string& pattern, const std::string& name); -CPPCHECKLIB bool matchglobs(const std::list &patterns, const std::string &name); +CPPCHECKLIB bool matchglobs(const std::vector &patterns, const std::string &name); #define UNUSED(x) (void)(x) From 774c0364109191f1d3f007c1f9686a24ca5e90bb Mon Sep 17 00:00:00 2001 From: Leon De Andrade Date: Tue, 5 Oct 2021 12:37:34 +0200 Subject: [PATCH 4/5] Fix formatting --- lib/utils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/utils.cpp b/lib/utils.cpp index 7dcbe948daf..7f5c8c5edfe 100644 --- a/lib/utils.cpp +++ b/lib/utils.cpp @@ -115,6 +115,6 @@ bool matchglob(const std::string& pattern, const std::string& name) bool matchglobs(const std::vector &patterns, const std::string &name) { return std::any_of(begin(patterns), end(patterns), [&name](const std::string &pattern) { - return matchglob(pattern, name); + return matchglob(pattern, name); }); } From 9dafdd9821001d084ff57d0e67d66caded64ecf8 Mon Sep 17 00:00:00 2001 From: Leon De Andrade Date: Fri, 15 Oct 2021 11:03:40 +0200 Subject: [PATCH 5/5] Remove redundant include --- lib/utils.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/utils.h b/lib/utils.h index abc2fb265f1..ec473342b56 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -26,7 +26,6 @@ #include #include #include -#include #include #include