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 |