QFileSystemWatcher/Win: remove the pre-QFileInfo path normalization
It's completely unnecessary, since QFileInfo will query the file system anyway and that has a much better view of what is normalized and what isn't. More importantly, this fixes the mistake in failing to normalize properly in removePaths(), which removed the ending slash of a root directory such as "C:\\". That caused the path to become "C:", which QFileInfo interprets as "current path on drive C:". [ChangeLog][QtCore][QFileSystemWatcher] Fixed a bug that prevented removePaths() from removing the root of a drive on Windows. Fixes: QTBUG-110986 Change-Id: I9671dee8ceb64aa9b9cafffd17419b6d69670876 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io> (cherry picked from commit 6d1769791348e9387e0c5f29d970131895888814) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
8bb9290b72
commit
cffe6800d1
@ -332,12 +332,7 @@ QStringList QWindowsFileSystemWatcherEngine::addPaths(const QStringList &paths,
|
||||
QStringList unhandled;
|
||||
for (const QString &path : paths) {
|
||||
auto sg = qScopeGuard([&] { unhandled.push_back(path); });
|
||||
QString normalPath = path;
|
||||
if ((normalPath.endsWith(u'/') && !normalPath.endsWith(":/"_L1))
|
||||
|| (normalPath.endsWith(u'\\') && !normalPath.endsWith(":\\"_L1))) {
|
||||
normalPath.chop(1);
|
||||
}
|
||||
QFileInfo fileInfo(normalPath);
|
||||
QFileInfo fileInfo(path);
|
||||
fileInfo.stat();
|
||||
if (!fileInfo.exists())
|
||||
continue;
|
||||
@ -351,7 +346,7 @@ QStringList QWindowsFileSystemWatcherEngine::addPaths(const QStringList &paths,
|
||||
continue;
|
||||
}
|
||||
|
||||
DEBUG() << "Looking for a thread/handle for" << normalPath;
|
||||
DEBUG() << "Looking for a thread/handle for" << fileInfo.path();
|
||||
|
||||
const QString absolutePath = isDir ? fileInfo.absoluteFilePath() : fileInfo.absolutePath();
|
||||
const uint flags = isDir
|
||||
@ -495,11 +490,8 @@ QStringList QWindowsFileSystemWatcherEngine::removePaths(const QStringList &path
|
||||
QStringList unhandled;
|
||||
for (const QString &path : paths) {
|
||||
auto sg = qScopeGuard([&] { unhandled.push_back(path); });
|
||||
QString normalPath = path;
|
||||
if (normalPath.endsWith(u'/') || normalPath.endsWith(u'\\'))
|
||||
normalPath.chop(1);
|
||||
QFileInfo fileInfo(normalPath);
|
||||
DEBUG() << "removing" << normalPath;
|
||||
QFileInfo fileInfo(path);
|
||||
DEBUG() << "removing" << fileInfo.path();
|
||||
QString absolutePath = fileInfo.absoluteFilePath();
|
||||
QList<QWindowsFileSystemWatcherEngineThread *>::iterator jt, end;
|
||||
end = threads.end();
|
||||
|
@ -396,8 +396,14 @@ void tst_QFileSystemWatcher::addPaths()
|
||||
QFileSystemWatcher watcher;
|
||||
QStringList paths;
|
||||
paths << QDir::homePath() << QDir::tempPath();
|
||||
#ifndef Q_OS_QNX
|
||||
// Adding this makes QNX fail and we haven't investigated why
|
||||
for (const QFileInfo &fi : QDir::drives())
|
||||
paths << fi.absoluteFilePath(); // on Unix, this will be just "/"
|
||||
#endif
|
||||
|
||||
QCOMPARE(watcher.addPaths(paths), QStringList());
|
||||
QCOMPARE(watcher.directories().size(), 2);
|
||||
QCOMPARE(watcher.directories().size(), paths.size());
|
||||
|
||||
// With empty list
|
||||
paths.clear();
|
||||
@ -464,8 +470,14 @@ void tst_QFileSystemWatcher::removePaths()
|
||||
QFileSystemWatcher watcher;
|
||||
QStringList paths;
|
||||
paths << QDir::homePath() << QDir::tempPath();
|
||||
#ifndef Q_OS_QNX
|
||||
// Adding this makes QNX fail and we haven't investigated why
|
||||
for (const QFileInfo &fi : QDir::drives())
|
||||
paths << fi.absoluteFilePath(); // on Unix, this will be just "/"
|
||||
#endif
|
||||
|
||||
QCOMPARE(watcher.addPaths(paths), QStringList());
|
||||
QCOMPARE(watcher.directories().size(), 2);
|
||||
QCOMPARE(watcher.directories().size(), paths.size());
|
||||
QCOMPARE(watcher.removePaths(paths), QStringList());
|
||||
QCOMPARE(watcher.directories().size(), 0);
|
||||
|
||||
@ -613,9 +625,11 @@ void tst_QFileSystemWatcher::nonExistingFile()
|
||||
QStringList() << "../..//./does-not-exist");
|
||||
|
||||
// empty path is not actually a failure
|
||||
QTest::ignoreMessage(QtWarningMsg, "QFileSystemWatcher::addPaths: list is empty");
|
||||
QCOMPARE(watcher.addPaths(QStringList() << QString()), QStringList());
|
||||
|
||||
// empty path is not actually a failure
|
||||
QTest::ignoreMessage(QtWarningMsg, "QFileSystemWatcher::removePaths: list is empty");
|
||||
QCOMPARE(watcher.removePaths(QStringList() << QString()), QStringList());
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user