diff options
author | KWSys Robot <kwrobot@kitware.com> | 2015-05-27 17:15:22 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2015-05-28 12:21:52 (GMT) |
commit | ee71b75133d3e515172b5fbe3dccf7d3906f5a19 (patch) | |
tree | 728faf237ba13c5a9764956be1c6c5133e007632 | |
parent | 3b815ed283eb8d59c4e46dd89aa1e17c9f4deee6 (diff) | |
download | CMake-ee71b75133d3e515172b5fbe3dccf7d3906f5a19.zip CMake-ee71b75133d3e515172b5fbe3dccf7d3906f5a19.tar.gz CMake-ee71b75133d3e515172b5fbe3dccf7d3906f5a19.tar.bz2 |
KWSys 2015-05-27 (61e0419f)
Extract upstream KWSys using the following shell commands.
$ git archive --prefix=upstream-kwsys/ 61e0419f | tar x
$ git shortlog --no-merges --abbrev=8 --format='%h %s' b1d560a0..61e0419f
Brad King (1):
61e0419f SystemTools: Teach RemoveFile to tolerate missing file
Matt McCormick (1):
9a6b7c3f cmake: Set CMP0056 to NEW
-rw-r--r-- | CMakeLists.txt | 3 | ||||
-rw-r--r-- | SystemTools.cxx | 44 | ||||
-rw-r--r-- | testSystemTools.cxx | 18 |
3 files changed, 51 insertions, 14 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 8069ee2..c88e888 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,6 +88,9 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6.3 FATAL_ERROR) IF(POLICY CMP0025) CMAKE_POLICY(SET CMP0025 NEW) ENDIF() +IF(POLICY CMP0056) + CMAKE_POLICY(SET CMP0056 NEW) +ENDIF() #----------------------------------------------------------------------------- # If a namespace is not specified, use "kwsys" and enable testing. diff --git a/SystemTools.cxx b/SystemTools.cxx index 6c4a7a6..c834e34 100644 --- a/SystemTools.cxx +++ b/SystemTools.cxx @@ -2674,27 +2674,43 @@ kwsys_stl::string SystemTools::GetLastSystemError() bool SystemTools::RemoveFile(const kwsys_stl::string& source) { #ifdef _WIN32 + kwsys_stl::wstring const& ws = + SystemTools::ConvertToWindowsExtendedPath(source); + if (DeleteFileW(ws.c_str())) + { + return true; + } + DWORD err = GetLastError(); + if (err == ERROR_FILE_NOT_FOUND || + err == ERROR_PATH_NOT_FOUND) + { + return true; + } + if (err != ERROR_ACCESS_DENIED) + { + return false; + } + /* The file may be read-only. Try adding write permission. */ mode_t mode; - if ( !SystemTools::GetPermissions(source, mode) ) + if (!SystemTools::GetPermissions(source, mode) || + !SystemTools::SetPermissions(source, S_IWRITE)) { + SetLastError(err); return false; } - /* Win32 unlink is stupid --- it fails if the file is read-only */ - SystemTools::SetPermissions(source, S_IWRITE); -#endif -#ifdef _WIN32 - bool res = - _wunlink(SystemTools::ConvertToWindowsExtendedPath(source).c_str()) == 0; -#else - bool res = unlink(source.c_str()) != 0 ? false : true; -#endif -#ifdef _WIN32 - if ( !res ) + if (DeleteFileW(ws.c_str()) || + GetLastError() == ERROR_FILE_NOT_FOUND || + GetLastError() == ERROR_PATH_NOT_FOUND) { - SystemTools::SetPermissions(source, mode); + return true; } + /* Try to restore the original permissions. */ + SystemTools::SetPermissions(source, mode); + SetLastError(err); + return false; +#else + return unlink(source.c_str()) == 0 || errno == ENOENT; #endif - return res; } bool SystemTools::RemoveADirectory(const kwsys_stl::string& source) diff --git a/testSystemTools.cxx b/testSystemTools.cxx index 42b6249..15d8eab 100644 --- a/testSystemTools.cxx +++ b/testSystemTools.cxx @@ -156,6 +156,24 @@ static bool CheckFileOperations() res = false; } + kwsys_stl::string const testFileMissing(testNewDir + "/testMissingFile.txt"); + if (!kwsys::SystemTools::RemoveFile(testFileMissing)) + { + std::string const& msg = kwsys::SystemTools::GetLastSystemError(); + kwsys_ios::cerr << + "RemoveFile(\"" << testFileMissing << "\") failed: " << msg << "\n"; + res = false; + } + + kwsys_stl::string const testFileMissingDir(testNewDir + "/missing/file.txt"); + if (!kwsys::SystemTools::RemoveFile(testFileMissingDir)) + { + std::string const& msg = kwsys::SystemTools::GetLastSystemError(); + kwsys_ios::cerr << + "RemoveFile(\"" << testFileMissingDir << "\") failed: " << msg << "\n"; + res = false; + } + kwsys::SystemTools::Touch(testNewFile.c_str(), true); if (!kwsys::SystemTools::RemoveADirectory(testNewDir)) { |