summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKWSys Robot <kwrobot@kitware.com>2015-05-27 13:15:22 -0400
committerBrad King <brad.king@kitware.com>2015-05-28 08:21:52 -0400
commitee71b75133d3e515172b5fbe3dccf7d3906f5a19 (patch)
tree728faf237ba13c5a9764956be1c6c5133e007632
parent3b815ed283eb8d59c4e46dd89aa1e17c9f4deee6 (diff)
downloadcmake-ee71b75133d3e515172b5fbe3dccf7d3906f5a19.tar.gz
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.txt3
-rw-r--r--SystemTools.cxx44
-rw-r--r--testSystemTools.cxx18
3 files changed, 51 insertions, 14 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8069ee2946..c88e8880f5 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 6c4a7a6758..c834e34d11 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 42b62497b5..15d8eab1b1 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))
{