merge bitcoin#24331: Revert back MoveFileExW call for MinGW-w64

This commit is contained in:
Kittywhiskers Van Gogh 2022-02-13 17:30:21 +02:00
parent 15e794bdd8
commit 6c7335e002
No known key found for this signature in database
GPG Key ID: 30CD0C065E5C4AAD
2 changed files with 45 additions and 0 deletions

View File

@ -118,6 +118,40 @@ BOOST_AUTO_TEST_CASE(fsbridge_fstream)
} }
} }
BOOST_AUTO_TEST_CASE(rename)
{
const fs::path tmpfolder{m_args.GetDataDirBase()};
const fs::path path1{GetUniquePath(tmpfolder)};
const fs::path path2{GetUniquePath(tmpfolder)};
const std::string path1_contents{"1111"};
const std::string path2_contents{"2222"};
{
std::ofstream file{path1};
file << path1_contents;
}
{
std::ofstream file{path2};
file << path2_contents;
}
// Rename path1 -> path2.
BOOST_CHECK(RenameOver(path1, path2));
BOOST_CHECK(!fs::exists(path1));
{
std::ifstream file{path2};
std::string contents;
file >> contents;
BOOST_CHECK_EQUAL(contents, path1_contents);
}
fs::remove(path2);
}
#ifndef WIN32 #ifndef WIN32
BOOST_AUTO_TEST_CASE(create_directories) BOOST_AUTO_TEST_CASE(create_directories)
{ {

View File

@ -1138,9 +1138,20 @@ std::vector<util::SettingsValue> ArgsManager::GetSettingsList(const std::string&
bool RenameOver(fs::path src, fs::path dest) bool RenameOver(fs::path src, fs::path dest)
{ {
#ifdef __MINGW64__
// This is a workaround for a bug in libstdc++ which
// implements std::filesystem::rename with _wrename function.
// This bug has been fixed in upstream:
// - GCC 10.3: 8dd1c1085587c9f8a21bb5e588dfe1e8cdbba79e
// - GCC 11.1: 1dfd95f0a0ca1d9e6cbc00e6cbfd1fa20a98f312
// For more details see the commits mentioned above.
return MoveFileExW(src.wstring().c_str(), dest.wstring().c_str(),
MOVEFILE_REPLACE_EXISTING) != 0;
#else
std::error_code error; std::error_code error;
fs::rename(src, dest, error); fs::rename(src, dest, error);
return !error; return !error;
#endif
} }
/** /**