diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 82847c438b..e6fe94b1ce 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -1409,8 +1409,7 @@ bool HandleRealPathCommand(std::vector const& args, auto basePath = cmCMakePath{ *arguments.BaseDirectory }; path = basePath.Append(path); } - result = cmSystemTools::GetActualCaseForPath( - cmSystemTools::GetRealPath(path.String())); + result = cmSystemTools::GetRealPath(path.String()); }; std::string realPath; @@ -1420,7 +1419,6 @@ bool HandleRealPathCommand(std::vector const& args, std::string oldPolicyPath = cmSystemTools::CollapseFullPath(input, *arguments.BaseDirectory); oldPolicyPath = cmSystemTools::GetRealPath(oldPolicyPath); - oldPolicyPath = cmSystemTools::GetActualCaseForPath(oldPolicyPath); if (warnAbout152) { computeNewPath(input, realPath); if (oldPolicyPath != realPath) { diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index ee8d95b049..f322e6459a 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1101,36 +1101,22 @@ std::string cmSystemTools::GetComspec() #endif -std::string cmSystemTools::GetRealPathResolvingWindowsSubst( - const std::string& path, std::string* errorMessage) +std::string cmSystemTools::GetRealPath(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; - int err = uv_fs_realpath(nullptr, &req, path.c_str(), nullptr); - if (!err) { - resolved_path = std::string((char*)req.ptr); - cmSystemTools::ConvertToUnixSlashes(resolved_path); - // Normalize to upper-case drive letter as GetActualCaseForPath does. - if (resolved_path.size() > 1 && resolved_path[1] == ':') { - resolved_path[0] = toupper(resolved_path[0]); + using namespace cm::PathResolver; + // IWYU pragma: no_forward_declare cm::PathResolver::Policies::RealPath + static const Resolver resolver(RealOS); + cmsys::Status status = resolver.Resolve(path, resolved_path); + if (!status) { + if (errorMessage) { + *errorMessage = status.GetString(); + resolved_path.clear(); + } else { + resolved_path = path; } - } else if (err == UV_ENOSYS) { - resolved_path = cmsys::SystemTools::GetRealPath(path, errorMessage); - } else if (errorMessage) { - LPSTR message = nullptr; - DWORD size = FormatMessageA( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - nullptr, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&message, - 0, nullptr); - *errorMessage = std::string(message, size); - LocalFree(message); - - resolved_path = ""; - } else { - resolved_path = path; } return resolved_path; #else @@ -2703,8 +2689,7 @@ void cmSystemTools::FindCMakeResources(const char* argv0) wchar_t modulepath[_MAX_PATH]; ::GetModuleFileNameW(nullptr, modulepath, sizeof(modulepath)); std::string path = cmsys::Encoding::ToNarrow(modulepath); - std::string realPath = - cmSystemTools::GetRealPathResolvingWindowsSubst(path, nullptr); + std::string realPath = cmSystemTools::GetRealPath(path, nullptr); if (realPath.empty()) { realPath = path; } diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index 4d825845f8..4f62aee639 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -605,11 +605,9 @@ public: static std::string GetComspec(); #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); + /** Get the real path for a given path, removing all symlinks. */ + static std::string GetRealPath(const std::string& path, + std::string* errorMessage = nullptr); /** Perform one-time initialization of libuv. */ static void InitializeLibUV(); diff --git a/Source/cmTimestamp.cxx b/Source/cmTimestamp.cxx index 4d8bc027d8..cb6eb6fbd0 100644 --- a/Source/cmTimestamp.cxx +++ b/Source/cmTimestamp.cxx @@ -62,8 +62,7 @@ std::string cmTimestamp::FileModificationTime(const char* path, const std::string& formatString, bool utcFlag) const { - std::string real_path = - cmSystemTools::GetRealPathResolvingWindowsSubst(path); + std::string real_path = cmSystemTools::GetRealPath(path); if (!cmsys::SystemTools::FileExists(real_path)) { return std::string();