cmSystemTools: Revert GetRealPath implementation on Windows

The use of `uv_fs_realpath` introduced by commit v3.11.0-rc1~445^2~1
(cmSystemTools: Implement GetRealPath on Windows, 2017-10-02) causes
`subst` drives to be expanded on Windows, breaking existing use cases.
Revert its use until an alternative implementation can be chosen.

Preserve the behavior introduced by commit v3.11.0-rc1~445^2
(cmTimestamp: For symlinks switch to timestamp of resolved path,
2017-10-02) by retaining use of `uv_fs_realpath` in a function of
a different name.

Fixes: #18033
Issue: #17206
This commit is contained in:
Brad King 2018-05-29 12:52:38 -04:00
parent 519427e32c
commit 83630d4918
4 changed files with 22 additions and 8 deletions

View File

@ -298,3 +298,10 @@ Changes made since CMake 3.11.0 include the following.
:prop_sf:`SKIP_AUTOUIC` on their generated files. These files never
need to be processed by moc or uic, and we must say so explicitly to
account for policy :policy:`CMP0071`.
3.11.3
------
* CMake 3.11.0 introduced support for resolving symbolic links on
Windows in code paths that typically do so on UNIX. This has been
reverted due to breakage on ``subst`` drives.

View File

@ -949,10 +949,12 @@ cmSystemTools::WindowsFileRetry cmSystemTools::GetWindowsFileRetry()
}
return retry;
}
#endif
std::string cmSystemTools::GetRealPath(const std::string& path,
std::string* errorMessage)
std::string cmSystemTools::GetRealPathResolvingWindowsSubst(
const std::string& path, std::string* errorMessage)
{
#ifdef _WIN32
// uv_fs_realpath uses Windows Vista API so fallback to kwsys if not found
std::string resolved_path;
uv_fs_t req;
@ -981,8 +983,10 @@ std::string cmSystemTools::GetRealPath(const std::string& path,
resolved_path = path;
}
return resolved_path;
}
#else
return cmsys::SystemTools::GetRealPath(path, errorMessage);
#endif
}
void cmSystemTools::InitializeLibUV()
{

View File

@ -500,12 +500,14 @@ public:
unsigned int Delay;
};
static WindowsFileRetry GetWindowsFileRetry();
/** Get the real path for a given path, removing all symlinks. */
static std::string GetRealPath(const std::string& path,
std::string* errorMessage = 0);
#endif
/** Get the real path for a given path, removing all symlinks.
This variant of GetRealPath also works on Windows but will
resolve subst drives too. */
static std::string GetRealPathResolvingWindowsSubst(
const std::string& path, std::string* errorMessage = nullptr);
/** Perform one-time initialization of libuv. */
static void InitializeLibUV();

View File

@ -33,7 +33,8 @@ std::string cmTimestamp::FileModificationTime(const char* path,
const std::string& formatString,
bool utcFlag)
{
std::string real_path = cmSystemTools::GetRealPath(path);
std::string real_path =
cmSystemTools::GetRealPathResolvingWindowsSubst(path);
if (!cmsys::SystemTools::FileExists(real_path)) {
return std::string();