Gentoo Archives: gentoo-commits

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