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

openSUSE Build Service is sponsored by