Restore Qt4.7 behaviour of QFileInfo::absolute(File)Path
Many applications relied on the undefined behaviour that the filesystem engines returned clean paths (despite the documentation stating that they may not), and consequently suffered regressions with Qt 4.8. Unix paths are once again cleaned if necessary. Windows/Symbian paths were already cleaned, but now use the utility function to check if a path is dirty, to avoid duplicated code. Task-number: QTBUG-19995 Change-Id: If8c18469f149291c9d079ae3da23bc2087bbd49a Reviewed-on: http://codereview.qt.nokia.com/4154 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Prasanth Ullattil <prasanth.ullattil@nokia.com>
This commit is contained in:
parent
a4227c8400
commit
c8baa5602a
@ -114,9 +114,7 @@ QFileSystemEntry QFileSystemEngine::absoluteName(const QFileSystemEntry &entry)
|
||||
{
|
||||
QString orig = entry.filePath();
|
||||
const bool isAbsolute = entry.isAbsolute();
|
||||
const bool isDirty = (orig.contains(QLatin1String("/../")) || orig.contains(QLatin1String("/./")) ||
|
||||
orig.contains(QLatin1String("//")) ||
|
||||
orig.endsWith(QLatin1String("/..")) || orig.endsWith(QLatin1String("/.")));
|
||||
const bool isDirty = !entry.isClean();
|
||||
if (isAbsolute && !isDirty)
|
||||
return entry;
|
||||
|
||||
|
@ -218,7 +218,7 @@ QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry,
|
||||
//static
|
||||
QFileSystemEntry QFileSystemEngine::absoluteName(const QFileSystemEntry &entry)
|
||||
{
|
||||
if (entry.isAbsolute())
|
||||
if (entry.isAbsolute() && entry.isClean())
|
||||
return entry;
|
||||
|
||||
QByteArray orig = entry.nativeFilePath();
|
||||
|
@ -508,11 +508,7 @@ QFileSystemEntry QFileSystemEngine::absoluteName(const QFileSystemEntry &entry)
|
||||
|
||||
if (!entry.isRelative()) {
|
||||
#if !defined(Q_OS_WINCE)
|
||||
if (entry.isAbsolute()
|
||||
&& !entry.filePath().contains(QLatin1String("/../"))
|
||||
&& !entry.filePath().contains(QLatin1String("/./"))
|
||||
&& !entry.filePath().endsWith(QLatin1String("/.."))
|
||||
&& !entry.filePath().endsWith(QLatin1String("/."))) {
|
||||
if (entry.isAbsolute() && entry.isClean()) {
|
||||
ret = entry.filePath();
|
||||
} else {
|
||||
ret = QDir::fromNativeSeparators(nativeAbsoluteFilePath(entry.filePath()));
|
||||
|
@ -481,6 +481,11 @@ void tst_QFileInfo::absolutePath_data()
|
||||
QTest::newRow("c:\\autoexec.bat") << "c:\\autoexec.bat" << "C:/"
|
||||
<< "autoexec.bat";
|
||||
#endif
|
||||
QTest::newRow("QTBUG-19995.1") << drivePrefix + "/System/Library/StartupItems/../Frameworks"
|
||||
<< drivePrefix + "/System/Library"
|
||||
<< "Frameworks";
|
||||
QTest::newRow("QTBUG-19995.2") << drivePrefix + "/System/Library/StartupItems/../Frameworks/"
|
||||
<< drivePrefix + "/System/Library/Frameworks" << "";
|
||||
}
|
||||
|
||||
void tst_QFileInfo::absolutePath()
|
||||
@ -502,6 +507,7 @@ void tst_QFileInfo::absFilePath_data()
|
||||
|
||||
QTest::newRow("relativeFile") << "tmp.txt" << QDir::currentPath() + "/tmp.txt";
|
||||
QTest::newRow("relativeFileInSubDir") << "temp/tmp.txt" << QDir::currentPath() + "/" + "temp/tmp.txt";
|
||||
QString drivePrefix;
|
||||
#if (defined(Q_OS_WIN) && !defined(Q_OS_WINCE)) || defined(Q_OS_SYMBIAN)
|
||||
QString curr = QDir::currentPath();
|
||||
|
||||
@ -510,7 +516,7 @@ void tst_QFileInfo::absFilePath_data()
|
||||
QTest::newRow("absFilePath") << "c:\\home\\andy\\tmp.txt" << "C:/home/andy/tmp.txt";
|
||||
|
||||
// Make sure drive-relative paths return correct absolute paths (task 255326)
|
||||
QString drivePrefix = QDir::currentPath().left(2);
|
||||
drivePrefix = QDir::currentPath().left(2);
|
||||
QString nonCurrentDrivePrefix =
|
||||
drivePrefix.left(1).compare("X", Qt::CaseInsensitive) == 0 ? QString("Y:") : QString("X:");
|
||||
|
||||
@ -520,6 +526,8 @@ void tst_QFileInfo::absFilePath_data()
|
||||
#else
|
||||
QTest::newRow("absFilePath") << "/home/andy/tmp.txt" << "/home/andy/tmp.txt";
|
||||
#endif
|
||||
QTest::newRow("QTBUG-19995") << drivePrefix + "/System/Library/StartupItems/../Frameworks"
|
||||
<< drivePrefix + "/System/Library/Frameworks";
|
||||
}
|
||||
|
||||
void tst_QFileInfo::absFilePath()
|
||||
|
Loading…
Reference in New Issue
Block a user