aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/include/vcpkg-test
diff options
context:
space:
mode:
authorNicole Mazzuca <mazzucan@outlook.com>2019-08-02 16:49:45 -0700
committernicole mazzuca <mazzucan@outlook.com>2019-08-07 16:51:12 -0700
commite79f0dc5328f28b2b3942e2cd0e9b0c1accca4a1 (patch)
tree2324fcb9eadec792148e02f984525dacb8297883 /toolsrc/include/vcpkg-test
parent65cb5cd00cba333e3a41433058e42a114f61fb78 (diff)
downloadvcpkg-e79f0dc5328f28b2b3942e2cd0e9b0c1accca4a1.tar.gz
vcpkg-e79f0dc5328f28b2b3942e2cd0e9b0c1accca4a1.zip
[vcpkg] Make Filesystem::remove_all faster #7570
I added benchmarks to measure how fast the parallel remove_all code was -- it turns out, about 3x slower than stdfs::remove_all. Since this was the case, I removed all of the parallelism and rewrote it serially, and ended up about 30% faster than stdfs::remove_all (in addition to supporting symlinks). In addition, I did the following three orthogonal changes: - simplified the work queue, basing it on Billy O'Neal's idea - Fix warnings on older versions of compilers in tests, by splitting the pragmas out of pch.h. - Ran clang-format on some files In fixing up remove_all, the following changes were made: - On Windows, regular symlinks and directory symlinks are distinct; as an example, to remove directory symlinks (and junctions, for that matter), one must use RemoveDirectory. Only on Windows, I added new `file_type` and `file_status` types, with `file_type` including a new `directory_symlink` enumerator, and `file_status` being exactly the same as the old one except using the new `file_type`. On Unix, I didn't make that change since they don't make a distinction. - I added new `symlink_status` and `status` functions which use the new `file_status` on Windows. - I made `Filesystem::exists` call `fs::exists(status(p))`, as opposed to the old version which called `stdfs::exists` directly. - Added benchmarks to `vcpkg-test/files.cpp`. They test the performance of `remove_all` on small directories (~20 files), with symlinks and without, and on large directories (~2000 files), with symlinks and without.
Diffstat (limited to 'toolsrc/include/vcpkg-test')
-rw-r--r--toolsrc/include/vcpkg-test/util.h78
1 files changed, 52 insertions, 26 deletions
diff --git a/toolsrc/include/vcpkg-test/util.h b/toolsrc/include/vcpkg-test/util.h
index fa650abc8..8a458a3e5 100644
--- a/toolsrc/include/vcpkg-test/util.h
+++ b/toolsrc/include/vcpkg-test/util.h
@@ -1,42 +1,68 @@
+#include <vcpkg-test/catch.h>
+#include <vcpkg/pragmas.h>
+
#include <vcpkg/base/files.h>
#include <vcpkg/statusparagraph.h>
#include <memory>
-namespace vcpkg::Test {
+#define CHECK_EC(ec) \
+ do \
+ { \
+ if (ec) \
+ { \
+ FAIL(ec.message()); \
+ } \
+ } while (0)
-std::unique_ptr<vcpkg::StatusParagraph> make_status_pgh(const char* name,
- const char* depends = "",
- const char* default_features = "",
- const char* triplet = "x86-windows");
+namespace vcpkg::Test
+{
+ std::unique_ptr<vcpkg::StatusParagraph> make_status_pgh(const char* name,
+ const char* depends = "",
+ const char* default_features = "",
+ const char* triplet = "x86-windows");
-std::unique_ptr<vcpkg::StatusParagraph> make_status_feature_pgh(const char* name,
- const char* feature,
- const char* depends = "",
- const char* triplet = "x86-windows");
+ std::unique_ptr<vcpkg::StatusParagraph> make_status_feature_pgh(const char* name,
+ const char* feature,
+ const char* depends = "",
+ const char* triplet = "x86-windows");
-vcpkg::PackageSpec unsafe_pspec(std::string name, vcpkg::Triplet t = vcpkg::Triplet::X86_WINDOWS);
+ vcpkg::PackageSpec unsafe_pspec(std::string name, vcpkg::Triplet t = vcpkg::Triplet::X86_WINDOWS);
-template<class T, class S>
-T&& unwrap(vcpkg::ExpectedT<T, S>&& p)
-{
- REQUIRE(p.has_value());
- return std::move(*p.get());
-}
+ template<class T, class S>
+ T&& unwrap(vcpkg::ExpectedT<T, S>&& p)
+ {
+ REQUIRE(p.has_value());
+ return std::move(*p.get());
+ }
-template<class T>
-T&& unwrap(vcpkg::Optional<T>&& opt)
-{
- REQUIRE(opt.has_value());
- return std::move(*opt.get());
-}
+ template<class T>
+ T&& unwrap(vcpkg::Optional<T>&& opt)
+ {
+ REQUIRE(opt.has_value());
+ return std::move(*opt.get());
+ }
+
+ struct AllowSymlinks
+ {
+ enum Tag : bool
+ {
+ No = false,
+ Yes = true,
+ } tag;
+
+ constexpr AllowSymlinks(Tag tag) noexcept : tag(tag) {}
+
+ constexpr explicit AllowSymlinks(bool b) noexcept : tag(b ? Yes : No) {}
-extern const bool SYMLINKS_ALLOWED;
+ constexpr operator bool() const noexcept { return tag == Yes; }
+ };
-extern const fs::path TEMPORARY_DIRECTORY;
+ AllowSymlinks can_create_symlinks() noexcept;
-void create_symlink(const fs::path& file, const fs::path& target, std::error_code& ec);
+ const fs::path& base_temporary_directory() noexcept;
-void create_directory_symlink(const fs::path& file, const fs::path& target, std::error_code& ec);
+ void create_symlink(const fs::path& file, const fs::path& target, std::error_code& ec);
+ void create_directory_symlink(const fs::path& file, const fs::path& target, std::error_code& ec);
}