summaryrefslogtreecommitdiffstats
path: root/Source/kwsys/SystemTools.cxx
diff options
context:
space:
mode:
authorKen Martin <ken.martin@kitware.com>2007-02-01 19:11:06 (GMT)
committerKen Martin <ken.martin@kitware.com>2007-02-01 19:11:06 (GMT)
commit3dd4a53d97e8b4726c732e39b67df1c0eb2cc7eb (patch)
tree8e26380ed4225cd794ef9f06509972baea54b5a8 /Source/kwsys/SystemTools.cxx
parent0b4bd97210805a7f7a8db529f26d695224c74c56 (diff)
downloadCMake-3dd4a53d97e8b4726c732e39b67df1c0eb2cc7eb.zip
CMake-3dd4a53d97e8b4726c732e39b67df1c0eb2cc7eb.tar.gz
CMake-3dd4a53d97e8b4726c732e39b67df1c0eb2cc7eb.tar.bz2
BUG: fix for bug number 3320
Diffstat (limited to 'Source/kwsys/SystemTools.cxx')
-rw-r--r--Source/kwsys/SystemTools.cxx36
1 files changed, 33 insertions, 3 deletions
diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx
index 8df1a65..1a5a421 100644
--- a/Source/kwsys/SystemTools.cxx
+++ b/Source/kwsys/SystemTools.cxx
@@ -2513,6 +2513,8 @@ void SystemTools::AddTranslationPath(const char * a, const char * b)
if( SystemTools::FileIsDirectory( path_a.c_str() ) )
{
// Make sure the path is a full path and does not contain no '..'
+ // Ken--the following code is incorrect. .. can be in a valid path
+ // for example /home/martink/MyHubba...Hubba/Src
if( SystemTools::FileIsFullPath(path_b.c_str()) && path_b.find("..")
== kwsys_stl::string::npos )
{
@@ -2605,6 +2607,9 @@ kwsys_stl::string SystemTools::CollapseFullPath(const char* in_path,
// Split the input path components.
kwsys_stl::vector<kwsys_stl::string> path_components;
SystemTools::SplitPath(in_path, path_components);
+
+ // clean the input path to remove any /./
+
// If the input path is relative, start with a base path.
if(path_components[0].length() == 0)
{
@@ -2640,11 +2645,36 @@ kwsys_stl::string SystemTools::CollapseFullPath(const char* in_path,
path_components.begin(),
path_components.end());
+ // remove any . components as they do nothing
+ kwsys_stl::vector<kwsys_stl::string> clean_components;
+ kwsys_stl::vector<kwsys_stl::string>::iterator i =
+ out_components.begin();
+ for (; i != out_components.end(); ++i)
+ {
+ if (*i != ".")
+ {
+ clean_components.push_back(*i);
+ }
+ }
+
+
// Transform the path back to a string.
- kwsys_stl::string newPath = SystemTools::JoinPath(out_components);
+ kwsys_stl::string newPath = SystemTools::JoinPath(clean_components);
+
+ // Update the translation table with this potentially new path. I am not
+ // sure why this line is here, it seems really questionable, but yet I
+ // would put good money that if I remove it something will break, basically
+ // from what I can see it created a mapping from the collapsed path, to be
+ // replaced by the input path, which almost completely does the opposite of
+ // this function, the only thing preventing this from happening a lot is
+ // that if the in_path has a .. in it, then it is not added to the
+ // translation table. So for most calls this either does nothing due to the
+ // .. or it adds a translation between identical paths as nothing was
+ // collapsed, so I am going to try to comment it out, and see what hits the
+ // fan, hopefully quickly.
+ // Commented out line below:
+ //SystemTools::AddTranslationPath(newPath.c_str(), in_path);
- // Update the translation table with this potentially new path.
- SystemTools::AddTranslationPath(newPath.c_str(), in_path);
SystemTools::CheckTranslationPath(newPath);
#ifdef _WIN32
newPath = SystemTools::GetActualCaseForPath(newPath.c_str());