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))
|
||||
QFileSystemEngine::fillMetaData(link, data, QFileSystemMetaData::LinkType);
|
||||
|
||||
QString ret;
|
||||
QString target;
|
||||
if (data.isLnkFile())
|
||||
ret = readLink(link);
|
||||
target = readLink(link);
|
||||
else if (data.isLink())
|
||||
ret = readSymLink(link);
|
||||
return QFileSystemEntry(ret);
|
||||
target = readSymLink(link);
|
||||
QFileSystemEntry ret(target);
|
||||
if (!target.isEmpty() && ret.isRelative()) {
|
||||
target.prepend(absoluteName(link).path() + QLatin1Char('/'));
|
||||
ret = QFileSystemEntry(QDir::cleanPath(target));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//static
|
||||
|
@ -1509,21 +1509,27 @@ void tst_QFileInfo::ntfsJunctionPointsAndSymlinks_data()
|
||||
QVERIFY2(file.exists(), msgDoesNotExist(file.fileName()).constData());
|
||||
|
||||
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");
|
||||
}
|
||||
{
|
||||
//File symlinks
|
||||
pwd.mkdir("relative");
|
||||
QDir relativeDir("relative");
|
||||
QFileInfo target(m_sourceFile);
|
||||
QString absTarget = QDir::toNativeSeparators(target.absoluteFilePath());
|
||||
QString absSymlink = QDir::toNativeSeparators(pwd.absolutePath()).append("\\abs_symlink.cpp");
|
||||
QString relTarget = QDir::toNativeSeparators(pwd.relativeFilePath(target.absoluteFilePath()));
|
||||
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(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("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
|
||||
|
Loading…
x
Reference in New Issue
Block a user