File faillog.py of Package osc-plugin-faillog
# -*- coding: utf-8 -*-
# vim: ts=4 sw=4 sta ai:
# Smart build failure log display for lazy people (like me)
# Author: Pascal Bleser <pascal.bleser@opensuse.org>
import re
faillog_rank_repo = [
re.compile(r'factory', re.I),
]
faillog_rank_arch = [
re.compile(r'x86_64'),
]
@cmdln.alias('f')
@cmdln.alias('fl')
def do_faillog(self, subcmd, opts, *args):
global faillog_rank_repo, faillog_rank_arch
"""${cmd_name}: show the most informative failed build
${cmd_usage}
"""
import pprint
args = parseargs(args)
pacs = findpacs(args)
failed = []
for pac in pacs:
f = show_results_meta(pac.apiurl, pac.prjname, pac.name)
tree = ET.parse(StringIO(''.join(f)))
root = tree.getroot()
for node in root.findall('result'):
rmap = {}
rmap['prj'] = pac.prjname
rmap['pac'] = pac.name
rmap['rep'] = node.get('repository')
rmap['arch'] = node.get('arch')
statusnode = node.find('status')
try:
rmap['status'] = statusnode.get('code')
except:
# code can be missing when package is too new:
rmap['status'] = "?"
pass
if not rmap['status'] in ['succeeded', 'disabled', 'blocked', 'building', 'finished', 'scheduled']:
failed.append((rmap['rep'], rmap['arch'], rmap['status']))
pass
pass
pass
if len(failed) < 1:
return
winner_repo = None
repos = map(lambda x: x[0], failed)
repos.sort()
for r, a, s in failed:
#print "%s: r=%s a=%s" % (s, r, a)
for rx in faillog_rank_repo:
if rx.search(r):
winner_repo = r
break
pass
pass
if winner_repo == None:
winner_repo = repos[-1]
pass
winner_arch = None
archs = map(lambda x: x[1], filter(lambda x: x[0] == winner_repo, failed))
archs.sort()
for a in archs:
for rx in faillog_rank_arch:
if rx.search(a):
winner_arch = a
break
pass
pass
if winner_arch == None:
winner_arch = archs[0]
pass
#print "%s %s" % (winner_repo, winner_arch)
wd = os.curdir
package = store_read_package(wd)
project = store_read_project(wd)
apiurl = store_read_apiurl(wd)
print_buildlog(apiurl, project, package, winner_repo, winner_arch)
pass