1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
# Copyright 2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
import os
from portage.const import PRIVATE_PATH, USER_CONFIG_PATH
from portage.exception import InvalidAtom
from portage.dep import isvalidatom
OPERATIONS = ["merge", "unmerge", "edit"]
DEFAULT_SETS = ["world", "system", "everything", "security"] \
+["package_"+x for x in ["mask", "unmask", "use", "keywords"]]
class PackageSet(object):
_operations = ["merge"]
def __init__(self, name):
self._name = name
self._nodes = []
self._loaded = False
def supportsOperation(self, op):
if not op in OPERATIONS:
raise ValueError(op)
return op in self._operations
def getNodes(self):
if not self._loaded:
self.load()
self._loaded = True
return self._nodes
def _setNodes(self, nodes):
nodes = map(str.strip, nodes)
for n in nodes[:]:
if n == "":
nodes.remove(n)
elif not isvalidatom(n):
raise InvalidAtom(n)
self._nodes = nodes
def getName(self):
return self._name
def addNode(self, node):
if self.supportsOperation("edit"):
self.load()
self._nodes.append(node)
self.write()
else:
raise NotImplementedError()
def removeNode(self, node):
if self.supportsOperation("edit"):
self.load()
self._nodes.remove(node)
self.write()
else:
raise NotImplementedError()
def write(self):
raise NotImplementedError()
def load(self):
raise NotImplementedError()
class EmptyPackageSet(PackageSet):
_operations = ["merge", "unmerge"]
def make_default_sets(configroot, root, profile_paths, settings=None,
vdbapi=None, portdbapi=None):
from portage.sets.files import StaticFileSet, ConfigFileSet
from portage.sets.profiles import PackagesSystemSet
from portage.sets.security import AffectedSet
from portage.sets.dbapi import EverythingSet
rValue = set()
rValue.add(StaticFileSet("world", os.path.join(root, PRIVATE_PATH, "world")))
for suffix in ["mask", "unmask", "keywords", "use"]:
myname = "package_"+suffix
myset = ConfigFileSet(myname, os.path.join(configroot, USER_CONFIG_PATH.lstrip(os.sep), "package."+suffix))
rValue.add(myset)
rValue.add(PackagesSystemSet("system", profile_paths))
if settings != None and portdbapi != None:
rValue.add(AffectedSet("security", settings, vdbapi, portdbapi))
else:
rValue.add(EmptyPackageSet("security"))
if vdbapi != None:
rValue.add(EverythingSet("everything", vdbapi))
else:
rValue.add(EmptyPackageSet("everything"))
return rValue
def make_extra_static_sets(configroot):
from portage.sets.files import StaticFileSet
rValue = set()
mydir = os.path.join(configroot, USER_CONFIG_PATH.lstrip(os.sep), "sets")
try:
mysets = os.listdir(mydir)
except (OSError, IOError):
return rValue
for myname in mysets:
if myname in DEFAULT_SETS:
continue
rValue.add(StaticFileSet(fname, os.path.join(mydir, myname)))
return rValue
# adhoc test code
if __name__ == "__main__":
import portage
l = make_default_sets("/", "/", portage.settings.profiles, portage.settings, portage.db["/"]["vartree"].dbapi, portage.db["/"]["porttree"].dbapi)
l.update(make_extra_static_sets("/"))
for x in l:
print x.getName()+":"
for n in sorted(x.getNodes()):
print "- "+n
print
|