From 00e04b0a6d51a415ea70133bbc2c6dad9cc72ecc Mon Sep 17 00:00:00 2001 From: Jan Korous Date: Thu, 5 Sep 2019 18:10:29 +0000 Subject: [Support] Add writeFileAtomically() to FileUtilities Differential Revision: https://reviews.llvm.org/D66859 llvm-svn: 371103 --- llvm/lib/Support/FileUtilities.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'llvm/lib/Support/FileUtilities.cpp') diff --git a/llvm/lib/Support/FileUtilities.cpp b/llvm/lib/Support/FileUtilities.cpp index 62eb7bfd..b933692 100644 --- a/llvm/lib/Support/FileUtilities.cpp +++ b/llvm/lib/Support/FileUtilities.cpp @@ -15,6 +15,7 @@ #include "llvm/ADT/SmallString.h" #include "llvm/Support/ErrorOr.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -264,3 +265,37 @@ int llvm::DiffFilesWithTolerance(StringRef NameA, return CompareFailed; } + +Error llvm::writeFileAtomically(StringRef TempPathModel, StringRef FinalPath, + StringRef Buffer) { + SmallString<128> GeneratedUniqPath; + int TempFD; + if (const std::error_code Error = sys::fs::createUniqueFile( + TempPathModel.str(), TempFD, GeneratedUniqPath)) { + return createStringError( + Error, "failed to create temporary file with model \"%s\"", + TempPathModel.str().c_str()); + } + + raw_fd_ostream OS(TempFD, /*shouldClose=*/true); + OS.write(Buffer.data(), Buffer.size()); + OS.close(); + TempFD = -1; + + if (OS.has_error()) { + const std::error_code Error = OS.error(); + OS.clear_error(); + return createStringError(Error, "failed to write to \"%s\"", + GeneratedUniqPath.c_str()); + } + + if (const std::error_code Error = + sys::fs::rename(/*from=*/GeneratedUniqPath.c_str(), + /*to=*/FinalPath.str().c_str())) { + return createStringError(Error, "failed to rename file \"%s\" to \"%s\"", + GeneratedUniqPath.c_str(), + FinalPath.str().c_str()); + } + + return Error::success(); +} -- cgit v1.1