Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH] emerge --search: fix duplication of results (bug 559044)
Date: Sat, 29 Aug 2015 05:35:45
Message-Id: 1440826523-26000-1-git-send-email-zmedico@gentoo.org
1 Fix search._cp_all() to ensure sorted input for MultiIterGroupBy.
2 Add a boolean "sort" keyword argument to all dbapi.cp_all()
3 implementations, and set defaults for backward compatible behavior.
4
5 X-Gentoo-Bug: 559044
6 X-Gentoo-Bug-url: https://bugs.gentoo.org/show_bug.cgi?id=559044
7 Signed-off-by: Zac Medico <zmedico@g.o>
8 ---
9 pym/_emerge/PackageVirtualDbapi.py | 4 ++--
10 pym/_emerge/search.py | 3 ++-
11 pym/portage/dbapi/IndexedPortdb.py | 4 ++--
12 pym/portage/dbapi/IndexedVardb.py | 6 +++---
13 pym/portage/dbapi/__init__.py | 4 ++--
14 pym/portage/dbapi/bintree.py | 4 ++--
15 pym/portage/dbapi/porttree.py | 6 ++++--
16 pym/portage/dbapi/vartree.py | 4 ++--
17 pym/portage/dbapi/virtual.py | 4 ++--
18 9 files changed, 21 insertions(+), 18 deletions(-)
19
20 diff --git a/pym/_emerge/PackageVirtualDbapi.py b/pym/_emerge/PackageVirtualDbapi.py
21 index 56a5576..26293dd 100644
22 --- a/pym/_emerge/PackageVirtualDbapi.py
23 +++ b/pym/_emerge/PackageVirtualDbapi.py
24 @@ -105,8 +105,8 @@ class PackageVirtualDbapi(dbapi):
25 self._match_cache[cache_key] = cpv_list
26 return cpv_list[:]
27
28 - def cp_all(self):
29 - return list(self._cp_map)
30 + def cp_all(self, sort=False):
31 + return sorted(self._cp_map) if sort else list(self._cp_map)
32
33 def cpv_all(self):
34 return list(self._cpv_map)
35 diff --git a/pym/_emerge/search.py b/pym/_emerge/search.py
36 index 41c182d..32d326e 100644
37 --- a/pym/_emerge/search.py
38 +++ b/pym/_emerge/search.py
39 @@ -72,7 +72,8 @@ class search(object):
40 def _cp_all(self):
41 iterators = []
42 for db in self._dbs:
43 - i = db.cp_all()
44 + # MultiIterGroupBy requires sorted input
45 + i = db.cp_all(sort=True)
46 try:
47 i = iter(i)
48 except TypeError:
49 diff --git a/pym/portage/dbapi/IndexedPortdb.py b/pym/portage/dbapi/IndexedPortdb.py
50 index e96f83c..510e027 100644
51 --- a/pym/portage/dbapi/IndexedPortdb.py
52 +++ b/pym/portage/dbapi/IndexedPortdb.py
53 @@ -127,14 +127,14 @@ class IndexedPortdb(object):
54 if new_cp is not None:
55 yield cp_group[0].cp
56
57 - def cp_all(self):
58 + def cp_all(self, sort=True):
59 """
60 Returns an ordered iterator instead of a list, so that search
61 results can be displayed incrementally.
62 """
63 if self._cp_map is None:
64 return self._init_index()
65 - return iter(sorted(self._cp_map))
66 + return iter(sorted(self._cp_map)) if sort else iter(self._cp_map)
67
68 def match(self, atom):
69 """
70 diff --git a/pym/portage/dbapi/IndexedVardb.py b/pym/portage/dbapi/IndexedVardb.py
71 index 38bfeed..b946670 100644
72 --- a/pym/portage/dbapi/IndexedVardb.py
73 +++ b/pym/portage/dbapi/IndexedVardb.py
74 @@ -35,13 +35,13 @@ class IndexedVardb(object):
75
76 self._cp_map = None
77
78 - def cp_all(self):
79 + def cp_all(self, sort=True):
80 """
81 Returns an ordered iterator instead of a list, so that search
82 results can be displayed incrementally.
83 """
84 if self._cp_map is not None:
85 - return iter(sorted(self._cp_map))
86 + return iter(sorted(self._cp_map)) if sort else iter(self._cp_map)
87
88 delta_data = self._vardb._cache_delta.loadRace()
89 if delta_data is None:
90 @@ -62,7 +62,7 @@ class IndexedVardb(object):
91 cp_map[cpv.cp] = cp_list
92 cp_list.append(cpv)
93
94 - return iter(sorted(self._cp_map))
95 + return iter(sorted(self._cp_map)) if sort else iter(self._cp_map)
96
97 def _iter_cp_all(self):
98 self._cp_map = cp_map = {}
99 diff --git a/pym/portage/dbapi/__init__.py b/pym/portage/dbapi/__init__.py
100 index 044faec..b6745fa 100644
101 --- a/pym/portage/dbapi/__init__.py
102 +++ b/pym/portage/dbapi/__init__.py
103 @@ -94,10 +94,10 @@ class dbapi(object):
104 cpv_list.extend(self.cp_list(cp))
105 return cpv_list
106
107 - def cp_all(self):
108 + def cp_all(self, sort=False):
109 """ Implement this in a child class
110 Args
111 - None
112 + sort - return sorted results
113 Returns:
114 A list of strings 1 per CP in the datastore
115 """
116 diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py
117 index f415a63..9f47436 100644
118 --- a/pym/portage/dbapi/bintree.py
119 +++ b/pym/portage/dbapi/bintree.py
120 @@ -223,10 +223,10 @@ class bindbapi(fakedbapi):
121 self.bintree.populate()
122 return fakedbapi.cp_list(self, *pargs, **kwargs)
123
124 - def cp_all(self):
125 + def cp_all(self, sort=False):
126 if not self.bintree.populated:
127 self.bintree.populate()
128 - return fakedbapi.cp_all(self)
129 + return fakedbapi.cp_all(self, sort=sort)
130
131 def cpv_all(self):
132 if not self.bintree.populated:
133 diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py
134 index 590e3c5..d13fdee 100644
135 --- a/pym/portage/dbapi/porttree.py
136 +++ b/pym/portage/dbapi/porttree.py
137 @@ -706,7 +706,7 @@ class portdbapi(dbapi):
138 else:
139 return 0
140
141 - def cp_all(self, categories=None, trees=None, reverse=False):
142 + def cp_all(self, categories=None, trees=None, reverse=False, sort=True):
143 """
144 This returns a list of all keys in our tree or trees
145 @param categories: optional list of categories to search or
146 @@ -714,6 +714,7 @@ class portdbapi(dbapi):
147 @param trees: optional list of trees to search the categories in or
148 defaults to self.porttrees
149 @param reverse: reverse sort order (default is False)
150 + @param sort: return sorted results (default is True)
151 @rtype list of [cat/pkg,...]
152 """
153 d = {}
154 @@ -732,7 +733,8 @@ class portdbapi(dbapi):
155 continue
156 d[atom.cp] = None
157 l = list(d)
158 - l.sort(reverse=reverse)
159 + if sort:
160 + l.sort(reverse=reverse)
161 return l
162
163 def cp_list(self, mycp, use_cache=1, mytree=None):
164 diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
165 index 62d880e..927c645 100644
166 --- a/pym/portage/dbapi/vartree.py
167 +++ b/pym/portage/dbapi/vartree.py
168 @@ -491,7 +491,7 @@ class vardbapi(dbapi):
169
170 yield subpath
171
172 - def cp_all(self, use_cache=1):
173 + def cp_all(self, use_cache=1, sort=False):
174 mylist = self.cpv_all(use_cache=use_cache)
175 d={}
176 for y in mylist:
177 @@ -506,7 +506,7 @@ class vardbapi(dbapi):
178 self.invalidentry(self.getpath(y))
179 continue
180 d[mysplit[0]+"/"+mysplit[1]] = None
181 - return list(d)
182 + return sorted(d) if sort else list(d)
183
184 def checkblockers(self, origdep):
185 pass
186 diff --git a/pym/portage/dbapi/virtual.py b/pym/portage/dbapi/virtual.py
187 index 3b7d10e..a59c3b5 100644
188 --- a/pym/portage/dbapi/virtual.py
189 +++ b/pym/portage/dbapi/virtual.py
190 @@ -115,8 +115,8 @@ class fakedbapi(dbapi):
191 self._match_cache[cache_key] = cpv_list
192 return cpv_list[:]
193
194 - def cp_all(self):
195 - return list(self.cpdict)
196 + def cp_all(self, sort=False):
197 + return sorted(self.cpdict) if sort else list(self.cpdict)
198
199 def cpv_all(self):
200 if self._multi_instance:
201 --
202 2.4.6

Replies