From dc74069dfd5c710849e85ce6c338f1e04b366af4 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sat, 10 Jun 2023 11:16:26 +0200 Subject: [PATCH] Added glob pattern support in paths filter --- src/common/model/diagram_filter.cc | 40 +++++++++++++++++++----------- src/common/model/diagram_filter.h | 2 +- src/common/types.h | 2 ++ src/config/config.h | 2 +- src/util/util.cc | 2 +- tests/t00061/.clang-uml | 2 +- tests/test_config_data/filters.yml | 5 ++-- 7 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/common/model/diagram_filter.cc b/src/common/model/diagram_filter.cc index 8ec25be2..0f7663e2 100644 --- a/src/common/model/diagram_filter.cc +++ b/src/common/model/diagram_filter.cc @@ -22,6 +22,7 @@ #include "class_diagram/model/class.h" #include "common/model/package.h" +#include "glob/glob.hpp" #include "include_diagram/model/diagram.h" #include "package_diagram/model/diagram.h" @@ -493,33 +494,44 @@ tvl::value_t context_filter::match(const diagram &d, const element &e) const } paths_filter::paths_filter(filter_t type, const std::filesystem::path &root, - const std::vector &p) + const std::vector &p) : filter_visitor{type} , root_{root} { for (const auto &path : p) { std::filesystem::path absolute_path; - if (path.string().empty() || path.string() == ".") + if (path.empty() || path == ".") absolute_path = root; - else if (path.is_relative()) + else if (std::filesystem::path{path}.is_relative()) absolute_path = root / path; else absolute_path = path; - try { - absolute_path = absolute(absolute_path); - absolute_path = canonical(absolute_path.lexically_normal()); - } - catch (std::filesystem::filesystem_error &e) { - LOG_WARN("Cannot add non-existent path {} to paths filter", - absolute_path.string()); - continue; + bool match_successful{false}; + for (auto &resolved_glob_path : + glob::glob(absolute_path.string(), true)) { + try { + auto resolved_absolute_path = absolute(resolved_glob_path); + resolved_absolute_path = + canonical(resolved_absolute_path.lexically_normal()); + + resolved_absolute_path.make_preferred(); + + paths_.emplace_back(resolved_absolute_path); + + match_successful = true; + } + catch (std::filesystem::filesystem_error &e) { + LOG_WARN("Cannot add non-existent path {} to paths filter", + absolute_path.string()); + continue; + } } - absolute_path.make_preferred(); - - paths_.emplace_back(std::move(absolute_path)); + if (!match_successful) + LOG_WARN( + "Paths filter pattern '{}' did not match any files...", path); } } diff --git a/src/common/model/diagram_filter.h b/src/common/model/diagram_filter.h index 597514f0..5c3e12f5 100644 --- a/src/common/model/diagram_filter.h +++ b/src/common/model/diagram_filter.h @@ -374,7 +374,7 @@ private: struct paths_filter : public filter_visitor { paths_filter(filter_t type, const std::filesystem::path &root, - const std::vector &p); + const std::vector &p); ~paths_filter() override = default; diff --git a/src/common/types.h b/src/common/types.h index 5a2053b6..f7b4baef 100644 --- a/src/common/types.h +++ b/src/common/types.h @@ -235,4 +235,6 @@ std::string to_string(const string_or_regex &sr); using namespace_or_regex = common::or_regex; +struct path_or_regex : public or_regex { }; + } // namespace clanguml::common \ No newline at end of file diff --git a/src/config/config.h b/src/config/config.h index 49130c65..0ee7267e 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -109,7 +109,7 @@ struct filter { std::vector context; - std::vector paths; + std::vector paths; std::vector method_types; }; diff --git a/src/util/util.cc b/src/util/util.cc index 24ce86d7..c7759336 100644 --- a/src/util/util.cc +++ b/src/util/util.cc @@ -134,7 +134,7 @@ std::string get_os_name() #elif _WIN64 return "Windows, 64-bit"; #elif __has_include() - utsname utsn; + struct utsname utsn; // NOLINT uname(&utsn); return fmt::format("{} {} {}", utsn.sysname, utsn.machine, utsn.release); #elif __linux__ diff --git a/tests/t00061/.clang-uml b/tests/t00061/.clang-uml index aa1a3ec6..c7c9ca95 100644 --- a/tests/t00061/.clang-uml +++ b/tests/t00061/.clang-uml @@ -10,6 +10,6 @@ diagrams: namespaces: - clanguml::t00061 paths: - - include/t00061_a.h + - include/*_a.h using_namespace: - clanguml::t00061 \ No newline at end of file diff --git a/tests/test_config_data/filters.yml b/tests/test_config_data/filters.yml index 6d605c24..6182ee34 100644 --- a/tests/test_config_data/filters.yml +++ b/tests/test_config_data/filters.yml @@ -10,9 +10,10 @@ diagrams: - src/**/*.h include: paths: - - class_diagram/ + - class_d*/ - common - - util + - util/*.h + - util/*.cc - main.cc exclude: paths: