1 |
Since commit 55c8c8bc7a781e3f71ce92922eea64ad4cafce3c, emerge --search |
2 |
can raise an unhandled KeyError if a pkg_desc_index contains a stale |
3 |
package. Handle it with the same error message used for other aux_get |
4 |
failures. |
5 |
|
6 |
Fixes: 55c8c8bc7a78 ("Add emerge --search-index option.") |
7 |
X-Gentoo-Bug: 525718 |
8 |
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=525718 |
9 |
--- |
10 |
PATCH v2 splits out a _aux_get_error method to unify the error output |
11 |
formatting. |
12 |
|
13 |
pym/_emerge/search.py | 29 +++++++++++++++++++++-------- |
14 |
1 file changed, 21 insertions(+), 8 deletions(-) |
15 |
|
16 |
diff --git a/pym/_emerge/search.py b/pym/_emerge/search.py |
17 |
index 90dbcec..e7f6f44 100644 |
18 |
--- a/pym/_emerge/search.py |
19 |
+++ b/pym/_emerge/search.py |
20 |
@@ -1,6 +1,8 @@ |
21 |
# Copyright 1999-2014 Gentoo Foundation |
22 |
# Distributed under the terms of the GNU General Public License v2 |
23 |
|
24 |
+from __future__ import unicode_literals |
25 |
+ |
26 |
import re |
27 |
import portage |
28 |
from portage import os |
29 |
@@ -86,6 +88,11 @@ class search(object): |
30 |
pass |
31 |
raise KeyError(args[0]) |
32 |
|
33 |
+ def _aux_get_error(self, cpv): |
34 |
+ portage.writemsg("emerge: search: " |
35 |
+ "aux_get('%s') failed, skipping\n" % cpv, |
36 |
+ noiselevel=-1) |
37 |
+ |
38 |
def _findname(self, *args, **kwargs): |
39 |
for db in self._dbs: |
40 |
if db is not self._portdb: |
41 |
@@ -166,8 +173,12 @@ class search(object): |
42 |
else: |
43 |
db_keys = list(db._aux_cache_keys) |
44 |
for cpv in db.match(atom): |
45 |
- metadata = zip(db_keys, |
46 |
- db.aux_get(cpv, db_keys)) |
47 |
+ try: |
48 |
+ metadata = zip(db_keys, |
49 |
+ db.aux_get(cpv, db_keys)) |
50 |
+ except KeyError: |
51 |
+ self._aux_get_error(cpv) |
52 |
+ continue |
53 |
if not self._visible(db, cpv, metadata): |
54 |
continue |
55 |
matches.add(cpv) |
56 |
@@ -197,8 +208,12 @@ class search(object): |
57 |
for cpv in reversed(matches): |
58 |
if portage.cpv_getkey(cpv) != cp: |
59 |
continue |
60 |
- metadata = zip(db_keys, |
61 |
- db.aux_get(cpv, db_keys)) |
62 |
+ try: |
63 |
+ metadata = zip(db_keys, |
64 |
+ db.aux_get(cpv, db_keys)) |
65 |
+ except KeyError: |
66 |
+ self._aux_get_error(cpv) |
67 |
+ continue |
68 |
if not self._visible(db, cpv, metadata): |
69 |
continue |
70 |
if not result or cpv == portage.best([cpv, result]): |
71 |
@@ -257,9 +272,7 @@ class search(object): |
72 |
full_desc = self._aux_get( |
73 |
full_package, ["DESCRIPTION"])[0] |
74 |
except KeyError: |
75 |
- portage.writemsg( |
76 |
- "emerge: search: aux_get() failed, skipping\n", |
77 |
- noiselevel=-1) |
78 |
+ self._aux_get_error(full_package) |
79 |
continue |
80 |
if not self.searchre.search(full_desc): |
81 |
continue |
82 |
@@ -337,7 +350,7 @@ class search(object): |
83 |
metadata = dict(zip(metadata_keys, |
84 |
self._aux_get(full_package, metadata_keys))) |
85 |
except KeyError: |
86 |
- msg.append("emerge: search: aux_get() failed, skipping\n") |
87 |
+ self._aux_get_error(full_package) |
88 |
continue |
89 |
|
90 |
desc = metadata["DESCRIPTION"] |
91 |
-- |
92 |
2.0.4 |