Fix resolution of relative links on Windows
[ChangeLog][QtCore][QFileInfo] Relative symbolic links on Windows are now resolved to their absolute path by symLinkTarget(). Task-number: QTBUG-62802 Change-Id: I5826517130bd389aef994bf3f4b6d99b2a91b409 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
This commit is contained in:
parent
314a591461
commit
ced0f54ec3
@ -473,12 +473,17 @@ QFileSystemEntry QFileSystemEngine::getLinkTarget(const QFileSystemEntry &link,
|
|||||||
if (data.missingFlags(QFileSystemMetaData::LinkType))
|
if (data.missingFlags(QFileSystemMetaData::LinkType))
|
||||||
QFileSystemEngine::fillMetaData(link, data, QFileSystemMetaData::LinkType);
|
QFileSystemEngine::fillMetaData(link, data, QFileSystemMetaData::LinkType);
|
||||||
|
|
||||||
QString ret;
|
QString target;
|
||||||
if (data.isLnkFile())
|
if (data.isLnkFile())
|
||||||
ret = readLink(link);
|
target = readLink(link);
|
||||||
else if (data.isLink())
|
else if (data.isLink())
|
||||||
ret = readSymLink(link);
|
target = readSymLink(link);
|
||||||
return QFileSystemEntry(ret);
|
QFileSystemEntry ret(target);
|
||||||
|
if (!target.isEmpty() && ret.isRelative()) {
|
||||||
|
target.prepend(absoluteName(link).path() + QLatin1Char('/'));
|
||||||
|
ret = QFileSystemEntry(QDir::cleanPath(target));
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
//static
|
//static
|
||||||
|
@ -1509,21 +1509,27 @@ void tst_QFileInfo::ntfsJunctionPointsAndSymlinks_data()
|
|||||||
QVERIFY2(file.exists(), msgDoesNotExist(file.fileName()).constData());
|
QVERIFY2(file.exists(), msgDoesNotExist(file.fileName()).constData());
|
||||||
|
|
||||||
QTest::newRow("absolute dir symlink") << absSymlink << true << QDir::fromNativeSeparators(absTarget) << target.canonicalPath();
|
QTest::newRow("absolute dir symlink") << absSymlink << true << QDir::fromNativeSeparators(absTarget) << target.canonicalPath();
|
||||||
QTest::newRow("relative dir symlink") << relSymlink << true << QDir::fromNativeSeparators(relTarget) << target.canonicalPath();
|
QTest::newRow("relative dir symlink") << relSymlink << true << QDir::fromNativeSeparators(absTarget) << target.canonicalPath();
|
||||||
QTest::newRow("file in symlink dir") << fileInSymlink << false << "" << target.canonicalPath().append("/file");
|
QTest::newRow("file in symlink dir") << fileInSymlink << false << "" << target.canonicalPath().append("/file");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
//File symlinks
|
//File symlinks
|
||||||
|
pwd.mkdir("relative");
|
||||||
|
QDir relativeDir("relative");
|
||||||
QFileInfo target(m_sourceFile);
|
QFileInfo target(m_sourceFile);
|
||||||
QString absTarget = QDir::toNativeSeparators(target.absoluteFilePath());
|
QString absTarget = QDir::toNativeSeparators(target.absoluteFilePath());
|
||||||
QString absSymlink = QDir::toNativeSeparators(pwd.absolutePath()).append("\\abs_symlink.cpp");
|
QString absSymlink = QDir::toNativeSeparators(pwd.absolutePath()).append("\\abs_symlink.cpp");
|
||||||
QString relTarget = QDir::toNativeSeparators(pwd.relativeFilePath(target.absoluteFilePath()));
|
QString relTarget = QDir::toNativeSeparators(pwd.relativeFilePath(target.absoluteFilePath()));
|
||||||
QString relSymlink = "rel_symlink.cpp";
|
QString relSymlink = "rel_symlink.cpp";
|
||||||
|
QString relToRelTarget = QDir::toNativeSeparators(relativeDir.relativeFilePath(target.absoluteFilePath()));
|
||||||
|
QString relToRelSymlink = "relative/rel_symlink";
|
||||||
QVERIFY(pwd.exists("abs_symlink.cpp") || createSymbolicLinkW((wchar_t*)absSymlink.utf16(),(wchar_t*)absTarget.utf16(),0x0));
|
QVERIFY(pwd.exists("abs_symlink.cpp") || createSymbolicLinkW((wchar_t*)absSymlink.utf16(),(wchar_t*)absTarget.utf16(),0x0));
|
||||||
QVERIFY(pwd.exists(relSymlink) || createSymbolicLinkW((wchar_t*)relSymlink.utf16(),(wchar_t*)relTarget.utf16(),0x0));
|
QVERIFY(pwd.exists(relSymlink) || createSymbolicLinkW((wchar_t*)relSymlink.utf16(),(wchar_t*)relTarget.utf16(),0x0));
|
||||||
|
QVERIFY(pwd.exists(relToRelSymlink)
|
||||||
|
|| createSymbolicLinkW((wchar_t*)relToRelSymlink.utf16(), (wchar_t*)relToRelTarget.utf16(),0x0));
|
||||||
QTest::newRow("absolute file symlink") << absSymlink << true << QDir::fromNativeSeparators(absTarget) << target.canonicalFilePath();
|
QTest::newRow("absolute file symlink") << absSymlink << true << QDir::fromNativeSeparators(absTarget) << target.canonicalFilePath();
|
||||||
QTest::newRow("relative file symlink") << relSymlink << true << QDir::fromNativeSeparators(relTarget) << target.canonicalFilePath();
|
QTest::newRow("relative file symlink") << relSymlink << true << QDir::fromNativeSeparators(absTarget) << target.canonicalFilePath();
|
||||||
|
QTest::newRow("relative to relative file symlink") << relToRelSymlink << true << QDir::fromNativeSeparators(absTarget) << target.canonicalFilePath();
|
||||||
}
|
}
|
||||||
|
|
||||||
//Junctions
|
//Junctions
|
||||||
|
Loading…
x
Reference in New Issue
Block a user