]> git.saurik.com Git - apt.git/blob - apt-private/private-search.cc
really release 1.0.4
[apt.git] / apt-private / private-search.cc
1 // Includes /*{{{*/
2 #include <config.h>
3
4 #include <apt-pkg/cachefile.h>
5 #include <apt-pkg/cacheset.h>
6 #include <apt-pkg/cmndline.h>
7 #include <apt-pkg/pkgrecords.h>
8 #include <apt-pkg/policy.h>
9 #include <apt-pkg/progress.h>
10 #include <apt-pkg/cacheiterators.h>
11 #include <apt-pkg/configuration.h>
12 #include <apt-pkg/depcache.h>
13 #include <apt-pkg/macros.h>
14 #include <apt-pkg/pkgcache.h>
15
16 #include <apt-private/private-cacheset.h>
17 #include <apt-private/private-output.h>
18 #include <apt-private/private-search.h>
19
20 #include <string.h>
21 #include <iostream>
22 #include <sstream>
23 #include <map>
24 #include <string>
25 #include <utility>
26
27 #include <apti18n.h>
28 /*}}}*/
29
30 bool FullTextSearch(CommandLine &CmdL) /*{{{*/
31 {
32 pkgCacheFile CacheFile;
33 pkgCache *Cache = CacheFile.GetPkgCache();
34 pkgDepCache::Policy *Plcy = CacheFile.GetPolicy();
35 pkgRecords records(CacheFile);
36 if (unlikely(Cache == NULL || Plcy == NULL))
37 return false;
38
39 const char **patterns;
40 patterns = CmdL.FileList + 1;
41
42 std::map<std::string, std::string> output_map;
43 std::map<std::string, std::string>::const_iterator K;
44
45 LocalitySortedVersionSet bag;
46 OpTextProgress progress(*_config);
47 progress.OverallProgress(0, 100, 50, _("Sorting"));
48 GetLocalitySortedVersionSet(CacheFile, bag, progress);
49 LocalitySortedVersionSet::iterator V = bag.begin();
50
51 progress.OverallProgress(50, 100, 50, _("Full Text Search"));
52 progress.SubProgress(bag.size());
53 int Done = 0;
54 for ( ;V != bag.end(); ++V)
55 {
56 if (Done%500 == 0)
57 progress.Progress(Done);
58 ++Done;
59
60 int i;
61 pkgCache::DescIterator Desc = V.TranslatedDescription();
62 pkgRecords::Parser &parser = records.Lookup(Desc.FileList());
63
64 bool all_found = true;
65 for(i=0; patterns[i] != NULL; ++i)
66 {
67 // FIXME: use regexp instead of simple find()
68 const char *pattern = patterns[i];
69 all_found &= (
70 strstr(V.ParentPkg().Name(), pattern) != NULL ||
71 strcasestr(parser.ShortDesc().c_str(), pattern) != NULL ||
72 strcasestr(parser.LongDesc().c_str(), pattern) != NULL);
73 // search patterns are AND by default so we can skip looking further
74 // on the first mismatch
75 if(all_found == false)
76 break;
77 }
78 if (all_found)
79 {
80 std::stringstream outs;
81 ListSingleVersion(CacheFile, records, V, outs);
82 output_map.insert(std::make_pair<std::string, std::string>(
83 V.ParentPkg().Name(), outs.str()));
84 }
85 }
86 progress.Done();
87
88 // FIXME: SORT! and make sorting flexible (alphabetic, by pkg status)
89 // output the sorted map
90 for (K = output_map.begin(); K != output_map.end(); ++K)
91 std::cout << (*K).second << std::endl;
92
93 return true;
94 }
95 /*}}}*/