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"] |