aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/utils/filesystemwatcher.cpp59
1 files changed, 46 insertions, 13 deletions
diff --git a/src/libs/utils/filesystemwatcher.cpp b/src/libs/utils/filesystemwatcher.cpp
index 3f427cce2e..ad7f77c10e 100644
--- a/src/libs/utils/filesystemwatcher.cpp
+++ b/src/libs/utils/filesystemwatcher.cpp
@@ -275,15 +275,19 @@ void FileSystemWatcher::addFiles(const QStringList &files, WatchMode wm)
const int count = ++d->m_staticData->m_fileCount[file];
Q_ASSERT(count > 0);
- if (count == 1)
+ if (count == 1) {
toAdd << file;
- const QString directory = QFileInfo(file).path();
- const int dirCount = ++d->m_staticData->m_directoryCount[directory];
- Q_ASSERT(dirCount > 0);
+ QFileInfo fi(file);
+ if (!fi.exists()) {
+ const QString directory = fi.path();
+ const int dirCount = ++d->m_staticData->m_directoryCount[directory];
+ Q_ASSERT(dirCount > 0);
- if (dirCount == 1)
- toAdd << directory;
+ if (dirCount == 1)
+ toAdd << directory;
+ }
+ }
}
if (!toAdd.isEmpty())
@@ -311,15 +315,19 @@ void FileSystemWatcher::removeFiles(const QStringList &files)
const int count = --(d->m_staticData->m_fileCount[file]);
Q_ASSERT(count >= 0);
- if (!count)
+ if (!count) {
toRemove << file;
- const QString directory = QFileInfo(file).path();
- const int dirCount = --d->m_staticData->m_directoryCount[directory];
- Q_ASSERT(dirCount >= 0);
+ QFileInfo fi(file);
+ if (!fi.exists()) {
+ const QString directory = fi.path();
+ const int dirCount = --d->m_staticData->m_directoryCount[directory];
+ Q_ASSERT(dirCount >= 0);
- if (!dirCount)
- toRemove << directory;
+ if (!dirCount)
+ toRemove << directory;
+ }
+ }
}
if (!toRemove.isEmpty())
@@ -418,13 +426,27 @@ QStringList FileSystemWatcher::directories() const
void FileSystemWatcher::slotFileChanged(const QString &path)
{
const auto it = d->m_files.find(path);
+ QStringList toAdd;
if (it != d->m_files.end() && it.value().trigger(path)) {
if (debug)
qDebug() << this << "triggers on file " << path
<< it.value().watchMode
<< it.value().modifiedTime.toString(Qt::ISODate);
d->fileChanged(path);
+
+ QFileInfo fi(path);
+ if (!fi.exists()) {
+ const QString directory = fi.path();
+ const int dirCount = ++d->m_staticData->m_directoryCount[directory];
+ Q_ASSERT(dirCount > 0);
+
+ if (dirCount == 1)
+ toAdd << directory;
+ }
}
+
+ if (!toAdd.isEmpty())
+ d->m_staticData->m_watcher->addPaths(toAdd);
}
void FileSystemWatcher::slotDirectoryChanged(const QString &path)
@@ -450,9 +472,20 @@ void FileSystemWatcher::slotDirectoryChanged(const QString &path)
for (const QString &rejected : d->m_staticData->m_watcher->addPaths(toReadd))
toReadd.removeOne(rejected);
+ QStringList toRemove;
// If we've successfully added the file, that means it was deleted and replaced.
- for (const QString &reAdded : std::as_const(toReadd))
+ for (const QString &reAdded : std::as_const(toReadd)) {
d->fileChanged(reAdded);
+ const QString directory = QFileInfo(reAdded).path();
+ const int dirCount = --d->m_staticData->m_directoryCount[directory];
+ Q_ASSERT(dirCount >= 0);
+
+ if (!dirCount)
+ toRemove << directory;
+ }
+
+ if (!toRemove.isEmpty())
+ d->m_staticData->m_watcher->removePaths(toRemove);
}
}