def main(targets, should_build=(lambda f: deps.DIRTY), parent=None, delegate=None, re_do=True): any_errors = [0, 0] if vars.SHUFFLE: import random random.shuffle(targets) if delegate: debug("delegated: %s\n", delegate) try: for t in targets: f = state.File(name=t) if not build(f, any_errors, should_build, add_dep_to=parent, delegate=delegate, re_do=re_do): break jwack.wait_all() finally: jwack.force_return_tokens() if any_errors[1] == 1: return any_errors[0] elif any_errors[0]: return 1 else: return 0
# only do this from the toplevel redo process, so unless the user # deliberately starts more than one redo on the same repository, it's # sort of ok. mkdirp('%s/.redo' % base) for f in glob.glob('%s/.redo/lock*' % base): os.unlink(f) if not vars.DEPTH: # toplevel call to redo exenames = [os.path.abspath(sys.argv[0]), os.path.realpath(sys.argv[0])] if exenames[0] == exenames[1]: exenames = [exenames[0]] dirnames = [os.path.dirname(p) for p in exenames] os.environ['PATH'] = ':'.join(dirnames) + ':' + os.environ['PATH'] try: j = atoi.atoi(opt.jobs or 1) if j < 1 or j > 1000: err('invalid --jobs value: %r\n' % opt.jobs) jwack.setup(j) try: retcode = builder.main(targets, builder.build) finally: jwack.force_return_tokens() if retcode: err('exiting: %d\n' % retcode) sys.exit(retcode) except KeyboardInterrupt: sys.exit(200)
if not f.is_generated: warn('%s: exists and not marked as generated; not redoing.\n' % f.nicename()) state.rollback() j = atoi(opt.jobs or 1) if j < 1 or j > 1000: err('invalid --jobs value: %r\n' % opt.jobs) jwack.setup(j) try: assert(state.is_flushed()) retcode = builder.main(targets, lambda t: (True, True)) assert(state.is_flushed()) finally: try: state.rollback() finally: try: jwack.force_return_tokens() except Exception, e: traceback.print_exc(100, sys.stderr) err('unexpected error: %r\n' % e) retcode = 1 if vars_init.is_toplevel: builder.await_log_reader() sys.exit(retcode) except KeyboardInterrupt: if vars_init.is_toplevel: builder.await_log_reader() sys.exit(200)