mirror of
https://github.com/gulrak/filesystem.git
synced 2026-11-10 23:29:59 +08:00
Add symlink handling tests and fix recursive_directory_iterator behavior with symlinks (refs #178)
This commit is contained in:
parent
73212968f6
commit
09540bf5e7
@ -669,6 +669,8 @@ to the expected behavior.
|
|||||||
`last_write_time()` now consistently follows symlinks.
|
`last_write_time()` now consistently follows symlinks.
|
||||||
* Fix for [#208](https://github.com/gulrak/filesystem/issues/208), filesystem
|
* Fix for [#208](https://github.com/gulrak/filesystem/issues/208), filesystem
|
||||||
metadata now preserves subsecond modification times.
|
metadata now preserves subsecond modification times.
|
||||||
|
* Fix for [#178](https://github.com/gulrak/filesystem/issues/178), recursive
|
||||||
|
iteration no longer resolves symlinks unless requested.
|
||||||
* Fix for [#185](https://github.com/gulrak/filesystem/issues/185),
|
* Fix for [#185](https://github.com/gulrak/filesystem/issues/185),
|
||||||
`lexically_normal()` now preserves unresolved parent components in relative
|
`lexically_normal()` now preserves unresolved parent components in relative
|
||||||
paths.
|
paths.
|
||||||
|
|||||||
@ -6047,12 +6047,13 @@ GHC_INLINE recursive_directory_iterator& recursive_directory_iterator::operator+
|
|||||||
GHC_INLINE recursive_directory_iterator& recursive_directory_iterator::increment(std::error_code& ec) noexcept
|
GHC_INLINE recursive_directory_iterator& recursive_directory_iterator::increment(std::error_code& ec) noexcept
|
||||||
{
|
{
|
||||||
bool isSymLink = (*this)->is_symlink(ec);
|
bool isSymLink = (*this)->is_symlink(ec);
|
||||||
bool isDir = !ec && (*this)->is_directory(ec);
|
const bool followSymlink = (options() & directory_options::follow_directory_symlink) != directory_options::none;
|
||||||
|
bool isDir = !ec && (!isSymLink || followSymlink) && (*this)->is_directory(ec);
|
||||||
if (isSymLink && detail::is_not_found_error(ec)) {
|
if (isSymLink && detail::is_not_found_error(ec)) {
|
||||||
ec.clear();
|
ec.clear();
|
||||||
}
|
}
|
||||||
if (!ec) {
|
if (!ec) {
|
||||||
if (recursion_pending() && isDir && (!isSymLink || (options() & directory_options::follow_directory_symlink) != directory_options::none)) {
|
if (recursion_pending() && isDir) {
|
||||||
_impl->_dir_iter_stack.push(directory_iterator((*this)->path(), _impl->_options, ec));
|
_impl->_dir_iter_stack.push(directory_iterator((*this)->path(), _impl->_options, ec));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@ -1681,6 +1681,21 @@ TEST_CASE("fs.class.rec.dir.itr - class recursive_directory_iterator", "[filesys
|
|||||||
}
|
}
|
||||||
CHECK(os.str() == "d2/b,d2/ds1,d2/ds2,");
|
CHECK(os.str() == "d2/b,d2/ds1,d2/ds2,");
|
||||||
}
|
}
|
||||||
|
if (is_symlink_creation_supported()) {
|
||||||
|
TemporaryDirectory t(TempOpt::change_path);
|
||||||
|
generateFile("regular");
|
||||||
|
fs::create_symlink("self", "self");
|
||||||
|
std::multiset<std::string> result;
|
||||||
|
REQUIRE_NOTHROW([&]() {
|
||||||
|
for (const auto& de : fs::recursive_directory_iterator(".")) {
|
||||||
|
result.insert(de.path().generic_string());
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
CHECK(result.size() == 2);
|
||||||
|
CHECK(result.count("./regular") == 1);
|
||||||
|
CHECK(result.count("./self") == 1);
|
||||||
|
CHECK(fs::remove("self"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("fs.op.absolute - absolute", "[filesystem][operations][fs.op.absolute]")
|
TEST_CASE("fs.op.absolute - absolute", "[filesystem][operations][fs.op.absolute]")
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user