KWSys 2016-09-14 (c4049689)
Code extracted from: http://public.kitware.com/KWSys.git at commit c4049689d1ff6e3b9f59358023aebb1a7e0fd149 (master). Upstream Shortlog ----------------- Brad King (2): 0504dcaf SystemTools: Fix path comparison in test case c4049689 SystemTools: Teach GetActualCaseForPath to convert as much as possible
This commit is contained in:
parent
b80d613632
commit
d28e4467aa
|
@ -3982,16 +3982,16 @@ std::string SystemTools::RelativePath(const std::string& local, const std::strin
|
|||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
static int GetCasePathName(const std::string & pathIn,
|
||||
std::string & casePath)
|
||||
static std::string GetCasePathName(std::string const& pathIn)
|
||||
{
|
||||
std::string casePath;
|
||||
std::vector<std::string> path_components;
|
||||
SystemTools::SplitPath(pathIn, path_components);
|
||||
if(path_components[0].empty()) // First component always exists.
|
||||
{
|
||||
// Relative paths cannot be converted.
|
||||
casePath = "";
|
||||
return 0;
|
||||
casePath = pathIn;
|
||||
return casePath;
|
||||
}
|
||||
|
||||
// Start with root component.
|
||||
|
@ -4015,38 +4015,45 @@ static int GetCasePathName(const std::string & pathIn,
|
|||
sep = "/";
|
||||
}
|
||||
|
||||
// Convert case of all components that exist.
|
||||
bool converting = true;
|
||||
for(; idx < path_components.size(); idx++)
|
||||
{
|
||||
casePath += sep;
|
||||
sep = "/";
|
||||
std::string test_str = casePath;
|
||||
test_str += path_components[idx];
|
||||
|
||||
// If path component contains wildcards, we skip matching
|
||||
// because these filenames are not allowed on windows,
|
||||
// and we do not want to match a different file.
|
||||
if(path_components[idx].find('*') != std::string::npos ||
|
||||
path_components[idx].find('?') != std::string::npos)
|
||||
if (converting)
|
||||
{
|
||||
casePath = "";
|
||||
return 0;
|
||||
// If path component contains wildcards, we skip matching
|
||||
// because these filenames are not allowed on windows,
|
||||
// and we do not want to match a different file.
|
||||
if(path_components[idx].find('*') != std::string::npos ||
|
||||
path_components[idx].find('?') != std::string::npos)
|
||||
{
|
||||
converting = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string test_str = casePath;
|
||||
test_str += path_components[idx];
|
||||
WIN32_FIND_DATAW findData;
|
||||
HANDLE hFind = ::FindFirstFileW(Encoding::ToWide(test_str).c_str(),
|
||||
&findData);
|
||||
if (INVALID_HANDLE_VALUE != hFind)
|
||||
{
|
||||
path_components[idx] = Encoding::ToNarrow(findData.cFileName);
|
||||
::FindClose(hFind);
|
||||
}
|
||||
else
|
||||
{
|
||||
converting = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WIN32_FIND_DATAW findData;
|
||||
HANDLE hFind = ::FindFirstFileW(Encoding::ToWide(test_str).c_str(),
|
||||
&findData);
|
||||
if (INVALID_HANDLE_VALUE != hFind)
|
||||
{
|
||||
casePath += Encoding::ToNarrow(findData.cFileName);
|
||||
::FindClose(hFind);
|
||||
}
|
||||
else
|
||||
{
|
||||
casePath = "";
|
||||
return 0;
|
||||
}
|
||||
casePath += path_components[idx];
|
||||
}
|
||||
return (int)casePath.size();
|
||||
return casePath;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -4065,11 +4072,10 @@ std::string SystemTools::GetActualCaseForPath(const std::string& p)
|
|||
{
|
||||
return i->second;
|
||||
}
|
||||
std::string casePath;
|
||||
int len = GetCasePathName(p, casePath);
|
||||
if(len == 0 || len > MAX_PATH+1)
|
||||
std::string casePath = GetCasePathName(p);
|
||||
if (casePath.size() > MAX_PATH)
|
||||
{
|
||||
return p;
|
||||
return casePath;
|
||||
}
|
||||
(*SystemTools::PathCaseMap)[p] = casePath;
|
||||
return casePath;
|
||||
|
|
|
@ -374,10 +374,11 @@ public:
|
|||
static const char* GetExecutableExtension();
|
||||
|
||||
/**
|
||||
* Given a path that exists on a windows machine, return the
|
||||
* actuall case of the path as it was created. If the file
|
||||
* does not exist path is returned unchanged. This does nothing
|
||||
* on unix but return path.
|
||||
* Given a path on a Windows machine, return the actual case of
|
||||
* the path as it exists on disk. Path components that do not
|
||||
* exist on disk are returned unchanged. Relative paths are always
|
||||
* returned unchanged. Drive letters are always made upper case.
|
||||
* This does nothing on non-Windows systems but return the path.
|
||||
*/
|
||||
static std::string GetActualCaseForPath(const std::string& path);
|
||||
|
||||
|
|
|
@ -940,7 +940,7 @@ static bool CheckRelativePath(
|
|||
const std::string& expected)
|
||||
{
|
||||
std::string result = kwsys::SystemTools::RelativePath(local, remote);
|
||||
if(expected != result)
|
||||
if (!kwsys::SystemTools::ComparePath(expected, result))
|
||||
{
|
||||
std::cerr << "RelativePath(" << local << ", " << remote
|
||||
<< ") yielded " << result << " instead of " << expected << std::endl;
|
||||
|
@ -965,7 +965,7 @@ static bool CheckCollapsePath(
|
|||
const std::string& expected)
|
||||
{
|
||||
std::string result = kwsys::SystemTools::CollapseFullPath(path);
|
||||
if(expected != result)
|
||||
if (!kwsys::SystemTools::ComparePath(expected, result))
|
||||
{
|
||||
std::cerr << "CollapseFullPath(" << path
|
||||
<< ") yielded " << result << " instead of " << expected << std::endl;
|
||||
|
|
Loading…
Reference in New Issue