Gentoo Archives: gentoo-commits

From: "Tomas Chvatal (scarabeus)" <scarabeus@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoolkit r870 - trunk/gentoolkit/pym/gentoolkit/eshowkw
Date: Sat, 27 Nov 2010 21:26:50
Message-Id: 20101127212643.3B92F20051@flycatcher.gentoo.org
1 Author: scarabeus
2 Date: 2010-11-27 21:26:42 +0000 (Sat, 27 Nov 2010)
3 New Revision: 870
4
5 Modified:
6 trunk/gentoolkit/pym/gentoolkit/eshowkw/keywords_content.py
7 Log:
8 Properly get versions for all packages in all repositories so versions from different repos does not shadow each other
9
10 Modified: trunk/gentoolkit/pym/gentoolkit/eshowkw/keywords_content.py
11 ===================================================================
12 --- trunk/gentoolkit/pym/gentoolkit/eshowkw/keywords_content.py 2010-11-24 18:28:10 UTC (rev 869)
13 +++ trunk/gentoolkit/pym/gentoolkit/eshowkw/keywords_content.py 2010-11-27 21:26:42 UTC (rev 870)
14 @@ -3,6 +3,7 @@
15 # Distributed under the terms of the GNU General Public License v2
16
17 import portage as port
18 +import os
19 from portage.output import colorize
20
21 __all__ = ['keywords_content']
22 @@ -140,10 +141,29 @@
23 """Query all relevant data for version data formatting"""
24 self.versions = self.__getVersions(packages)
25
26 - def __checkExist(self, pdb, package):
27 - """Check if specified package even exists."""
28 + def __cpv_sort_ascending(self, cpv_list):
29 + """
30 + Use this to sort self.cp_list() results in ascending
31 + order. It sorts in place and returns None.
32 + """
33 + if len(cpv_list) > 1:
34 + # If the cpv includes explicit -r0, it has to be preserved
35 + # for consistency in findname and aux_get calls, so use a
36 + # dict to map strings back to their original values.
37 + ver_map = {}
38 + for cpv in cpv_list:
39 + cpv = cpv.split('%')[0]
40 + ver_map[cpv] = '-'.join(port.versions.catpkgsplit(cpv)[2:])
41 + def cmp_cpv(cpv1, cpv2):
42 + cpv1 = cpv1.split('%')[0]
43 + cpv2 = cpv2.split('%')[0]
44 + return port.versions.vercmp(ver_map[cpv1], ver_map[cpv2])
45 + cpv_list.sort(key=port.util.cmp_sort_key(cmp_cpv))
46 +
47 + def __xmatch(self, pdb, package):
48 + """xmatch function that searches for all packages over all repos"""
49 try:
50 - matches = pdb.xmatch('match-all', package)
51 + mycp = port.dep_expand(package, mydb=pdb, settings=pdb.settings).cp
52 except port.exception.AmbiguousPackageName as Arg:
53 msg_err = 'Ambiguous package name "%s".\n' % package
54 found = 'Possibilities: %s' % Arg
55 @@ -151,15 +171,45 @@
56 except port.exception.InvalidAtom:
57 msg_err = 'No such package "%s"' % package
58 raise SystemExit(msg_err)
59 +
60 + mysplit = mycp.split('/')
61 + d={}
62 + for oroot in pdb.porttrees:
63 + try:
64 + file_list = os.listdir(os.path.join(oroot, mycp))
65 + except OSError:
66 + continue
67 + for x in file_list:
68 + pf = x[:-7] if x[-7:] == '.ebuild' else []
69 + if pf:
70 + ps = port.pkgsplit(pf)
71 + if not ps or ps[0] != mysplit[1]:
72 + # we got garbage or ebuild with wrong name in the dir
73 + continue
74 + ver_match = port.versions.ver_regexp.match("-".join(ps[1:]))
75 + if ver_match is None or not ver_match.groups():
76 + # version is not allowed by portage or unset
77 + continue
78 + d[mysplit[0]+'/'+pf+'%'+oroot] = None
79 +
80 + mylist = list(d)
81 + self.__cpv_sort_ascending(mylist)
82 + return mylist
83 +
84 + def __checkExist(self, pdb, package):
85 + """Check if specified package even exists."""
86 + matches = self.__xmatch(pdb, package)
87 if len(matches) <= 0:
88 msg_err = 'No such package "%s"' % package
89 raise SystemExit(msg_err)
90 - return matches
91 + content = [x.split('%') for x in matches]
92 + return list(zip(*content))
93
94 - def __getMetadata(self, pdb, packages):
95 - """Obtain all KEYWORDS and SLOT from metadata"""
96 + def __getMetadata(self, pdb, packages, repos):
97 + """Obtain all required metadata from portage auxdb"""
98 try:
99 - metadata = map(lambda x: pdb.aux_get(x, ['KEYWORDS', 'SLOT', 'repository']), packages)
100 + metadata = [pdb.aux_get(pkg, ['KEYWORDS', 'SLOT'], tree)
101 + for pkg, tree in zip(packages, repos)]
102 except KeyError:
103 # portage prints out more verbose error for us if we were lucky
104 raise SystemExit('Failed to obtain metadata')
105 @@ -249,8 +299,10 @@
106
107 def __init__(self, package, keywords_list, porttree, ignoreslots = False, content_align = 'bottom', usebold = False, toplist = 'archlist'):
108 """Query all relevant data from portage databases."""
109 - packages = self.__checkExist(porttree, package)
110 - self.keywords, self.slots, self.repositories = self.__getMetadata(porttree, packages)
111 + packages, self.repositories = self.__checkExist(porttree, package)
112 + self.keywords, self.slots = self.__getMetadata(porttree, packages, self.repositories)
113 + # convert repositories from path to name
114 + self.repositories = [porttree.getRepositoryName(x) for x in self.repositories]
115 self.slot_length = max([len(x) for x in self.slots])
116 repositories_length = max([len(x) for x in self.repositories])
117 self.keyword_length = len(keywords_list)