def execute(card, tries=0): if tries > 5: return False number, effect = card option = random.choice(effect) state.begin() for l in option: success = getattr(parser, l)(number) if (len(effect) > 1 and not success): state.rollback() return execute(card, tries + 1)
def _do_card(_list, tries=0): active = len(_list) if tries > 5 or active == 0: return False n = random.randrange(0, active) p = _list[n] state.begin() for l in p[1]: if not getattr(parser, l)(p[0]): state.rollback() if active == 1: return False return _do_card(_list, tries + 1) for l in p[2]: getattr(parser, l)(p[0]) return n
import vars, state, builder, jwack from logs import warn, err try: if vars_init.is_toplevel: builder.start_stdin_log_reader(status=opt.status, details=opt.details, pretty=opt.pretty, color=opt.color, debug_locks=opt.debug_locks, debug_pids=opt.debug_pids) for t in targets: if os.path.exists(t): f = state.File(name=t) 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()
def catlog(t): global total_lines, status if t in already: return if t != '-': depth.append(t) _fix_depth() already.add(t) mydir = os.path.dirname(t) if t == '-': f = sys.stdin fid = None loglock = None logname = None else: try: sf = state.File(name=t, allow_add=False) except KeyError: sys.stderr.write('redo-log: [%s] %r: not known to redo.\n' % ( os.getcwd(), t, )) sys.exit(24) fid = sf.id del sf state.rollback() logname = state.logname(fid) loglock = state.Lock(fid + state.LOG_LOCK_MAGIC) loglock.waitlock(shared=True) f = None delay = 0.01 was_locked = is_locked(fid) line_head = '' width = _tty_width() while 1: if not f: try: f = open(logname) except IOError, e: if e.errno == errno.ENOENT: # ignore files without logs pass else: raise if f: # Note: normally includes trailing \n. # In 'follow' mode, might get a line with no trailing \n # (eg. when ./configure is halfway through a test), which we # deal with below. line = f.readline() else: line = None if not line and (not opt.follow or not was_locked): # file not locked, and no new lines: done break if not line: was_locked = is_locked(fid) if opt.follow: # Don't display status line for extremely short-lived runs if opt.status and time.time() - start_time > 1.0: width = _tty_width() head = 'redo %s ' % ('{:,}'.format(total_lines)) tail = '' for n in reversed(depth): remain = width - len(head) - len(tail) # always leave room for a final '... ' prefix if remain < len(n) + 4 + 1 or remain <= 4: if len(n) < 6 or remain < 6 + 1 + 4: tail = '... %s' % tail else: start = len(n) - (remain - 3 - 1) tail = '...%s %s' % (n[start:], tail) break elif n != '-': tail = n + ' ' + tail status = head + tail if len(status) > width: sys.stderr.write('\nOVERSIZE STATUS (%d):\n%r\n' % (len(status), status)) assert (len(status) <= width) sys.stdout.flush() sys.stderr.write('\r%-*.*s\r' % (width, width, status)) time.sleep(min(delay, 1.0)) delay += 0.01 continue total_lines += 1 delay = 0.01 if not line.endswith('\n'): line_head += line continue if line_head: line = line_head + line line_head = '' if status: sys.stdout.flush() sys.stderr.write('\r%-*.*s\r' % (width, width, '')) status = None g = re.match(REDO_LINE_RE, line) if g: # FIXME: print prefix if @@REDO is not at start of line. # logs.PrettyLog does it, but only if we actually call .write(). words, text = g.groups() kind, pid, when = words.split(':')[0:3] pid = atoi(pid) relname = _rel(topdir, mydir, text) fixname = os.path.normpath(os.path.join(mydir, text)) if kind == 'unchanged': if opt.unchanged: if opt.debug_locks: logs.meta(kind, relname, pid=pid) elif fixname not in already: logs.meta('do', relname, pid=pid) if opt.recursive: if loglock: loglock.unlock() catlog(os.path.join(mydir, text)) if loglock: loglock.waitlock(shared=True) already.add(fixname) elif kind in ('do', 'waiting', 'locked', 'unlocked'): if opt.debug_locks: logs.meta(kind, relname, pid=pid) logs.write(line.rstrip()) elif fixname not in already: logs.meta('do', relname, pid=pid) if opt.recursive: assert text if loglock: loglock.unlock() catlog(os.path.join(mydir, text)) if loglock: loglock.waitlock(shared=True) already.add(fixname) elif kind == 'done': rv, name = text.split(' ', 1) logs.meta(kind, rv + ' ' + _rel(topdir, mydir, name)) else: logs.write(line.rstrip()) else: if opt.details: logs.write(line.rstrip())