view scripts/build.py @ 375:79262e20b073

Protect the main beep loop from exceptions-- either problems in callbacks or errors in the asyncore handlers, which can stop the scheduled events from getting run. Also move over to using the asyncore.loop function over the poll function-- using poll as we were seeing use_poll=False (the default) hang forever, making scheduled events not get run.
author wbell
date Mon, 23 Jul 2007 22:03:07 +0000
parents a22ec8fce6c9
children 0df178e07fdb
line wrap: on
line source
#!/usr/bin/env python
# -*- coding: iso8859-1 -*-
#
# Copyright (C) 2005 Christopher Lenz <cmlenz@gmx.de>
# All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at http://bitten.cmlenz.net/wiki/License.

import itertools
import logging
import sys

from bitten.build import BuildError
from bitten.recipe import Recipe
from bitten.util import xmlio

def main():
    from bitten import __version__ as VERSION
    from optparse import OptionParser

    parser = OptionParser(usage='usage: %prog [options] [step1] [step2] ...',
                          version='%%prog %s' % VERSION)
    parser.add_option('-f', '--recipe-file', action='store', dest='recipe_file',
                      metavar='FILE', help='read build recipe from FILE')
    parser.add_option('--print-logs', action='store_const',
                      dest='print_logs', const=True,
                      help='print build logs')
    parser.add_option('--print-reports', action='store_const',
                      dest='print_reports', const=True,
                      help='print generated reports')
    parser.add_option('-v', '--verbose', action='store_const', dest='loglevel',
                      const=logging.DEBUG, help='print as much as possible')
    parser.add_option('-q', '--quiet', action='store_const', dest='loglevel',
                      const=logging.ERROR, help='print as little as possible')
    parser.set_defaults(loglevel=logging.INFO, recipe_file='recipe.xml')
    options, args = parser.parse_args()

    log = logging.getLogger('bitten')
    log.setLevel(options.loglevel)
    handler = logging.StreamHandler()
    handler.setLevel(options.loglevel)
    formatter = logging.Formatter('%(message)s')
    handler.setFormatter(formatter)
    log.addHandler(handler)

    steps_to_run = dict([(step, False) for step in args])

    recipe_file = file(options.recipe_file, 'r')
    try:
        recipe = Recipe(xmlio.parse(recipe_file))
        for step in recipe:
            if not steps_to_run or step.id in steps_to_run:
                print
                print '-->', step.id
                for type, category, generator, output in step.execute(recipe.ctxt):
                    if type == Recipe.ERROR:
                        log.error(output)
                    elif type == Recipe.LOG and options.print_logs:
                        output.write(sys.stdout, newlines=True)
                    elif type == Recipe.REPORT and options.print_reports:
                        output.write(sys.stdout, newlines=True)
                if step.id in steps_to_run:
                    steps_to_run[step.id] = True
    finally:
        recipe_file.close()

if __name__ == '__main__':
    try:
        main()
    except BuildError, e:
        print
        print>>sys.stderr, 'FAILED: %s' % e
        sys.exit(-1)
    print
    print 'SUCCESS'
Copyright (C) 2012-2017 Edgewall Software