Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r11317 - in main/trunk: doc/config pym/portage/sets
Date: Sat, 02 Aug 2008 01:27:56
Message-Id: E1KP5uT-0004bL-MA@stork.gentoo.org
1 Author: zmedico
2 Date: 2008-08-02 01:27:52 +0000 (Sat, 02 Aug 2008)
3 New Revision: 11317
4
5 Modified:
6 main/trunk/doc/config/sets.docbook
7 main/trunk/pym/portage/sets/dbapi.py
8 Log:
9 Add a new RestrictSet which contains all packages that match specified
10 RESTRICT values. This could be useful for implementing something like
11 a @live-rebuild based on RESTRICT metadata, as suggested in bug #233589.
12
13
14 Modified: main/trunk/doc/config/sets.docbook
15 ===================================================================
16 --- main/trunk/doc/config/sets.docbook 2008-08-02 00:32:51 UTC (rev 11316)
17 +++ main/trunk/doc/config/sets.docbook 2008-08-02 01:27:52 UTC (rev 11317)
18 @@ -479,6 +479,24 @@
19 </itemizedlist>
20 </para>
21 </sect2>
22 + <sect2 id='config-set-classes-RestrictSet'>
23 + <title>portage.sets.dbapi.RestrictSet</title>
24 + <para>
25 + Package set which contains all packages
26 + that match specified RESTRICT values.
27 + This class supports the following options:
28 + <itemizedlist>
29 + <listitem><varname>includes</varname>: A list of
30 + values that must be contained within the RESTRICT
31 + metadata.
32 + </listitem>
33 + <listitem><varname>excludes</varname>: A list of
34 + values that must not be contained within the RESTRICT
35 + metadata.
36 + </listitem>
37 + </itemizedlist>
38 + </para>
39 + </sect2>
40 <sect2 id='config-set-classes-DowngradeSet'>
41 <title>portage.sets.dbapi.DowngradeSet</title>
42 <para>
43
44 Modified: main/trunk/pym/portage/sets/dbapi.py
45 ===================================================================
46 --- main/trunk/pym/portage/sets/dbapi.py 2008-08-02 00:32:51 UTC (rev 11316)
47 +++ main/trunk/pym/portage/sets/dbapi.py 2008-08-02 01:27:52 UTC (rev 11317)
48 @@ -3,30 +3,50 @@
49 # $Id$
50
51 from portage.versions import catpkgsplit, catsplit, pkgcmp
52 +from portage.dep import Atom
53 from portage.sets.base import PackageSet
54 from portage.sets import SetConfigError, get_boolean
55
56 __all__ = ["CategorySet", "DowngradeSet",
57 - "EverythingSet", "InheritSet", "OwnerSet"]
58 + "EverythingSet", "InheritSet", "OwnerSet", "RestrictSet"]
59
60 class EverythingSet(PackageSet):
61 _operations = ["merge", "unmerge"]
62 description = "Package set which contains SLOT " + \
63 "atoms to match all installed packages"
64 + _filter = None
65
66 def __init__(self, vdbapi):
67 super(EverythingSet, self).__init__()
68 self._db = vdbapi
69 -
70 +
71 def load(self):
72 myatoms = []
73 + db_keys = ["SLOT"]
74 + aux_get = self._db.aux_get
75 + cp_list = self._db.cp_list
76 +
77 for cp in self._db.cp_all():
78 - if len(self._db.cp_list(cp)) > 1:
79 - for cpv in self._db.cp_list(cp):
80 - myslot = self._db.aux_get(cpv, ["SLOT"])[0]
81 - myatoms.append(cp+":"+myslot)
82 + cpv_list = cp_list(cp)
83 +
84 + if len(cpv_list) > 1:
85 + for cpv in cpv_list:
86 + slot, = aux_get(cpv, db_keys)
87 + atom = Atom("%s:%s" % (cp, slot))
88 + if self._filter:
89 + if self._filter(atom):
90 + myatoms.append(atom)
91 + else:
92 + myatoms.append(atom)
93 +
94 else:
95 - myatoms.append(cp)
96 + atom = Atom(cp)
97 + if self._filter:
98 + if self._filter(atom):
99 + myatoms.append(atom)
100 + else:
101 + myatoms.append(atom)
102 +
103 self._setAtoms(myatoms)
104
105 def singleBuilder(self, options, settings, trees):
106 @@ -116,6 +136,46 @@
107
108 singleBuilder = classmethod(singleBuilder)
109
110 +class RestrictSet(EverythingSet):
111 +
112 + _operations = ["merge", "unmerge"]
113 +
114 + description = "Package set which contains all packages " + \
115 + "that match specified RESTRICT values."
116 +
117 + def __init__(self, vardb, portdb=None, includes=None, excludes=None):
118 + super(RestrictSet, self).__init__(vardb)
119 + self._portdb = portdb
120 + self._includes = includes
121 + self._excludes = excludes
122 +
123 + def _filter(self, atom):
124 + ebuild = self._portdb.xmatch("bestmatch-visible", atom)
125 + if not ebuild:
126 + return False
127 + restrict, = self._portdb.aux_get(ebuild, ["RESTRICT"])
128 + restrict = restrict.split()
129 + if self._includes and not self._includes.intersection(restrict):
130 + return False
131 + if self._excludes and self._excludes.intersection(restrict):
132 + return False
133 + return True
134 +
135 + def singleBuilder(cls, options, settings, trees):
136 +
137 + includes = options.get("includes", "")
138 + excludes = options.get("excludes", "")
139 +
140 + if not (includes or excludes):
141 + raise SetConfigError("no includes or excludes given")
142 +
143 + return cls(trees["vartree"].dbapi,
144 + portdb=trees["porttree"].dbapi,
145 + excludes=frozenset(excludes.split()),
146 + includes=frozenset(includes.split()))
147 +
148 + singleBuilder = classmethod(singleBuilder)
149 +
150 class DowngradeSet(PackageSet):
151
152 _operations = ["merge", "unmerge"]