mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-25 22:46:04 +03:00
Folder watcher now reports changing paths instead of dirs.
This commit is contained in:
parent
1ada20ac7b
commit
6d09f1b6c0
5 changed files with 47 additions and 42 deletions
|
@ -140,15 +140,15 @@ void FolderMan::registerFolderMonitor( Folder *folder )
|
|||
fw->addIgnoreListFile( cfg.excludeFile(MirallConfigFile::SystemScope) );
|
||||
fw->addIgnoreListFile( cfg.excludeFile(MirallConfigFile::UserScope) );
|
||||
|
||||
// Connect the folderChanged signal, which comes with the changed path,
|
||||
// Connect the pathChanged signal, which comes with the changed path,
|
||||
// to the signal mapper which maps to the folder alias. The changed path
|
||||
// is lost this way, but we do not need it for the current implementation.
|
||||
connect(fw, SIGNAL(folderChanged(QString)), _folderWatcherSignalMapper, SLOT(map()));
|
||||
connect(fw, SIGNAL(pathChanged(QString)), _folderWatcherSignalMapper, SLOT(map()));
|
||||
_folderWatcherSignalMapper->setMapping(fw, folder->alias());
|
||||
_folderWatchers.insert(folder->alias(), fw);
|
||||
|
||||
// This is at the moment only for the behaviour of the SocketApi.
|
||||
connect(fw, SIGNAL(folderChanged(QString)), folder, SLOT(watcherSlot(QString)));
|
||||
connect(fw, SIGNAL(pathChanged(QString)), folder, SLOT(watcherSlot(QString)));
|
||||
}
|
||||
|
||||
// register the folder with the socket API
|
||||
|
|
|
@ -130,7 +130,7 @@ void FolderWatcher::changeDetected( const QStringList& paths )
|
|||
_lastPaths = pathsSet;
|
||||
_timer.restart();
|
||||
|
||||
QSet<QString> changedFolders;
|
||||
QSet<QString> changedPaths;
|
||||
|
||||
// ------- handle ignores:
|
||||
for (int i = 0; i < paths.size(); ++i) {
|
||||
|
@ -139,20 +139,15 @@ void FolderWatcher::changeDetected( const QStringList& paths )
|
|||
continue;
|
||||
}
|
||||
|
||||
QFileInfo fi(path);
|
||||
if (fi.isDir()) {
|
||||
changedFolders.insert(path);
|
||||
} else {
|
||||
changedFolders.insert(fi.dir().path());
|
||||
}
|
||||
changedPaths.insert(path);
|
||||
}
|
||||
if (changedFolders.isEmpty()) {
|
||||
if (changedPaths.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
qDebug() << "detected changes in folders:" << changedFolders;
|
||||
foreach (const QString &path, changedFolders) {
|
||||
emit folderChanged(path);
|
||||
qDebug() << "detected changes in paths:" << changedPaths;
|
||||
foreach (const QString &path, changedPaths) {
|
||||
emit pathChanged(path);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ class FolderWatcherPrivate;
|
|||
/*
|
||||
* Folder Watcher monitors a directory and its sub directories
|
||||
* for changes in the local file system. Changes are signalled
|
||||
* through the folderChanged() signal.
|
||||
* through the pathChanged() signal.
|
||||
*
|
||||
* Note that if new folders are created, this folderwatcher class
|
||||
* does not automatically adds them to the list of monitored
|
||||
|
@ -74,8 +74,9 @@ public:
|
|||
bool pathIsIgnored( const QString& path );
|
||||
|
||||
signals:
|
||||
/** Emitted when one of the paths is changed */
|
||||
void folderChanged(const QString &path);
|
||||
/** Emitted when one of the watched directories or one
|
||||
* of the contained files is changed. */
|
||||
void pathChanged(const QString &path);
|
||||
|
||||
/** Emitted if an error occurs */
|
||||
void error(const QString& error);
|
||||
|
|
|
@ -159,7 +159,6 @@ void FolderWatcherPrivate::slotReceivedNotification(int fd)
|
|||
while(i + sizeof(struct inotify_event) < static_cast<unsigned int>(len)) {
|
||||
// cast an inotify_event
|
||||
event = (struct inotify_event*)&buffer[i];
|
||||
// with the help of watch descriptor, retrieve, corresponding INotify
|
||||
if (event == NULL) {
|
||||
qDebug() << "NULL event";
|
||||
i += sizeof(struct inotify_event);
|
||||
|
|
|
@ -73,7 +73,7 @@ private slots:
|
|||
Utility::writeRandomFile( _root+"/a1/movefile");
|
||||
|
||||
_watcher = new FolderWatcher(_root);
|
||||
QObject::connect(_watcher, SIGNAL(folderChanged(QString)), this, SLOT(slotFolderChanged(QString)));
|
||||
QObject::connect(_watcher, SIGNAL(pathChanged(QString)), this, SLOT(slotFolderChanged(QString)));
|
||||
_timer.singleShot(5000, this, SLOT(slotEnd()));
|
||||
}
|
||||
|
||||
|
@ -91,9 +91,10 @@ private slots:
|
|||
}
|
||||
|
||||
void testACreate() { // create a new file
|
||||
QString file(_root + "/foo.txt");
|
||||
QString cmd;
|
||||
_requiredNotifications.insert(_root);
|
||||
cmd = QString("echo \"xyz\" > %1/foo.txt").arg(_root);
|
||||
_requiredNotifications.insert(file);
|
||||
cmd = QString("echo \"xyz\" > %1").arg(file);
|
||||
qDebug() << "Command: " << cmd;
|
||||
system(cmd.toLocal8Bit());
|
||||
|
||||
|
@ -101,12 +102,13 @@ private slots:
|
|||
}
|
||||
|
||||
void testATouch() { // touch an existing file.
|
||||
_requiredNotifications.insert(_root+"/a1");
|
||||
QString file(_root + "/a1/random.bin");
|
||||
_requiredNotifications.insert(file);
|
||||
#ifdef Q_OS_WIN
|
||||
Utility::writeRandomFile(QString("%1/a1/random.bin").arg(_root));
|
||||
#else
|
||||
QString cmd;
|
||||
cmd = QString("/usr/bin/touch %1/a1/random.bin").arg(_root);
|
||||
cmd = QString("/usr/bin/touch %1").arg(file);
|
||||
qDebug() << "Command: " << cmd;
|
||||
system(cmd.toLocal8Bit());
|
||||
#endif
|
||||
|
@ -115,47 +117,55 @@ private slots:
|
|||
}
|
||||
|
||||
void testCreateADir() {
|
||||
_requiredNotifications.insert(_root+"/a1/b1");
|
||||
_skipNotifications.insert(_root + "/a1/b1/new_dir");
|
||||
QString file(_root+"/a1/b1/new_dir");
|
||||
_requiredNotifications.insert(file);
|
||||
//_skipNotifications.insert(_root + "/a1/b1/new_dir");
|
||||
QDir dir;
|
||||
dir.mkdir( _root + "/a1/b1/new_dir");
|
||||
QVERIFY(QFile::exists(_root + "/a1/b1/new_dir"));
|
||||
dir.mkdir(file);
|
||||
QVERIFY(QFile::exists(file));
|
||||
|
||||
checkNotifications();
|
||||
}
|
||||
|
||||
void testRemoveADir() {
|
||||
_requiredNotifications.insert(_root+"/a1/b3");
|
||||
QString file(_root+"/a1/b3/c3");
|
||||
_requiredNotifications.insert(file);
|
||||
QDir dir;
|
||||
QVERIFY(dir.rmdir(_root+"/a1/b3/c3"));
|
||||
QVERIFY(dir.rmdir(file));
|
||||
|
||||
checkNotifications();
|
||||
}
|
||||
|
||||
void testRemoveAFile() {
|
||||
_requiredNotifications.insert(_root+"/a1/b2");
|
||||
QVERIFY(QFile::exists(_root+"/a1/b2/todelete.bin"));
|
||||
QFile::remove(_root+"/a1/b2/todelete.bin");
|
||||
QVERIFY(!QFile::exists(_root+"/a1/b2/todelete.bin"));
|
||||
QString file(_root+"/a1/b2/todelete.bin");
|
||||
_requiredNotifications.insert(file);
|
||||
QVERIFY(QFile::exists(file));
|
||||
QFile::remove(file);
|
||||
QVERIFY(!QFile::exists(file));
|
||||
|
||||
checkNotifications();
|
||||
}
|
||||
|
||||
void testRenameAFile() {
|
||||
_requiredNotifications.insert(_root+"/a2");
|
||||
QVERIFY(QFile::exists(_root+"/a2/renamefile"));
|
||||
QFile::rename(_root+"/a2/renamefile", _root+"/a2/renamefile.renamed" );
|
||||
QVERIFY(QFile::exists(_root+"/a2/renamefile.renamed"));
|
||||
QString file1(_root+"/a2/renamefile");
|
||||
QString file2(_root+"/a2/renamefile.renamed");
|
||||
_requiredNotifications.insert(file1);
|
||||
_requiredNotifications.insert(file2);
|
||||
QVERIFY(QFile::exists(file1));
|
||||
QFile::rename(file1, file2);
|
||||
QVERIFY(QFile::exists(file2));
|
||||
|
||||
checkNotifications();
|
||||
}
|
||||
|
||||
void testMoveAFile() {
|
||||
_requiredNotifications.insert(_root+"/a1");
|
||||
_requiredNotifications.insert(_root+"/a2");
|
||||
QVERIFY(QFile::exists(_root+"/a1/movefile"));
|
||||
QFile::rename(_root+"/a1/movefile", _root+"/a2/movefile.renamed" );
|
||||
QVERIFY(QFile::exists(_root+"/a2/movefile.renamed"));
|
||||
QString old_file(_root+"/a1/movefile");
|
||||
QString new_file(_root+"/a2/movefile.renamed");
|
||||
_requiredNotifications.insert(old_file);
|
||||
_requiredNotifications.insert(new_file);
|
||||
QVERIFY(QFile::exists(old_file));
|
||||
QFile::rename(old_file, new_file);
|
||||
QVERIFY(QFile::exists(new_file));
|
||||
|
||||
checkNotifications();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue