diff options
Diffstat (limited to 'classes/seppuku.bbclass')
-rw-r--r-- | classes/seppuku.bbclass | 103 |
1 files changed, 96 insertions, 7 deletions
diff --git a/classes/seppuku.bbclass b/classes/seppuku.bbclass index b3e3fcb8c2..4a3eced73d 100644 --- a/classes/seppuku.bbclass +++ b/classes/seppuku.bbclass @@ -29,6 +29,62 @@ def seppuku_login(opener, login, user, password): return True +def seppuku_find_bug_report_old(): + from HTMLParser import HTMLParser + + class BugQueryExtractor(HTMLParser): + STATE_NONE = 0 + STATE_FOUND_TR = 1 + STATE_FOUND_NUMBER = 2 + STATE_FOUND_PRIO = 3 + STATE_FOUND_PRIO2 = 4 + STATE_FOUND_NAME = 5 + STATE_FOUND_PLATFORM = 6 + STATE_FOUND_STATUS = 7 + STATE_FOUND_WHATEVER = 8 # I don't know this field + STATE_FOUND_DESCRIPTION =9 + + def __init__(self): + HTMLParser.__init__(self) + self.state = self.STATE_NONE + self.bugs = [] + + def handle_starttag(self, tag, attr): + if self.state == self.STATE_NONE and tag.lower() == "tr": + if len(attr) == 1 and attr[0] == ('class', 'bz_normal bz_P2 '): + print "Found tr %s %s" % (tag, attr) + self.state = self.STATE_FOUND_TR + elif self.state == self.STATE_FOUND_TR and tag.lower() == "td": + self.state += 1 + + def handle_endtag(self, tag): + if tag.lower() == "tr": + print "Going back" + if self.state != self.STATE_NONE: + self.bugs.append( (self.bug,self.status) ) + self.state = self.STATE_NONE + if self.state > 1 and tag.lower() == "td": + print "Next TD" + self.state += 1 + + def handle_data(self,data): + data = data.strip() + + # skip garbage + if len(data) == 0: + return + + if self.state == self.STATE_FOUND_NUMBER: + self.bug = data + elif self.state == self.STATE_FOUND_STATUS: + self.status = data + + def result(self): + return self.bugs + + return BugQueryExtractor() + + def seppuku_find_bug_report(opener, query, product, component, bugname): """ @@ -44,13 +100,43 @@ def seppuku_find_bug_report(opener, query, product, component, bugname): 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): + result = opener.open("%(query)s?product=%(product)s&component=%(component)s&short_desc_type=substring&short_desc=%(bugname)s" % vars()) + if result.code != 200: + raise "Can not query the bugzilla at all" + txt = result.read() + scanner = seppuku_find_bug_report_old() + scanner.feed(txt) + if len(scanner.result()) == 0: + return (False,None) + else: # silently pick the first result + (number,status) = scanner.result()[0] + return (status != "CLOSED",number) + +def seppuku_file_bug(opener, file, product, component, bugname, text): """ - Add a comment or open a bug report + Create a completely new bug report + + + http://bugzilla.openmoko.org/cgi-bin/bugzilla/post_bug.cgi?bug_file_loc=http%3A%2F%2F&version=2007&product=OpenMoko&component=autobuilds&short_desc=foo&comment=bla&priority=P2&bug_severity=normal&op_sys=Linux&rep_platform=Neo1973 + + You are forced to add some default values to the bugzilla query and stop with '&' + + @param opener urllib2 opener + @param file The url used to file a bug report + @param product Product + @param component Component + @param bugname Name of the to be created bug + @param text Text """ + import urllib + param = urllib.urlencode( { "product" : product, "component" : component, "short_desc" : bugname, "comment" : text } ) + result = opener.open( file + param ) + if result.code != 200: + return False + else: + return True + addhandler seppuku_do_report @@ -109,11 +195,14 @@ python seppuku_do_report() { (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: + if bug_number and bug_open: + bb.note("The bug is known as '%s'" % bug_number" return NotHandled - - if seppuku_append_or_file(opener, file, produuct, component, bugname, text) + if bug_number and not bug_open: + if not seppuku_reopen_bug(opener, file, product, component, bug_number, bugname, text): + bb.note("Failed to reopen the bug report") + else seppuku_file_bug(opener, file, product, component, bugname, text): bb.note("Filing a bugreport failed") return NotHandled |