X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/859093dae7dcadaff2e15a3885a1824b0d5f5913..858f91bb796e68b8133574cc85649b9af87a9e8b:/apt-private/private-search.cc diff --git a/apt-private/private-search.cc b/apt-private/private-search.cc index 2230c973a..6bce9ffa4 100644 --- a/apt-private/private-search.cc +++ b/apt-private/private-search.cc @@ -32,7 +32,6 @@ bool FullTextSearch(CommandLine &CmdL) /*{{{*/ pkgCacheFile CacheFile; pkgCache *Cache = CacheFile.GetPkgCache(); pkgDepCache::Policy *Plcy = CacheFile.GetPolicy(); - pkgRecords records(CacheFile); if (unlikely(Cache == NULL || Plcy == NULL)) return false; @@ -60,33 +59,48 @@ bool FullTextSearch(CommandLine &CmdL) /*{{{*/ bool const NamesOnly = _config->FindB("APT::Cache::NamesOnly", false); std::map output_map; - std::map::const_iterator K; LocalitySortedVersionSet bag; OpTextProgress progress(*_config); progress.OverallProgress(0, 100, 50, _("Sorting")); - GetLocalitySortedVersionSet(CacheFile, bag, progress); + GetLocalitySortedVersionSet(CacheFile, &bag, &progress); LocalitySortedVersionSet::iterator V = bag.begin(); progress.OverallProgress(50, 100, 50, _("Full Text Search")); progress.SubProgress(bag.size()); + pkgRecords records(CacheFile); + + std::string format = "${color:highlight}${Package}${color:neutral}/${Origin} ${Version} ${Architecture}${ }${apt:Status}\n"; + if (_config->FindB("APT::Cache::ShowFull",false) == false) + format += " ${Description}\n"; + else + format += " ${LongDescription}\n"; + int Done = 0; + std::vector PkgsDone(Cache->Head().PackageCount, false); for ( ;V != bag.end(); ++V) { if (Done%500 == 0) progress.Progress(Done); ++Done; + // we want to list each package only once + pkgCache::PkgIterator const P = V.ParentPkg(); + if (PkgsDone[P->ID] == true) + continue; + + char const * const PkgName = P.Name(); pkgCache::DescIterator Desc = V.TranslatedDescription(); pkgRecords::Parser &parser = records.Lookup(Desc.FileList()); + std::string const LongDesc = parser.LongDesc(); bool all_found = true; for (std::vector::const_iterator pattern = Patterns.begin(); pattern != Patterns.end(); ++pattern) { - if (regexec(&(*pattern), V.ParentPkg().Name(), 0, 0, 0) == 0) + if (regexec(&(*pattern), PkgName, 0, 0, 0) == 0) continue; - else if (NamesOnly == false && regexec(&(*pattern), parser.LongDesc().c_str(), 0, 0, 0) == 0) + else if (NamesOnly == false && regexec(&(*pattern), LongDesc.c_str(), 0, 0, 0) == 0) continue; // search patterns are AND, so one failing fails all all_found = false; @@ -94,10 +108,11 @@ bool FullTextSearch(CommandLine &CmdL) /*{{{*/ } if (all_found == true) { - std::stringstream outs; - ListSingleVersion(CacheFile, records, V, outs); - output_map.insert(std::make_pair( - V.ParentPkg().Name(), outs.str())); + PkgsDone[P->ID] = true; + std::stringstream outs; + ListSingleVersion(CacheFile, records, V, outs, format); + output_map.insert(std::make_pair( + PkgName, outs.str())); } } APT_FREE_PATTERNS(); @@ -105,6 +120,7 @@ bool FullTextSearch(CommandLine &CmdL) /*{{{*/ // FIXME: SORT! and make sorting flexible (alphabetic, by pkg status) // output the sorted map + std::map::const_iterator K; for (K = output_map.begin(); K != output_map.end(); ++K) std::cout << (*K).second << std::endl;