From ea6319cb38d7034862532066724e77b93f65be1a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 12 Oct 2008 15:15:32 +0000 Subject: [PATCH] don't replace . and .. with the corresponding directoties names in GetLongPath() as this breaks the normalization of file names without wxPATH_NORM_DOTS flag (#9814) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56247 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/filename.cpp | 20 +++++++++++--------- tests/filename/filenametest.cpp | 19 ++++++++++++++++++- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/common/filename.cpp b/src/common/filename.cpp index 9285be0e5d..371101a689 100644 --- a/src/common/filename.cpp +++ b/src/common/filename.cpp @@ -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; diff --git a/tests/filename/filenametest.cpp b/tests/filename/filenametest.cpp index 770ca8ac69..ff0e75fd1d 100644 --- a/tests/filename/filenametest.cpp +++ b/tests/filename/filenametest.cpp @@ -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 -- 2.45.2