1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
#include "aptpackagesearch.h"
#include <QRegularExpression>
#include "runcommandforparsing.h"
#include "ipackagedb.h"
#include "iprogressobserver.h"
namespace NApt {
class AptCacheSearcher {
const QStringList& includePatterns;
bool searchDescr;
bool wholeWords;
QString createSearchCommandLine() const {
if (searchDescr) {
return createSearchInDescriptionCommandLine();
} else {
return createSearchInNamesCommandline();
}
}
QString createSearchInDescriptionCommandLine() const {
QString commandLine = "apt-cache search";
if (wholeWords) {
QStringList boundaryRegexes = QStringList(includePatterns.size(), "");
std::transform(
includePatterns.begin(),
includePatterns.end(),
boundaryRegexes.begin(),
[](const QString& pattern) {
return createMatchBoundaryRegex(pattern);
}
);
commandLine += " " + boundaryRegexes.join(" ");
} else {
commandLine += " " + includePatterns.join(" ");
}
commandLine += " | awk '{print $1}'";
return commandLine;
}
QString createSearchInNamesCommandline() const {
QStringList boundaryRegexes = QStringList(includePatterns.size(), "");
std::transform(
includePatterns.begin(),
includePatterns.end(),
boundaryRegexes.begin(),
[this](const QString& pattern) {
if (wholeWords)
return "grep -P " + createMatchBoundaryRegex(pattern);
else
return "grep " + pattern;
}
);
return ("apt-cache pkgnames | " + boundaryRegexes.join(" | "));
}
static QString createMatchBoundaryRegex(const QString& name) {
return "\"\\b(\\d*|lib)" + name + "\\d*\\b\"";
}
public:
AptCacheSearcher(const QStringList& includePatterns,
bool searchDescr,
bool wholeWords)
: includePatterns(includePatterns),
searchDescr(searchDescr),
wholeWords(wholeWords) {}
bool search(set<string>& resultCollector) {
bool foundAPackage = false;
auto lineProcessor = [&resultCollector, &foundAPackage](const string& line) {
foundAPackage = true;
resultCollector.insert(line);
};
QString commandLine = createSearchCommandLine();
NApplication::runCommandForParsing(commandLine.toStdString(), lineProcessor);
return foundAPackage;
}
};
AptPackageSearch::AptPackageSearch(IPackageDB* pPackageDB) :
_pPackageDB(pPackageDB)
{
}
bool AptPackageSearch::search(std::set<string>& result,
const QStringList& includePatterns,
bool searchDescr,
bool wholeWords) const {
AptCacheSearcher searcher(includePatterns, searchDescr, wholeWords);
return searcher.search(result);
};
void AptPackageSearch::reloadPackageInformation(NUtil::IProgressObserver* pObserver) {
if (pObserver)
pObserver->setProgress(100);
}
} // namespace NApt
|