1 |
Author: zmedico |
2 |
Date: 2009-04-30 06:59:53 +0000 (Thu, 30 Apr 2009) |
3 |
New Revision: 13468 |
4 |
|
5 |
Modified: |
6 |
main/branches/2.1.6/pym/_emerge/__init__.py |
7 |
Log: |
8 |
Make emerge --info <atom> display USE similarly to how they are displayed |
9 |
in the merge list. (trunk r13297) |
10 |
|
11 |
Modified: main/branches/2.1.6/pym/_emerge/__init__.py |
12 |
=================================================================== |
13 |
--- main/branches/2.1.6/pym/_emerge/__init__.py 2009-04-30 06:59:41 UTC (rev 13467) |
14 |
+++ main/branches/2.1.6/pym/_emerge/__init__.py 2009-04-30 06:59:53 UTC (rev 13468) |
15 |
@@ -9216,6 +9216,43 @@ |
16 |
(self.blocks - self.blocks_satisfied)) |
17 |
return "".join(myoutput) |
18 |
|
19 |
+class UseFlagDisplay(object): |
20 |
+ |
21 |
+ __slots__ = ('name', 'enabled', 'forced') |
22 |
+ |
23 |
+ def __init__(self, name, enabled, forced): |
24 |
+ self.name = name |
25 |
+ self.enabled = enabled |
26 |
+ self.forced = forced |
27 |
+ |
28 |
+ def __str__(self): |
29 |
+ s = self.name |
30 |
+ if self.enabled: |
31 |
+ s = red(s) |
32 |
+ else: |
33 |
+ s = '-' + s |
34 |
+ s = blue(s) |
35 |
+ if self.forced: |
36 |
+ s = '(%s)' % s |
37 |
+ return s |
38 |
+ |
39 |
+ @classmethod |
40 |
+ def cmp_combined(cls, a, b): |
41 |
+ """ |
42 |
+ Sort by name, combining enabled and disabled flags. |
43 |
+ """ |
44 |
+ return (a.name > b.name) - (a.name < b.name) |
45 |
+ |
46 |
+ @classmethod |
47 |
+ def cmp_separated(cls, a, b): |
48 |
+ """ |
49 |
+ Sort by name, separating enabled flags from disabled flags. |
50 |
+ """ |
51 |
+ enabled_diff = b.enabled - a.enabled |
52 |
+ if enabled_diff: |
53 |
+ return enabled_diff |
54 |
+ return (a.name > b.name) - (a.name < b.name) |
55 |
+ |
56 |
class PollSelectAdapter(PollConstants): |
57 |
|
58 |
""" |
59 |
@@ -13332,6 +13369,12 @@ |
60 |
myvars.extend(portage.util.grabfile(settings["PORTDIR"]+"/profiles/info_vars")) |
61 |
|
62 |
myvars = portage.util.unique_array(myvars) |
63 |
+ use_expand = settings.get('USE_EXPAND', '').split() |
64 |
+ use_expand.sort() |
65 |
+ use_expand_hidden = set( |
66 |
+ settings.get('USE_EXPAND_HIDDEN', '').upper().split()) |
67 |
+ alphabetical_use = '--alphabetical' in myopts |
68 |
+ root_config = trees[settings["ROOT"]]['root_config'] |
69 |
unset_vars = [] |
70 |
myvars.sort() |
71 |
for x in myvars: |
72 |
@@ -13340,8 +13383,6 @@ |
73 |
print '%s="%s"' % (x, settings[x]) |
74 |
else: |
75 |
use = set(settings["USE"].split()) |
76 |
- use_expand = settings["USE_EXPAND"].split() |
77 |
- use_expand.sort() |
78 |
for varname in use_expand: |
79 |
flag_prefix = varname.lower() + "_" |
80 |
for f in list(use): |
81 |
@@ -13380,7 +13421,7 @@ |
82 |
# Get our global settings (we only print stuff if it varies from |
83 |
# the current config) |
84 |
mydesiredvars = [ 'CHOST', 'CFLAGS', 'CXXFLAGS', 'LDFLAGS' ] |
85 |
- auxkeys = mydesiredvars + [ "USE", "IUSE"] |
86 |
+ auxkeys = mydesiredvars + list(vardb._aux_cache_keys) |
87 |
global_vals = {} |
88 |
pkgsettings = portage.config(clone=settings) |
89 |
|
90 |
@@ -13395,12 +13436,17 @@ |
91 |
print header_width * "=" |
92 |
from portage.output import EOutput |
93 |
out = EOutput() |
94 |
- for pkg in mypkgs: |
95 |
+ for cpv in mypkgs: |
96 |
# Get all package specific variables |
97 |
- auxvalues = vardb.aux_get(pkg, auxkeys) |
98 |
+ metadata = dict(izip(auxkeys, vardb.aux_get(cpv, auxkeys))) |
99 |
+ pkg = Package(built=True, cpv=cpv, |
100 |
+ installed=True, metadata=izip(Package.metadata_keys, |
101 |
+ (metadata.get(x, '') for x in Package.metadata_keys)), |
102 |
+ root_config=root_config, type_name='installed') |
103 |
valuesmap = {} |
104 |
- for i in xrange(len(auxkeys)): |
105 |
- valuesmap[auxkeys[i]] = set(auxvalues[i].split()) |
106 |
+ for k in auxkeys: |
107 |
+ valuesmap[k] = set(metadata[k].split()) |
108 |
+ |
109 |
diff_values = {} |
110 |
for myvar in mydesiredvars: |
111 |
# If the package variable doesn't match the |
112 |
@@ -13408,34 +13454,73 @@ |
113 |
# so set diff_found so we know to print |
114 |
if valuesmap[myvar] != global_vals[myvar]: |
115 |
diff_values[myvar] = valuesmap[myvar] |
116 |
- valuesmap["IUSE"] = set(filter_iuse_defaults(valuesmap["IUSE"])) |
117 |
- valuesmap["USE"] = valuesmap["USE"].intersection(valuesmap["IUSE"]) |
118 |
- pkgsettings.reset() |
119 |
- # If a matching ebuild is no longer available in the tree, maybe it |
120 |
- # would make sense to compare against the flags for the best |
121 |
- # available version with the same slot? |
122 |
- mydb = None |
123 |
- if portdb.cpv_exists(pkg): |
124 |
- mydb = portdb |
125 |
- pkgsettings.setcpv(pkg, mydb=mydb) |
126 |
- if valuesmap["IUSE"].intersection( |
127 |
- pkgsettings["PORTAGE_USE"].split()) != valuesmap["USE"]: |
128 |
- diff_values["USE"] = valuesmap["USE"] |
129 |
+ |
130 |
# If a difference was found, print the info for |
131 |
# this package. |
132 |
if diff_values: |
133 |
# Print package info |
134 |
- print "%s was built with the following:" % pkg |
135 |
- for myvar in mydesiredvars + ["USE"]: |
136 |
+ print "%s was built with the following:" % pkg.cpv |
137 |
+ for myvar in mydesiredvars: |
138 |
if myvar in diff_values: |
139 |
mylist = list(diff_values[myvar]) |
140 |
mylist.sort() |
141 |
print "%s=\"%s\"" % (myvar, " ".join(mylist)) |
142 |
- print |
143 |
- print ">>> Attempting to run pkg_info() for '%s'" % pkg |
144 |
- ebuildpath = vardb.findname(pkg) |
145 |
+ |
146 |
+ pkgsettings.setcpv(pkg) |
147 |
+ forced_flags = set(chain(pkgsettings.useforce, |
148 |
+ pkgsettings.usemask)) |
149 |
+ use = set(pkg.use.enabled) |
150 |
+ use.discard(pkgsettings.get('ARCH')) |
151 |
+ use_expand_flags = set() |
152 |
+ use_enabled = {} |
153 |
+ use_disabled = {} |
154 |
+ for varname in use_expand: |
155 |
+ flag_prefix = varname.lower() + "_" |
156 |
+ for f in use: |
157 |
+ if f.startswith(flag_prefix): |
158 |
+ use_expand_flags.add(f) |
159 |
+ use_enabled.setdefault( |
160 |
+ varname.upper(), []).append(f[len(flag_prefix):]) |
161 |
+ |
162 |
+ for f in pkg.iuse.all: |
163 |
+ if f.startswith(flag_prefix): |
164 |
+ use_expand_flags.add(f) |
165 |
+ if f not in use: |
166 |
+ use_disabled.setdefault( |
167 |
+ varname.upper(), []).append(f[len(flag_prefix):]) |
168 |
+ |
169 |
+ var_order = set(use_enabled) |
170 |
+ var_order.update(use_disabled) |
171 |
+ var_order = sorted(var_order) |
172 |
+ var_order.insert(0, 'USE') |
173 |
+ use.difference_update(use_expand_flags) |
174 |
+ use_enabled['USE'] = list(use) |
175 |
+ use_disabled['USE'] = [] |
176 |
+ |
177 |
+ for f in pkg.iuse.all: |
178 |
+ if f not in use and \ |
179 |
+ f not in use_expand_flags: |
180 |
+ use_disabled['USE'].append(f) |
181 |
+ |
182 |
+ for varname in var_order: |
183 |
+ if varname in use_expand_hidden: |
184 |
+ continue |
185 |
+ flags = [] |
186 |
+ for f in use_enabled.get(varname, []): |
187 |
+ flags.append(UseFlagDisplay(f, True, f in forced_flags)) |
188 |
+ for f in use_disabled.get(varname, []): |
189 |
+ flags.append(UseFlagDisplay(f, False, f in forced_flags)) |
190 |
+ if alphabetical_use: |
191 |
+ flags.sort(key=cmp_sort_key(UseFlagDisplay.cmp_combined)) |
192 |
+ else: |
193 |
+ flags.sort(key=cmp_sort_key(UseFlagDisplay.cmp_separated)) |
194 |
+ print '%s="%s"' % (varname, ' '.join(str(f) for f in flags)), |
195 |
+ print |
196 |
+ |
197 |
+ print ">>> Attempting to run pkg_info() for '%s'" % pkg.cpv |
198 |
+ ebuildpath = vardb.findname(pkg.cpv) |
199 |
if not ebuildpath or not os.path.exists(ebuildpath): |
200 |
- out.ewarn("No ebuild found for '%s'" % pkg) |
201 |
+ out.ewarn("No ebuild found for '%s'" % pkg.cpv) |
202 |
continue |
203 |
portage.doebuild(ebuildpath, "info", pkgsettings["ROOT"], |
204 |
pkgsettings, debug=(settings.get("PORTAGE_DEBUG", "") == 1), |