#include <Win32Util.hpp>
#include <util/TimePoint.hpp>
+#include <util/file.hpp>
#include <util/path.hpp>
#include <util/process.hpp>
#include <util/string.hpp>
#include <fmtmacros.hpp>
#include <util/Tokenizer.hpp>
#include <util/expected.hpp>
+#include <util/file.hpp>
#include <util/filesystem.hpp>
#include <util/path.hpp>
std::vector<DirEntry> files;
uint64_t initial_size = 0;
- util::throw_on_error<core::Error>(util::traverse_directory(
- dir, [&](const std::string& path, const bool is_dir) {
- if (is_dir || util::TemporaryFile::is_tmp_file(path)) {
+ util::throw_on_error<core::Error>(
+ util::traverse_directory(dir, [&](const auto& de) {
+ if (de.is_directory() || util::TemporaryFile::is_tmp_file(de.path())) {
return;
}
- DirEntry entry(path);
- if (!entry) {
+ if (!de) {
// Probably some race, ignore.
return;
}
- initial_size += entry.size_on_disk();
- const auto name = Util::base_name(path);
+ initial_size += de.size_on_disk();
+ const auto name = de.path().filename();
if (name == "ccache.conf" || name == "stats") {
throw Fatal(
- FMT("this looks like a local cache directory (found {})", path));
+ FMT("this looks like a local cache directory (found {})", de.path()));
}
- files.emplace_back(std::move(entry));
+ files.emplace_back(de);
}));
std::sort(files.begin(), files.end(), [&](const auto& f1, const auto& f2) {
LOG("Cleaning up {}", m_config.temporary_dir());
core::ensure_dir_exists(m_config.temporary_dir());
- util::traverse_directory(
- m_config.temporary_dir(),
- [now](const std::string& path, bool is_dir) {
- if (is_dir) {
- return;
- }
- DirEntry dir_entry(path, DirEntry::LogOnError::yes);
- if (dir_entry && dir_entry.mtime() + k_tempdir_cleanup_interval < now) {
- util::remove(path);
- }
- })
- .or_else([&](const auto& error) {
- LOG("Failed to clean up {}: {}", m_config.temporary_dir(), error);
- });
+ util::traverse_directory(m_config.temporary_dir(), [now](const auto& de) {
+ if (de.is_directory()) {
+ return;
+ }
+ if (de && de.mtime() + k_tempdir_cleanup_interval < now) {
+ util::remove(de.path());
+ }
+ }).or_else([&](const auto& error) {
+ LOG("Failed to clean up {}: {}", m_config.temporary_dir(), error);
+ });
util::write_file(cleaned_stamp, "");
}
return files;
}
util::throw_on_error<core::Error>(
- util::traverse_directory(dir, [&](const std::string& path, bool is_dir) {
- auto name = Util::base_name(path);
+ util::traverse_directory(dir, [&](const auto& de) {
+ auto name = de.path().filename().string();
if (name == "CACHEDIR.TAG" || name == "stats"
- || util::starts_with(std::string(name), ".nfs")) {
+ || util::starts_with(name, ".nfs")) {
return;
}
- if (!is_dir) {
- files.emplace_back(path);
+ if (!de.is_directory()) {
+ files.emplace_back(de);
}
}));
#include <Logging.hpp>
#include <Win32Util.hpp>
#include <fmtmacros.hpp>
+#include <util/file.hpp>
#include <util/wincompat.hpp>
#ifdef _WIN32
namespace util {
+uint64_t
+DirEntry::size_on_disk() const
+{
+#ifdef _WIN32
+ return util::likely_size_on_disk(size());
+#else
+ return do_stat().st_blocks * 512;
+#endif
+}
+
const DirEntry::stat_t&
DirEntry::do_stat() const
{
#pragma once
#include <util/TimePoint.hpp>
-#include <util/file.hpp>
#include <util/wincompat.hpp>
#include <sys/stat.h>
return do_stat().st_size;
}
-inline uint64_t
-DirEntry::size_on_disk() const
-{
-#ifdef _WIN32
- return util::likely_size_on_disk(size());
-#else
- return do_stat().st_blocks * 512;
-#endif
-}
-
inline bool
DirEntry::is_directory() const
{
if (is_dir) {
traverse_directory(path, visitor);
} else {
- visitor(path.string(), false);
+ visitor(path);
}
}
- visitor(directory.string(), true);
+ visitor(directory);
return {};
}
try {
for (const auto& entry : std::filesystem::directory_iterator(directory)) {
if (entry.is_directory()) {
- traverse_directory(entry.path().string(), visitor);
+ traverse_directory(entry.path(), visitor);
} else {
- visitor(entry.path().string(), entry.is_directory());
+ visitor(entry.path());
}
}
- visitor(directory.string(), true);
+ visitor(directory);
} catch (const std::filesystem::filesystem_error& e) {
return tl::unexpected(e.what());
}
#pragma once
#include <util/Bytes.hpp>
+#include <util/DirEntry.hpp>
#include <util/TimePoint.hpp>
#include <util/types.hpp>
enum class LogFailure { yes, no };
enum class ViaTmpFile { yes, no };
-using TraverseDirectoryVisitor =
- std::function<void(const std::string& path, bool is_dir)>;
+using TraverseDirectoryVisitor = std::function<void(const DirEntry& dir_entry)>;
// Copy a file from `src` to `dest`. If `via_tmp_file` is yes, `src` is copied
// to a temporary file and then renamed to dest.
REQUIRE(fs::create_directory("empty-dir"));
std::vector<std::string> visited;
- auto visitor = [&visited](const std::string& path, bool is_dir) {
- visited.push_back(FMT("[{}] {}", is_dir ? 'd' : 'f', path));
+ auto visitor = [&visited](const auto& de) {
+ visited.push_back(FMT("[{}] {}", de.is_directory() ? 'd' : 'f', de.path()));
};
SUBCASE("traverse nonexistent path")