aboutsummaryrefslogtreecommitdiff
blob: 768f29676ea342728bfca0de3fc2531e40fdbd3d (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
# R Overlay -- <comment TODO>
# Copyright 2006-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

import threading
import os.path

from roverlay.overlay.package import PackageDir

import roverlay.util

class Category ( object ):

	def __init__ ( self, name, logger, directory ):
		"""Initializes a overlay/portage category (such as 'app-text', 'sci-R').

		arguments:
		* name      -- name of the category
		* logger    -- parent logger
		* directory -- filesystem location
		"""
		self.logger            = logger.getChild ( name )
		self.name              = name
		self._lock             = threading.RLock()
		self._subdirs          = dict()
		self.physical_location = directory
	# --- end of __init__ (...) ---

	def empty ( self ):
		"""Returns True if this category contains 0 ebuilds."""
		return \
			len ( self._subdirs ) == 0 or \
			not False in ( d.empty() for d in self._subdirs )
	# --- end of empty (...) ---

	def add ( self, package_info ):
		"""Adds a package to this category.

		arguments:
		* package_info --

		returns: None (implicit)
		"""
		# TODO make keys available
		pkg_name = package_info ['name']

		if not pkg_name in self._content:
			self._lock.acquire()
			if not pkg_name in self._content:
				self._content [pkg_name] = PackageDir (
					pkg_name,
					self.logger,
					None if self.physical_location is None else \
						os.path.join ( self.physical_location, pkg_name )
				)
			self._lock.release()

		self._content [pkg_name].add ( package_info )
	# --- end of add (...) ---

	def generate_metadata ( self, **metadata_kw ):
		"""Generates metadata for all packages in this category.
		Metadata are automatically generated when calling write().

		arguments:
		* **metadata_kw -- see PackageDir.generate_metadata(...)

		returns: None (implicit)
		"""
		for package in self._subdirs.values():
			package.generate_metadata ( **metadata_kw )
	# --- end of generate_metadata (...) ---

	def generate_manifest ( self, **manifest_kw ):
		"""Generates Manifest files for all packages in this category.
		Manifest files are automatically created when calling write().

		arguments:
		* **manifest_kw -- see PackageDir.generate_manifest(...)

		returns: None (implicit)
		"""
		for package in self._subdirs.values():
			package.generate_manifest ( **manifest_kw )
	# --- end of generate_manifest (...) ---

	def show ( self, **show_kw ):
		"""Prints this category (its ebuild and metadata files).

		returns: None (implicit)
		"""
		for package in self._subdirs.values():
			package.show ( **show_kw )
	# --- end of show (...) ---

	def write ( self, **write_kw ):
		"""Writes this category to its filesystem location.

		returns: None (implicit)
		"""
		for package in self._subdirs.values():
			if package.physical_location and not package.empty():
				roverlay.util.dodir ( package.physical_location )
				package.write ( **write_kw )
	# --- end of write (...) ---