diff options
author | Oliver Reiche <oliver.reiche@huawei.com> | 2023-11-03 13:54:26 +0100 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2023-11-15 12:03:11 +0100 |
commit | b1397ebc4512eb73894b1d273c008233c781db61 (patch) | |
tree | 361be18e98fd9d07a98c788750c0a48051be8080 /src/buildtool/file_system/file_system_manager.hpp | |
parent | b6ff8c6d7bc2e8fe595604e0f36a6cdfa54000fc (diff) | |
download | justbuild-b1397ebc4512eb73894b1d273c008233c781db61.tar.gz |
bugfix: Also unlink symlinks before installing
Make sure that all CopyFile, WriteFile, and CreateSymlink
functions properly unlink the target file (if it exists and
overwrite requested) to avoid interferences of the install
command. With this change, the clean up step for install-cas
and the within GraphTraverser can new be omitted.
(cherry-picked from 04e2f0aa0ccfe4f39c5f6c713bde182c6b7704dd)
Diffstat (limited to 'src/buildtool/file_system/file_system_manager.hpp')
-rw-r--r-- | src/buildtool/file_system/file_system_manager.hpp | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/buildtool/file_system/file_system_manager.hpp b/src/buildtool/file_system/file_system_manager.hpp index 6b6b675f..d905f301 100644 --- a/src/buildtool/file_system/file_system_manager.hpp +++ b/src/buildtool/file_system/file_system_manager.hpp @@ -153,6 +153,11 @@ class FileSystemManager { link.parent_path().string()); return false; } + if (not RemoveFile(link)) { + Logger::Log( + log_failure_at, "can not remove file {}", link.string()); + return false; + } #ifdef __unix__ std::filesystem::create_directory_symlink(to, link); return std::filesystem::is_symlink(link); @@ -344,7 +349,10 @@ class FileSystemManager { kSetEpochTime, kSetWritable>(src, dst, fd_less, opt); case ObjectType::Symlink: - return CopySymlinkAs<kSetEpochTime>(src, dst); + return CopySymlinkAs<kSetEpochTime>( + src, + dst, + opt == std::filesystem::copy_options::overwrite_existing); case ObjectType::Tree: break; } @@ -441,7 +449,8 @@ class FileSystemManager { if (!std::filesystem::exists(status)) { return true; } - if (!std::filesystem::is_regular_file(status)) { + if (!std::filesystem::is_regular_file(status) and + !std::filesystem::is_symlink(status)) { return false; } return std::filesystem::remove(file); @@ -1009,6 +1018,11 @@ class FileSystemManager { std::filesystem::is_symlink(dst)) { return false; } + if (not RemoveFile(dst)) { + Logger::Log( + LogLevel::Error, "cannot remove file {}", dst.string()); + return false; + } return std::filesystem::copy_file(src, dst, opt); } catch (std::exception const& e) { Logger::Log(LogLevel::Error, @@ -1023,6 +1037,11 @@ class FileSystemManager { [[nodiscard]] static auto WriteFileImpl( std::string const& content, std::filesystem::path const& file) noexcept -> bool { + if (not FileSystemManager::RemoveFile(file)) { + Logger::Log( + LogLevel::Error, "can not remove file {}", file.string()); + return false; + } try { std::ofstream writer{file}; if (!writer.is_open()) { @@ -1139,6 +1158,12 @@ class FileSystemManager { [[nodiscard]] static auto CopyFile(char const* src, char const* dst, bool skip_existing) noexcept -> int { + if (not skip_existing) { + // remove dst if it exists + if (unlink(dst) != 0 and errno != ENOENT) { + return PackError(ERROR_OPEN_OUTPUT, errno); + } + } // NOLINTNEXTLINE(hicpp-signed-bitwise) auto write_flags = kWriteFlags | (skip_existing ? O_EXCL : 0); auto out = FdOpener{dst, write_flags, kWritePerms}; |