]> git.saurik.com Git - wxWidgets.git/commitdiff
don't replace . and .. with the corresponding directoties names in GetLongPath()...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 12 Oct 2008 15:15:32 +0000 (15:15 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 12 Oct 2008 15:15:32 +0000 (15:15 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56247 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/filename.cpp
tests/filename/filenametest.cpp

index 9285be0e5d3e46942498dffda10d8476d855cd54..371101a6899d0d7f66c88428b068f58a5cd16ce9 100644 (file)
@@ -1896,19 +1896,21 @@ wxString wxFileName::GetLongPath() const
     size_t count = dirs.GetCount();
     for ( size_t i = 0; i < count; i++ )
     {
+        const wxString& dir = dirs[i];
+
         // We're using pathOut to collect the long-name path, but using a
         // temporary for appending the last path component which may be
         // short-name
-        tmpPath = pathOut + dirs[i];
-
-        if ( tmpPath.empty() )
-            continue;
-
-        // can't see this being necessary? MF
-        if ( tmpPath.Last() == GetVolumeSeparator(wxPATH_DOS) )
+        tmpPath = pathOut + dir;
+
+        // We must not process "." or ".." here as they would be (unexpectedly)
+        // replaced by the corresponding directory names so just leave them
+        // alone
+        //
+        // And we can't pass a drive and root dir to FindFirstFile (VZ: why?)
+        if ( tmpPath.empty() || dir == '.' || dir == ".." ||
+                tmpPath.Last() == GetVolumeSeparator(wxPATH_DOS) )
         {
-            // Can't pass a drive and root dir to FindFirstFile,
-            // so continue to next dir
             tmpPath += wxFILE_SEP_PATH;
             pathOut = tmpPath;
             continue;
index 770ca8ac69af748637fabc45edc6d80e412e4e95..ff0e75fd1d8279a10acde248be9ee510282cbd4f 100644 (file)
@@ -72,11 +72,13 @@ static struct TestFileNameInfo
     { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS },
     { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), true, wxPATH_DOS },
 
+#if 0
     // NB: when using the wxFileName::GetLongPath() function on these two
     //     strings, the program will hang for several seconds blocking inside
     //     Win32 GetLongPathName() function
     { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS },
     { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), true, wxPATH_DOS },
+#endif
 
     // consecutive [back]slashes should be treated as single occurrences of
     // them and not interpreted as share names if there is a volume name
@@ -94,10 +96,12 @@ static struct TestFileNameInfo
     { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC },
 #endif // 0
 
+#if 0
     // VMS file names
     // NB: on Windows they have the same effect of the \\server\\ strings
     //     (see the note above)
     { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), true, wxPATH_VMS },
+#endif
     { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), false, wxPATH_VMS },
 };
 
@@ -328,7 +332,20 @@ void FileNameTestCase::TestNormalize()
         // test giving no flags at all to Normalize()
         { "a/b/", 0, "a/b/", wxPATH_UNIX },
         { "a/b/c.ext", 0, "a/b/c.ext", wxPATH_UNIX },
-        { "/a", 0, "/a", wxPATH_UNIX }
+        { "/a", 0, "/a", wxPATH_UNIX },
+
+        // test handling dots without wxPATH_NORM_DOTS and wxPATH_NORM_ABSOLUTE
+        // for both existing and non-existent files (this is important under
+        // MSW where GetLongPathName() works only for the former)
+        { "./foo", wxPATH_NORM_LONG, "./foo", wxPATH_UNIX },
+        { "../foo", wxPATH_NORM_LONG, "../foo", wxPATH_UNIX },
+        { ".\\test.bkl", wxPATH_NORM_LONG, ".\\test.bkl", wxPATH_DOS },
+        { ".\\foo", wxPATH_NORM_LONG, ".\\foo", wxPATH_DOS },
+        { "..\\Makefile.in", wxPATH_NORM_LONG, "..\\Makefile.in", wxPATH_DOS },
+        { "..\\foo", wxPATH_NORM_LONG, "..\\foo", wxPATH_DOS },
+#ifdef __WXMSW__
+        { "..\\MKINST~1", wxPATH_NORM_LONG, "..\\mkinstalldirs", wxPATH_DOS },
+#endif
     };
 
     // set the env var ABCDEF