summaryrefslogtreecommitdiff
path: root/classes/seppuku.bbclass
diff options
context:
space:
mode:
Diffstat (limited to 'classes/seppuku.bbclass')
-rw-r--r--classes/seppuku.bbclass119
1 files changed, 119 insertions, 0 deletions
diff --git a/classes/seppuku.bbclass b/classes/seppuku.bbclass
new file mode 100644
index 0000000000..b3e3fcb8c2
--- /dev/null
+++ b/classes/seppuku.bbclass
@@ -0,0 +1,119 @@
+#
+# Small event handler to automatically open URLs and file
+# bug reports at a bugzilla of your choiche
+#
+# This class requires python2.4 because of the urllib2 usage
+#
+
+
+def seppuku_login(opener, login, user, password):
+ """
+ We need to post to query.cgi with the parameters
+ Bugzilla_login and Bugzilla_password and will scan
+ the resulting page then
+
+ @param opened = cookie enabled urllib2 opener
+ @param login = http://bugzilla.openmoko.org/cgi-bin/bugzilla/query.cgi?
+ @param user = Your username
+ @param pass = Your password
+ """
+ import urllib
+ param = urllib.urlencode( {"GoAheadAndLogIn" : 1, "Bugzilla_login" : user, "Bugzilla_password" : password } )
+ result = opener.open(login + param)
+
+ if result.code != 200:
+ return False
+ txt = result.read()
+ if not '<a href="relogin.cgi">Log&nbsp;out</a>' in txt:
+ return False
+
+ return True
+
+
+def seppuku_find_bug_report(opener, query, product, component, bugname):
+ """
+ Find a bug report with the sane name and return the bug id
+ and the status.
+
+ @param opener = urllib2 opener
+ @param query = e.g. https://bugzilla.openmoko.org/cgi-bin/bugzilla/query.cgi?
+ @param product = search for this product
+ @param component = search for this component
+ @param bugname = the bug to search for
+
+ https://bugzilla.openmoko.org/cgi-bin/bugzilla/buglist.cgi?short_desc_type=substring&short_desc=manual+test+bug&product=OpenMoko&emailreporter2=1&emailtype2=substring&email2=freyther%40yahoo.com
+ but it does not support ctype=csv...
+ """
+ pass
+
+def seppuku_append_or_file(opener, file, product, component, bugname, text):
+ """
+ Add a comment or open a bug report
+ """
+
+
+
+addhandler seppuku_do_report
+python seppuku_do_report() {
+ """
+ Report task failures to the bugzilla
+ and succeeded builds to the box
+ """
+ from bb.event import NotHandled, getName
+ from bb import data, mkdirhier, build
+ import bb, os, glob
+
+ try:
+ import urllib2, cookielib
+ except:
+ bb.note("Failed to import the cookielib and urllib2, make sure to use python2.4")
+ return NotHandled
+
+ event = e
+ data = e.data
+ name = getName(event)
+ if name == "PkgFailed":
+ if not data.getVar('SEPPUKU_AUTOBUILD', data, True) == "0":
+ build.exec_task('do_clean', data)
+ elif name == "TaskFailed" or name == "NoProvider":
+ cj = cookielib.CookieJar()
+ opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
+ login = bb.data.getVar("SEPPUKU_LOGIN", data, True)
+ query = bb.data.getVar("SEPPUKU_QUERY", data, True)
+ file = bb.data.getVar("SEPPUKU_FILE", data, True)
+ post = bb.data.getVar("SEPPUKU_POST", data, True)
+ user = bb.data.getVar("SEPPUKU_USER", data, True)
+ pass = bb.data.getVar("SEPPUKU_PASS", data, True)
+ product = bb.data.getVar("SEPPUKU_PRODUCT", data, True)
+ component = bb.data.getVar("SEPPUKU_COMPONENT", data, True)
+
+ if not seppuku_login(opener, login, user, pass):
+ bb.note("Login to bugzilla failed")
+ return NotHandled
+
+ if name == "TaskFailed":
+ bugname = "%(package)s-%(pv)s-%(pr)s-%(task)s" % { "package" : bb.data.getVar("PN", data, True),
+ "pv" : bb.data.getVar("PV", data, True),
+ "pr" : bb.data.getVar("PR", data, True),
+ "task" : e.task }
+ log_file = glob.glob("%s/log.%s.*" % (data.getVar('T', event.data, True), event.task))
+ if len(log_file) != 0:
+ to_file = data.getVar('TINDER_LOG', event.data, True)
+ text = "".join(open(log_file[0], 'r').readlines())
+ elif name == "NoProvider":
+ bugname = "noprovider for %s runtime: %s" % (event.getItem, event.getisRuntime)
+ text = "Please fix it"
+ else
+ assert False
+
+ (bug_open, bug_number) = seppuku_find_bug_report(opener, query, product, component, bugname)
+
+ # The bug is present and still open, no need to attach an error log
+ if bug_nunumber and bug_open:
+ return NotHandled
+
+
+ if seppuku_append_or_file(opener, file, produuct, component, bugname, text)
+ bb.note("Filing a bugreport failed")
+
+ return NotHandled