summaryrefslogtreecommitdiffstats
path: root/pym/portage/sets/__init__.py
blob: e0be0047c975722ef4ae5a7e02bc0ab790efdfb8 (plain)
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 2007 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