summaryrefslogtreecommitdiffstats
path: root/lib/bb/event.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/bb/event.py')
-rw-r--r--lib/bb/event.py204
1 files changed, 204 insertions, 0 deletions
diff --git a/lib/bb/event.py b/lib/bb/event.py
new file mode 100644
index 000000000..dd86e2f44
--- /dev/null
+++ b/lib/bb/event.py
@@ -0,0 +1,204 @@
+#!/usr/bin/env python
+# ex:ts=4:sw=4:sts=4:et
+# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
+"""
+BitBake 'Event' implementation
+
+Classes and functions for manipulating 'events' in the
+BitBake build tools.
+
+Copyright (C) 2003, 2004 Chris Larson
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation; either version 2 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+Place, Suite 330, Boston, MA 02111-1307 USA.
+"""
+
+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 bbmake 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):
+ """bbmake build run started"""
+
+
+class BuildCompleted(BuildBase):
+ """bbmake build run completed"""
+
+
+class UnsatisfiedDep(DepBase):
+ """Unsatisfied Dependency"""
+
+
+class RecursiveDep(DepBase):
+ """Recursive Dependency"""
+
+
+class MultipleProviders(PkgBase):
+ """Multiple Providers"""
+