aboutsummaryrefslogtreecommitdiff
blob: d202d783d7e556e4ee7c7076224f6705bf4148b2 (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
121
122
123
124
125
126
# R Overlay -- ebuild creation, <?>
# Copyright 2006-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

import logging

from roverlay.ebuild import depres, ebuilder, evars

#from roverlay.ebuild.construction        import EbuildConstruction
from roverlay.rpackage.descriptionreader import DescriptionReader


LOGGER = logging.getLogger ( 'EbuildCreation' )


class EbuildCreation ( object ):

	def __init__ ( self, package_info ):

		self.package_info = package_info

		self.logger = LOGGER.getChild ( package_info ['name'] )

		# > 0 busy/working; 0 == done,success; < 0 done,fail
		self.status = 1

		self.package_info.set_readonly()
	# --- end of __init__ (...) ---

	def done    ( self ) : return self.status  < 1
	def busy    ( self ) : return self.status  > 0
	def success ( self ) : return self.status == 0
	def fail    ( self ) : return self.status  < 0

	def run ( self ):
		if self.status < 1:
			raise Exception ( "Cannot run again." )

		try:
			self._lazyimport_desc_data()

			self.package_info.set_readonly()

			if self._make_ebuild():
				self.logger.debug ( "Ebuild is ready." )
				self.status = 0
			else:
				self.logger.info ( "Cannot create an ebuild for this package." )
				self.status = -1

		except Exception as e:
			# log this and set status to fail
			self.status = -10
			self.logger.exception ( e )
	# --- end of run (...) ---

	def _lazyimport_desc_data ( self ):
		if self.package_info.get ( 'desc_data',
			fallback_value=None, do_fallback=True ) is None:

			logging.warning ( 'Reading description data now.' )
			reader = DescriptionReader (
				self.package_info,
				logger=self.logger,
				read_now=True
			)
			self.package_info.set_writeable()
			self.package_info.update (
				desc_data=reader.get_desc ( run_if_unset=False )
			)
			del reader

	# --- end of _lazyimport_desc_data (...) ---


	def _make_ebuild ( self ):
		desc = self.package_info ['desc_data']
		if desc is None:
			self.logger (
				'desc empty- cannot create an ebuild for this package.'
			)
			return False

		ebuild = ebuilder.Ebuilder()

		_dep_resolution = depres.EbuildDepRes (
			self.package_info, self.logger,
			create_iuse=True, run_now=True
		)

		if not _dep_resolution.success():
			# log here?
			return False


		dep_result = _dep_resolution.get_result()

		# add *DEPEND, IUSE to the ebuild
		ebuild.use ( *dep_result [1] )

		description = None

		if 'Title' in desc:
			description = desc ['Title']

		if 'Description' in desc:
			if description is None:
				description = desc ['Description']
			else:
				description += '// ' + desc ['Description']

		if description is not None:
			ebuild.use ( evars.DESCRIPTION ( description ) )

		ebuild.use ( evars.SRC_URI ( self.package_info ['SRC_URI'] ) )

		ebuild_text = ebuild.to_str()

		self.package_info.update_now (
			ebuild=ebuild_text,
			depres_result=dep_result
		)

		return True