diff --git a/src/engine/experimental/databasesanitizer.cpp b/src/engine/experimental/databasesanitizer.cpp --- a/src/engine/experimental/databasesanitizer.cpp +++ b/src/engine/experimental/databasesanitizer.cpp @@ -169,17 +169,36 @@ return info; } + Summary removeIgnored(QVector& infos, const DatabaseSanitizer::ItemAccessFilters accessFilter) + { + const auto ignoredDevices = deviceFilters(infos, accessFilter); + auto tail = infos.end(); + Summary summary; + for (const quint32 deviceId : ignoredDevices) { + tail = std::remove_if(infos.begin(), tail, + [deviceId,&summary] (const FileInfo& info) { + summary.accessible += info.accessible; + return info.id == deviceId; + }); + } + summary.ignored = infos.end() - tail; + infos.erase(tail, infos.end()); + return summary; + } - QMap deviceFilters(QVector& infos, const DatabaseSanitizer::ItemAccessFilters accessFilter) + QVector deviceFilters(QVector& infos, const DatabaseSanitizer::ItemAccessFilters accessFilter) { - QMap result; + QSet deviceIds; for (const auto& info : infos) { - result[info.deviceId] = false; + deviceIds.insert(info.deviceId); } - for (auto it = result.begin(), end = result.end(); it != end; it++) { - const auto storageInfo = getStorageInfo(it.key()); - it.value() = isIgnored(storageInfo, accessFilter); + QVector result; + for (const quint32 id : deviceIds) { + const auto storageInfo = getStorageInfo(id); + if (!isIgnored(storageInfo, accessFilter)) { + result.append(id); + } } return result; } @@ -260,18 +279,21 @@ const QSharedPointer& urlFilter) { auto listResult = m_pimpl->createList(deviceIds, accessFilter, urlFilter); + auto& summary = listResult.second; + auto diff = m_pimpl->removeIgnored(listResult.first, accessFilter); + summary.ignored += diff.ignored; + summary.accessible -= diff.accessible; const auto sep = QLatin1Char(' '); QTextStream out(stdout); QTextStream err(stderr); for (const auto& info: listResult.first) { out << QStringLiteral("%1").arg(info.accessible ? "+" : "!") - << sep << QStringLiteral("device: %1").arg(info.deviceId) - << sep << QStringLiteral("inode: %1").arg(info.inode) - << sep << QStringLiteral("url: %1").arg(info.url) - << endl; + << sep << QStringLiteral("device: %1").arg(info.deviceId) + << sep << QStringLiteral("inode: %1").arg(info.inode) + << sep << QStringLiteral("url: %1").arg(info.url) + << endl; } - const auto& summary = listResult.second; if (accessFilter & IgnoreAvailable) { err << i18n("Total: %1, Inaccessible: %2", summary.total, @@ -298,19 +320,20 @@ const auto sep = QLatin1Char(' '); QTextStream out(stdout); QTextStream err(stderr); - int matchCount = 0; + DatabaseSanitizerImpl::Summary summary; + summary.total = useCount.size(); + for (auto it = useCount.cbegin(); it != useCount.cend(); it++) { auto id = it.key(); auto info = m_pimpl->getStorageInfo(id); - auto mounted = info.isValid(); - if (info.fileSystemType() == QLatin1String("tmpfs")) { - continue; - } else if (mounted && (accessFilter & IgnoreMounted)) { - continue; - } else if (!mounted && (accessFilter & IgnoreUnmounted)) { + if (m_pimpl->isIgnored(info, accessFilter)) { + summary.ignored++; continue; } - matchCount++; + auto mounted = info.isValid(); + if (mounted) { + summary.accessible++; + } // TODO coloring would be nice, but "...|grep '^!'" does not work with it. // out << QStringLiteral("%1").arg(dev.mounted ? "+" : "\033[1;31m!") // Can be done, see: https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/global/qlogging.cpp#n263 @@ -322,8 +345,7 @@ << sep << QStringLiteral("indexed-items:%1").arg(it.value()); if (mounted) { - out - << sep << QStringLiteral("fstype:%1").arg(info.fileSystemType().toPercentEncoding().constData()) + out << sep << QStringLiteral("fstype:%1").arg(info.fileSystemType().toPercentEncoding().constData()) << sep << QStringLiteral("device:%1").arg(info.device().constData()) << sep << QStringLiteral("path:%1").arg(info.rootPath()) ; @@ -333,38 +355,42 @@ out << endl; } - err << i18n("Found %1 matching in %2 devices", matchCount, useCount.size()) << endl; + err << i18n("Total: %1, Ignored: %2; Mounted: %3, Not mounted: %4", + summary.total, + summary.ignored, + summary.accessible, + summary.total - (summary.ignored + summary.accessible)) + << endl; } void DatabaseSanitizer::removeStaleEntries(const QVector& deviceIds, const DatabaseSanitizer::ItemAccessFilters accessFilter, const bool dryRun, const QSharedPointer& urlFilter) { auto listResult = m_pimpl->createList(deviceIds, IgnoreAvailable, urlFilter); + auto& summary = listResult.second; + auto diff = m_pimpl->removeIgnored(listResult.first, accessFilter); + summary.ignored += diff.ignored; + Q_ASSERT(diff.accessible == 0); const auto ignoredDevices = m_pimpl->deviceFilters(listResult.first, accessFilter); const auto sep = QLatin1Char(' '); - auto& summary = listResult.second; QTextStream out(stdout); QTextStream err(stderr); for (const auto& info: listResult.first) { - if (ignoredDevices[info.deviceId] == true) { + if (info.isSymLink) { + out << i18n("IgnoredSymbolicLink:"); summary.ignored++; } else { - if (info.isSymLink) { - out << i18n("IgnoredSymbolicLink:"); - summary.ignored++; - } else { - m_pimpl->removeDocument(info.id); - out << i18n("Removing:"); - } - out << sep << QStringLiteral("device: %1").arg(info.deviceId) - << sep << QStringLiteral("inode: %1").arg(info.inode) - << sep << QStringLiteral("url: %1").arg(info.url) - << endl; + m_pimpl->removeDocument(info.id); + out << i18n("Removing:"); } + out << sep << QStringLiteral("device: %1").arg(info.deviceId) + << sep << QStringLiteral("inode: %1").arg(info.inode) + << sep << QStringLiteral("url: %1").arg(info.url) + << endl; } if (dryRun) { m_pimpl->abort(); diff --git a/src/tools/experimental/baloodb/main.cpp b/src/tools/experimental/baloodb/main.cpp --- a/src/tools/experimental/baloodb/main.cpp +++ b/src/tools/experimental/baloodb/main.cpp @@ -77,14 +77,18 @@ }, QStringList{ QStringLiteral("missing-only"), + QStringLiteral("mounted-only"), QStringLiteral("device-id") } }, Command{ QStringLiteral("devices"), i18n("List devices"), QStringList{}, - QStringList{QStringLiteral("missing-only")} + QStringList{ + QStringLiteral("missing-only"), + QStringLiteral("mounted-only") + } }, /*TODO: Command{ @@ -133,7 +137,7 @@ auto options = getOptions(c.name); const QString optionStr = options.isEmpty() ? QString() - : QStringLiteral(" [--%1]").arg(options.join(QLatin1Literal("] [--"))); + : QStringLiteral(" [--%1]").arg(options.join(QLatin1Literal(", --"))); QString argumentStr; if (!c.args.isEmpty() ) { @@ -146,7 +150,7 @@ .arg(argumentStr); const QString str = QStringLiteral("%1 %2") - .arg(commandStr, -58) + .arg(commandStr, -62) .arg(c.description); allowedcommands.append(str);