Docker: fix find arguments, support outputForRunInShell called from non-main thread

* Added -mindepth 1 to not return the directory that is being searched in.
* Added parenthesis around -type options to correctly express that files OR directories
  should be searched, without affecting the following parameters.
* Added parenthesis around -readable, -writeable and -executable and added -o between them,
  to correctly indicate that any of the selected type should be searched for.

Change-Id: Ibc77a2a99826663b88015e8f43b5664563384127
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Marcus Tillmanns
2022-05-04 11:10:57 +02:00
parent 450a7754c3
commit 441488dd52

View File

@@ -883,24 +883,43 @@ void DockerDevice::iterateWithFind(const FilePath &filePath,
else else
arguments.prepend("-L"); arguments.prepend("-L");
arguments.append({"-mindepth", "1"});
if (!filter.iteratorFlags.testFlag(QDirIterator::Subdirectories)) if (!filter.iteratorFlags.testFlag(QDirIterator::Subdirectories))
arguments.append({"-maxdepth", "1"}); arguments.append({"-maxdepth", "1"});
QStringList filterOptions; QStringList filterOptions;
if (!(filters & QDir::Hidden))
filterOptions << "!" << "-name" << ".*";
QStringList filterFilesAndDirs;
if (filters & QDir::Dirs) if (filters & QDir::Dirs)
filterOptions << "-type" << "d"; filterFilesAndDirs << "-type" << "d";
if (filters & QDir::Files) { if (filters & QDir::Files) {
if (!filterOptions.isEmpty()) if (!filterFilesAndDirs.isEmpty())
filterOptions << "-o"; filterFilesAndDirs << "-o";
filterOptions << "-type" << "f"; filterFilesAndDirs << "-type" << "f";
}
if (!filterFilesAndDirs.isEmpty())
filterOptions << "(" << filterFilesAndDirs << ")";
QStringList accessOptions;
if (filters & QDir::Readable)
accessOptions << "-readable";
if (filters & QDir::Writable) {
if (!accessOptions.isEmpty())
accessOptions << "-o";
accessOptions << "-writable";
}
if (filters & QDir::Executable) {
if (!accessOptions.isEmpty())
accessOptions << "-o";
accessOptions << "-executable";
} }
if (filters & QDir::Readable) if (!accessOptions.isEmpty())
filterOptions << "-readable"; filterOptions << "(" << accessOptions << ")";
if (filters & QDir::Writable)
filterOptions << "-writable";
if (filters & QDir::Executable)
filterOptions << "-executable";
QTC_CHECK(filters ^ QDir::AllDirs); QTC_CHECK(filters ^ QDir::AllDirs);
QTC_CHECK(filters ^ QDir::Drives); QTC_CHECK(filters ^ QDir::Drives);
@@ -1109,7 +1128,13 @@ static QByteArray randomHex()
QByteArray DockerDevicePrivate::outputForRunInShell(const CommandLine &cmd) const QByteArray DockerDevicePrivate::outputForRunInShell(const CommandLine &cmd) const
{ {
QTC_ASSERT(QThread::currentThread() == qApp->thread(), return {}); if (QThread::currentThread() != qApp->thread()) {
QByteArray result;
QMetaObject::invokeMethod(const_cast<DockerDevicePrivate*>(this), [this, &cmd, &result] {
result = this->outputForRunInShell(cmd);
}, Qt::BlockingQueuedConnection);
return result;
}
if (!DockerApi::isDockerDaemonAvailable(false).value_or(false)) if (!DockerApi::isDockerDaemonAvailable(false).value_or(false))
return {}; return {};