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 v2] search._xmatch: handle aux_get KeyError (525718)
Date: Thu, 11 Dec 2014 08:34:17
Message-Id: 1418286821-18908-1-git-send-email-zmedico@gentoo.org
In Reply to: [gentoo-portage-dev] [PATCH] search._xmatch: handle aux_get KeyError (525718) by Zac Medico
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

Replies