]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Add Util::ensure_dir_exists
authorJoel Rosdahl <joel@rosdahl.net>
Tue, 8 Sep 2020 18:05:43 +0000 (20:05 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Tue, 8 Sep 2020 18:31:54 +0000 (20:31 +0200)
src/Util.cpp
src/Util.hpp
unittest/test_Util.cpp

index 644864b9dbc4d2c909ecece5187d87aa363ff904..78e3d84452920720e2e662cd94eb3af0885f83da 100644 (file)
@@ -556,6 +556,14 @@ format_parsable_size_with_suffix(uint64_t size)
   }
 }
 
+void
+ensure_dir_exists(nonstd::string_view dir)
+{
+  if (!create_dir(dir)) {
+    throw Fatal("Failed to create directory {}: {}", dir, strerror(errno));
+  }
+}
+
 std::string
 get_actual_cwd()
 {
index c0007803193d264a7b9e40817fd7987c08b9497e..834f9f74e54be4a97477dacbca474eb719ae0931 100644 (file)
@@ -124,6 +124,9 @@ ends_with(nonstd::string_view string, nonstd::string_view suffix)
   return string.ends_with(suffix);
 }
 
+// Like create_dir but throws Fatal on error.
+void ensure_dir_exists(nonstd::string_view dir);
+
 // Expand all instances of $VAR or ${VAR}, where VAR is an environment variable,
 // in `str`. Throws `Error` if one of the environment variables.
 [[nodiscard]] std::string expand_environment_variables(const std::string& str);
index 077a8660ac16c87840c2e0ae7a20a7b092659ed5..154ab509e4bfbdfcab57319218e307a6530c6afb 100644 (file)
@@ -163,6 +163,21 @@ TEST_CASE("Util::ends_with")
   CHECK_FALSE(Util::ends_with("x", "xy"));
 }
 
+TEST_CASE("Util::ensure_dir_exists")
+{
+  TestContext test_context;
+
+  CHECK_NOTHROW(Util::ensure_dir_exists("/"));
+
+  CHECK_NOTHROW(Util::ensure_dir_exists("create/dir"));
+  CHECK(Stat::stat("create/dir").is_directory());
+
+  Util::write_file("create/dir/file", "");
+  CHECK_THROWS_WITH(
+    Util::ensure_dir_exists("create/dir/file"),
+    "Failed to create directory create/dir/file: Not a directory");
+}
+
 TEST_CASE("Util::expand_environment_variables")
 {
   Util::setenv("FOO", "bar");