]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Add Util::matches_dir_prefix_or_file helper function
authorJoel Rosdahl <joel@rosdahl.net>
Sat, 18 Apr 2020 16:27:42 +0000 (18:27 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Sat, 18 Apr 2020 16:32:03 +0000 (18:32 +0200)
To be used for “ignore_headers_in_manifest”.

src/Util.cpp
src/Util.hpp
unittest/test_Util.cpp

index 3ff0bac37fe813d96b6ad83bc002580daeb1494c..fdbe7a944d7d93c8ecbfea6cf11be07d06d6b5aa 100644 (file)
@@ -405,6 +405,18 @@ is_absolute_path(string_view path)
   return !path.empty() && path[0] == '/';
 }
 
+bool
+matches_dir_prefix_or_file(nonstd::string_view dir_prefix_or_file,
+                           nonstd::string_view path)
+{
+  return !dir_prefix_or_file.empty() && !path.empty()
+         && dir_prefix_or_file.length() <= path.length()
+         && path.starts_with(dir_prefix_or_file)
+         && (dir_prefix_or_file.length() == path.length()
+             || is_dir_separator(path[dir_prefix_or_file.length()])
+             || is_dir_separator(dir_prefix_or_file.back()));
+}
+
 std::string
 normalize_absolute_path(string_view path)
 {
index 4379f859df55b23a34216d3ce7158ea855760520..9fcf595c0f6c05785eb9261700f47265c3de3fa4 100644 (file)
@@ -216,6 +216,11 @@ is_dir_separator(char ch)
     ;
 }
 
+// Return whether `path` is equal to `dir_prefix_or_file` or if
+// `dir_prefix_or_file` is a directory prefix of `path`.
+bool matches_dir_prefix_or_file(nonstd::string_view dir_prefix_or_file,
+                                nonstd::string_view path);
+
 // Normalize absolute path `path`, not taking symlinks into account.
 //
 // Normalization here means syntactically removing redundant slashes and
index b593d2b905c1586a8fcacdcf2568ff8ecdcebac3..6320d93bd150ec725f28d7f3141b4a9d779e97db 100644 (file)
@@ -375,6 +375,35 @@ TEST_CASE("Util::is_dir_separator")
 #endif
 }
 
+TEST_CASE("Util::matches_dir_prefix_or_file")
+{
+  CHECK(!Util::matches_dir_prefix_or_file("", ""));
+  CHECK(!Util::matches_dir_prefix_or_file("/", ""));
+  CHECK(!Util::matches_dir_prefix_or_file("", "/"));
+
+  CHECK(Util::matches_dir_prefix_or_file("aa", "aa"));
+  CHECK(!Util::matches_dir_prefix_or_file("aaa", "aa"));
+  CHECK(!Util::matches_dir_prefix_or_file("aa", "aaa"));
+  CHECK(!Util::matches_dir_prefix_or_file("aa/", "aa"));
+
+  CHECK(Util::matches_dir_prefix_or_file("/aa/bb", "/aa/bb"));
+  CHECK(!Util::matches_dir_prefix_or_file("/aa/b", "/aa/bb"));
+  CHECK(!Util::matches_dir_prefix_or_file("/aa/bbb", "/aa/bb"));
+
+  CHECK(Util::matches_dir_prefix_or_file("/aa", "/aa/bb"));
+  CHECK(Util::matches_dir_prefix_or_file("/aa/", "/aa/bb"));
+  CHECK(!Util::matches_dir_prefix_or_file("/aa/bb", "/aa"));
+  CHECK(!Util::matches_dir_prefix_or_file("/aa/bb", "/aa/"));
+
+#ifdef _WIN32
+  CHECK(Util::matches_dir_prefix_or_file("\\aa", "\\aa\\bb"));
+  CHECK(Util::matches_dir_prefix_or_file("\\aa\\", "\\aa\\bb"));
+#else
+  CHECK(!Util::matches_dir_prefix_or_file("\\aa", "\\aa\\bb"));
+  CHECK(!Util::matches_dir_prefix_or_file("\\aa\\", "\\aa\\bb"));
+#endif
+}
+
 TEST_CASE("Util::normalize_absolute_path")
 {
   CHECK(Util::normalize_absolute_path("") == "");