Merge topic 'realpath-windows'

16af27fd42 cmSystemTools: Drop GetRealPathResolvingWindowsSubst
823e1df54c cmSystemTools: Implement GetRealPath on Windows

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !9973
This commit is contained in:
Brad King
2024-11-05 14:09:48 +00:00
committed by Kitware Robot
4 changed files with 18 additions and 38 deletions
+1 -3
View File
@@ -1409,8 +1409,7 @@ bool HandleRealPathCommand(std::vector<std::string> 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<std::string> 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) {
+13 -28
View File
@@ -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<Policies::RealPath> 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;
}
+3 -5
View File
@@ -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();
+1 -2
View File
@@ -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();