aboutsummaryrefslogtreecommitdiff
path: root/build2/filesystem
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-07-08 16:13:58 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-07-08 16:13:58 +0200
commit86576cdd3c8d959ffe93f49b7744a99164f172ee (patch)
tree2430017b085cf7b59e335de8efb571d2bc46bfcf /build2/filesystem
parent6205a2d9eb7db0a25959ae34dc5406f228da92a5 (diff)
Move filesystem-related functions from context to new filesystem files
Diffstat (limited to 'build2/filesystem')
-rw-r--r--build2/filesystem89
1 files changed, 89 insertions, 0 deletions
diff --git a/build2/filesystem b/build2/filesystem
new file mode 100644
index 0000000..1dcf8bd
--- /dev/null
+++ b/build2/filesystem
@@ -0,0 +1,89 @@
+// file : build2/filesystem -*- C++ -*-
+// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef BUILD2_FILESYSTEM
+#define BUILD2_FILESYSTEM
+
+#include <butl/filesystem>
+
+#include <build2/types>
+#include <build2/utility>
+
+// Higher-level filesystem utilities built on top of <butl/filesystem>.
+//
+namespace build2
+{
+ // The dual interface wrapper for the {mk,rm}{file,dir}() functions
+ // below that allows you to use it as a true/false return or a more
+ // detailed enum from <butl/filesystem>
+ //
+ template <typename T>
+ struct fs_status
+ {
+ T v;
+ fs_status (T v): v (v) {};
+ operator T () const {return v;}
+ explicit operator bool () const {return v == T::success;}
+ };
+
+ // Create the directory and print the standard diagnostics starting from
+ // the specified verbosity level.
+ //
+ // Note that this implementation is not suitable if it is expected that the
+ // directory will exist in the majority of cases and performance is
+ // important. See the fsdir{} rule for details.
+ //
+ using mkdir_status = butl::mkdir_status;
+
+ fs_status<mkdir_status>
+ mkdir (const dir_path&, uint16_t verbosity = 1);
+
+ fs_status<mkdir_status>
+ mkdir_p (const dir_path&, uint16_t verbosity = 1);
+
+ // Remove the file and print the standard diagnostics starting from the
+ // specified verbosity level. The second argument is only used in
+ // diagnostics, to print the target name. Passing the path for target will
+ // result in the relative path being printed.
+ //
+ using rmfile_status = butl::rmfile_status;
+
+ template <typename T>
+ fs_status<rmfile_status>
+ rmfile (const path&, const T& target, uint16_t verbosity = 1);
+
+ inline fs_status<rmfile_status>
+ rmfile (const path& f, int verbosity = 1) // Literal overload (int).
+ {
+ return rmfile (f, f, static_cast<uint16_t> (verbosity));
+ }
+
+ // Similar to rmfile() but for directories (note: not -r).
+ //
+ using rmdir_status = butl::rmdir_status;
+
+ template <typename T>
+ fs_status<rmdir_status>
+ rmdir (const dir_path&, const T& target, uint16_t verbosity = 1);
+
+ inline fs_status<rmdir_status>
+ rmdir (const dir_path& d, int verbosity = 1) // Literal overload (int).
+ {
+ return rmdir (d, d, static_cast<uint16_t> (verbosity));
+ }
+
+ // Remove the directory recursively and print the standard diagnostics
+ // starting from the specified verbosity level. Note that this function
+ // returns not_empty if we try to remove a working directory. If the dir
+ // argument is false, then the directory itself is not removed.
+ //
+ // @@ Collides (via ADL) with butl::rmdir_r(), which sucks.
+ //
+ fs_status<rmdir_status>
+ rmdir_r (const dir_path&, bool dir = true, uint16_t verbosity = 1);
+}
+
+#include <build2/filesystem.txx>
+
+#endif // BUILD2_FILESYSTEM