diff --git a/src/engine/databasesanitizer.h b/src/engine/databasesanitizer.h --- a/src/engine/databasesanitizer.h +++ b/src/engine/databasesanitizer.h @@ -81,6 +81,10 @@ private: DatabaseSanitizer(const DatabaseSanitizer& rhs) = delete; DatabaseSanitizerImpl* m_pimpl; + const QPair, QPair> colors{ + {QStringLiteral("\033[1;31m"),QStringLiteral("\033[0m")}, + {QString(), QString()} + }; }; Q_DECLARE_OPERATORS_FOR_FLAGS(DatabaseSanitizer::ItemAccessFilters) diff --git a/src/engine/databasesanitizer.cpp b/src/engine/databasesanitizer.cpp --- a/src/engine/databasesanitizer.cpp +++ b/src/engine/databasesanitizer.cpp @@ -25,7 +25,9 @@ #include "idutils.h" #include +#include #include +#include namespace Baloo { @@ -175,7 +177,7 @@ devinfo.items = usedDevices.values(dev).count(); result.append(devinfo); } else { - qDebug() << "Ignoring device" << devinfo.id; + qDebug() << "Ignoring unmounted device" << devinfo.id; } } return result; @@ -240,18 +242,25 @@ const auto sep = QLatin1Char(' '); QTextStream out(stdout); QTextStream err(stderr); + const bool useColors = isatty(fileno(stdout)); + QPair color; for (const auto& info: infos) { if (!(accessFilter & IgnoreAvailable)) { - out << QStringLiteral("%1").arg(info.accessible ? "+" : "!") << sep; + color = (useColors && !info.accessible) ? colors.first : colors.second; + out << QStringLiteral("%1%2%3") + .arg(color.first) + .arg(info.accessible ? "+" : "!") + .arg(color.second) + << sep; } else if (!info.accessible) { out << i18n("Missing:") << sep; } else { Q_ASSERT(false); continue; } out << QStringLiteral("device: %1").arg(info.deviceId) << sep << QStringLiteral("inode: %1").arg(info.inode) - << sep << QStringLiteral("url: %1").arg(info.url) + << sep << QStringLiteral("url: %1%2%3").arg(color.first).arg(info.url).arg(color.second) << endl; } err << i18n("Found %1 matching items", infos.count()) << endl; @@ -267,14 +276,16 @@ QTextStream out(stdout); QTextStream err(stderr); int matchCount = 0; + const bool useColors = isatty(fileno(stdout)); + QPair color; for (const auto& dev : usedDevices) { if ((accessFilter & IgnoreMounted) && dev.mounted) { continue; + } else { + color = !dev.mounted && useColors ? colors.first : colors.second; } matchCount++; - // TODO coloring would be nice, but "...|grep '^!'" does not work with it. - // out << QStringLiteral("%1").arg(dev.mounted ? "+" : "\033[1;31m!") - out << QStringLiteral("%1").arg(dev.mounted ? "+" : "!") + out << QStringLiteral("%1%2").arg(color.first).arg(dev.mounted ? "+" : "!") << sep << QStringLiteral("device:%1").arg(dev.id) << sep << QStringLiteral("indexed-items:%1").arg(dev.items); @@ -285,9 +296,7 @@ << sep << QStringLiteral("mount:%1").arg(dev.fsInfo.mountpoint) ; } - // TODO: see above - // out << QStringLiteral("\033[0m") << endl; - out << endl; + out << color.second << endl; } err << i18n("Found %1 matching in %2 devices", matchCount, usedDevices.count()) << endl; @@ -299,18 +308,21 @@ const QSharedPointer& urlFilter) { auto infos = m_pimpl->createList(deviceIds, IgnoreAvailable, urlFilter); + int ignored = 0; auto devices = m_pimpl->createDeviceList(infos, accessFilter); QVector deviceIdFilter; for (const auto& devInfo: devices) { deviceIdFilter.append(devInfo.id); } const auto sep = QLatin1Char(' '); QTextStream out(stdout); QTextStream err(stderr); + const auto color = isatty(fileno(stdout)) ? colors.first : colors.second; for (const auto& info: infos) { if (deviceIdFilter.contains(info.deviceId)) { if (info.isSymLink) { - out << i18n("IgnoredSymbolicLink:"); + out << QStringLiteral("%1%2%3").arg(color.first).arg(i18n("IgnoredSymbolicLink:")).arg(color.second); + ignored++; } else { m_pimpl->m_transaction->removeDocument(info.id); out << i18n("Removing:"); @@ -326,5 +338,5 @@ } else { m_pimpl->m_transaction->commit(); } - err << i18n("Removed %1 items", infos.count()) << endl; + err << i18n("Removed %1 items", infos.count() - ignored) << endl; } diff --git a/src/tools/baloodb/main.cpp b/src/tools/baloodb/main.cpp --- a/src/tools/baloodb/main.cpp +++ b/src/tools/baloodb/main.cpp @@ -46,32 +46,31 @@ QCommandLineOption{ QStringList{QStringLiteral("i"), QStringLiteral("device-id")}, i18n("Filter by device id." - "\n0 (default) does not filter and everything is printed." - "\nPositive numbers are including filters printing only the mentioned device id." - "\nNegative numbers are excluding filters printing everything but the mentioned device id." + "\n* 0 (default) does not filter and everything is printed." + "\n* Positive numbers are including filters printing only the mentioned device id." + "\n* Negative numbers are excluding filters printing everything but the mentioned device id." "\nMay be given multiple times."), i18n("integer"), 0 }, QCommandLineOption{ QStringList{QStringLiteral("m"), QStringLiteral("missing-only")}, - i18n("List only inaccessible entries.\nOnly applies to \"%1\"", QStringLiteral("list")) + i18n("Ignore accessible items") }, QCommandLineOption{ QStringList{QStringLiteral("u"), QStringLiteral("mounted-only")}, - i18n("Act only on item on mounted devices") + i18n("Act only on items residing on mounted devices") }, QCommandLineOption{ QStringList{QStringLiteral("D"), QStringLiteral("dry-run")}, - i18n("Print results of a prune operation, but do not change anything." - "\nOnly applies to \"%1\" command", QStringLiteral("prune")) + i18n("Simulate an operation, print the results but do not change anything.") } }; const auto commands = std::vector{ Command{ QStringLiteral("list"), - i18n("List database contents. Use a regular expression as argument to filter output"), + i18n("List database contents"), QStringList{ QStringLiteral("pattern") },