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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
|
#!/usr/bin/env python
# ex:ts=4:sw=4:sts=4:et
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
"""
OpenEmbedded 'Event' implementation
Classes and functions for manipulating 'events' in the
OpenEmbedded (http://openembedded.org) build infrastructure.
Copyright: (c) 2003-2004 Chris Larson
"""
import os, re
class Event:
"""Base class for events"""
type = "Event"
NotHandled = 0
Handled = 1
handlers = []
def tmpHandler(event):
"""Default handler for code events"""
return NotHandled
def defaultTmpHandler():
tmp = "def tmpHandler(e):\n\t\"\"\"heh\"\"\"\n\treturn 0"
comp = compile(tmp, "tmpHandler(e)", "exec")
return comp
def fire(event):
"""Fire off an Event"""
for h in handlers:
if type(h).__name__ == "code":
exec(h)
if tmpHandler(event) == Handled:
return Handled
else:
if h(event) == Handled:
return Handled
return NotHandled
def register(handler):
"""Register an Event handler"""
if handler is not None:
# handle string containing python code
if type(handler).__name__ == "str":
return registerCode(handler)
# prevent duplicate registration
if not handler in handlers:
handlers.append(handler)
def registerCode(handlerStr):
"""Register a 'code' Event.
Deprecated interface; call register instead.
Expects to be passed python code as a string, which will
be passed in turn to compile() and then exec(). Note that
the code will be within a function, so should have had
appropriate tabbing put in place."""
tmp = "def tmpHandler(e):\n%s" % handlerStr
comp = compile(tmp, "tmpHandler(e)", "exec")
# prevent duplicate registration
if not comp in handlers:
handlers.append(comp)
def remove(handler):
"""Remove an Event handler"""
for h in handlers:
if type(handler).__name__ == "str":
return removeCode(handler)
if handler is h:
handlers.remove(handler)
def removeCode(handlerStr):
"""Remove a 'code' Event handler
Deprecated interface; call remove instead."""
tmp = "def tmpHandler(e):\n%s" % handlerStr
comp = compile(tmp, "tmpHandler(e)", "exec")
handlers.remove(comp)
def getName(e):
"""Returns the name of a class or class instance"""
if getattr(e, "__name__", None) == None:
return e.__class__.__name__
else:
return e.__name__
class PkgBase(Event):
"""Base class for package events"""
def __init__(self, t, d = {}):
self.pkg = t
self.data = d
def getPkg(self):
return self._pkg
def setPkg(self, pkg):
self._pkg = pkg
def getData(self):
return self._data
def setData(self, data):
self._data = data
pkg = property(getPkg, setPkg, None, "pkg property")
data = property(getData, setData, None, "data property")
class BuildBase(Event):
"""Base class for oemake run events"""
def __init__(self, n, p, c):
self.name = n
self.pkgs = p
self.cfg = c
def getPkgs(self):
return self._pkgs
def setPkgs(self, pkgs):
self._pkgs = pkgs
def getName(self):
return self._name
def setName(self, name):
self._name = name
def getCfg(self):
return self._cfg
def setCfg(self, cfg):
self._cfg = cfg
pkgs = property(getPkgs, setPkgs, None, "pkgs property")
name = property(getName, setName, None, "name property")
cfg = property(getCfg, setCfg, None, "cfg property")
class DepBase(PkgBase):
"""Base class for dependency events"""
def __init__(self, t, data, d):
self.dep = d
PkgBase.__init__(self, t, data)
def getDep(self):
return self._dep
def setDep(self, dep):
self._dep = dep
dep = property(getDep, setDep, None, "dep property")
class PkgStarted(PkgBase):
"""Package build started"""
class PkgFailed(PkgBase):
"""Package build failed"""
class PkgSucceeded(PkgBase):
"""Package build completed"""
class BuildStarted(BuildBase):
"""oemake build run started"""
class BuildCompleted(BuildBase):
"""oemake build run completed"""
class UnsatisfiedDep(DepBase):
"""Unsatisfied Dependency"""
class RecursiveDep(DepBase):
"""Recursive Dependency"""
class MultipleProviders(PkgBase):
"""Multiple Providers"""
|