Support/PathV2: Implement remove_all.
authorMichael J. Spencer <bigcheesegs@gmail.com>
Wed, 5 Jan 2011 16:39:38 +0000 (16:39 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Wed, 5 Jan 2011 16:39:38 +0000 (16:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122884 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/PathV2.cpp

index 481a0387786c0908be0bf850a2ddea2ac6ea701d..3b232abf7d00e7edfccfdcb1019268522d327971 100644 (file)
@@ -697,6 +697,43 @@ error_code has_magic(const Twine &path, const Twine &magic, bool &result) {
   return success;
 }
 
+namespace {
+error_code remove_all_r(StringRef path, file_type ft, uint32_t &count) {
+  if (ft == file_type::directory_file) {
+    // This code would be a lot better with exceptions ;/.
+    error_code ec;
+    for (directory_iterator i(path, ec), e; i != e; i.increment(ec)) {
+      if (ec) return ec;
+      file_status st;
+      if (error_code ec = i->status(st)) return ec;
+      if (error_code ec = remove_all_r(i->path(), st.type(), count)) return ec;
+    }
+    bool obviously_this_exists;
+    if (error_code ec = remove(path, obviously_this_exists)) return ec;
+    assert(obviously_this_exists);
+    ++count; // Include the directory itself in the items removed.
+  } else {
+    bool obviously_this_exists;
+    if (error_code ec = remove(path, obviously_this_exists)) return ec;
+    assert(obviously_this_exists);
+    ++count;
+  }
+
+  return success;
+}
+}
+
+error_code remove_all(const Twine &path, uint32_t &num_removed) {
+  SmallString<128> path_storage;
+  StringRef p = path.toStringRef(path_storage);
+
+  file_status fs;
+  if (error_code ec = status(path, fs))
+    return ec;
+  num_removed = 0;
+  return remove_all_r(p, fs.type(), num_removed);
+}
+
 error_code directory_entry::status(file_status &result) const {
   return fs::status(Path, result);
 }