From fba684ee077d3f5fc49899ab7ce273c6c9c4f05e Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Sat, 11 Dec 2010 19:08:53 -0800 Subject: [PATCH] redo-ifchange can now be run even if there's no parent redo. --- redo-ifchange.py | 21 ++++++++++++++++----- redo.py | 28 ++-------------------------- vars.py | 2 +- vars_init.py | 27 +++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 32 deletions(-) create mode 100644 vars_init.py diff --git a/redo-ifchange.py b/redo-ifchange.py index d92a556..be8aa7f 100755 --- a/redo-ifchange.py +++ b/redo-ifchange.py @@ -1,5 +1,11 @@ #!/usr/bin/python import sys, os, errno, stat +if not sys.argv[1:]: + sys.exit(0) # nothing to do, so we can't possibly do it wrong + +import vars_init +vars_init.init(sys.argv[1:]) + import vars, state, builder, jwack from helpers import unlink from log import debug, debug2, err @@ -103,13 +109,17 @@ def should_build(t): rv = 202 try: - me = os.path.join(vars.STARTDIR, - os.path.join(vars.PWD, vars.TARGET)) - f = state.File(name=me) - debug2('TARGET: %r %r %r\n' % (vars.STARTDIR, vars.PWD, vars.TARGET)) + if vars.TARGET and not vars.UNLOCKED: + me = os.path.join(vars.STARTDIR, + os.path.join(vars.PWD, vars.TARGET)) + f = state.File(name=me) + debug2('TARGET: %r %r %r\n' % (vars.STARTDIR, vars.PWD, vars.TARGET)) + else: + f = me = None + debug2('redo-ifchange: not adding depends.\n') try: targets = sys.argv[1:] - if not vars.UNLOCKED: + if f: for t in targets: f.add_dep('m', t) f.save() @@ -118,4 +128,5 @@ try: jwack.force_return_tokens() except KeyboardInterrupt: sys.exit(200) +state.commit() sys.exit(rv) diff --git a/redo.py b/redo.py index 4b55c19..db4ba7b 100755 --- a/redo.py +++ b/redo.py @@ -35,36 +35,12 @@ if opt.debug_locks: if opt.debug_pids: os.environ['REDO_DEBUG_PIDS'] = '1' -is_root = not os.environ.get('REDO', '') - -if is_root: - # 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'] - - base = os.path.commonprefix([os.path.abspath(os.path.dirname(t)) - for t in targets] + [os.getcwd()]) - bsplit = base.split('/') - for i in range(len(bsplit)-1, 0, -1): - newbase = '/'.join(bsplit[:i]) - if os.path.exists(newbase + '/.redo'): - base = newbase - break - os.environ['REDO_BASE'] = base - os.environ['REDO_STARTDIR'] = os.getcwd() - os.environ['REDO'] = os.path.abspath(sys.argv[0]) - +import vars_init +vars_init.init(targets) import vars, state, builder, jwack from log import err - -if is_root: - state.init() - try: j = atoi(opt.jobs or 1) if j < 1 or j > 1000: diff --git a/vars.py b/vars.py index b10f742..77156ee 100644 --- a/vars.py +++ b/vars.py @@ -17,7 +17,7 @@ VERBOSE = os.environ.get('REDO_VERBOSE', '') and 1 or 0 XTRACE = os.environ.get('REDO_XTRACE', '') and 1 or 0 KEEP_GOING = os.environ.get('REDO_KEEP_GOING', '') and 1 or 0 SHUFFLE = os.environ.get('REDO_SHUFFLE', '') and 1 or 0 -STARTDIR = os.environ['REDO_STARTDIR'] +STARTDIR = os.environ.get('REDO_STARTDIR', '') RUNID = atoi(os.environ.get('REDO_RUNID')) or None BASE = os.environ['REDO_BASE'] while BASE and BASE.endswith('/'): diff --git a/vars_init.py b/vars_init.py new file mode 100644 index 0000000..1c78ca4 --- /dev/null +++ b/vars_init.py @@ -0,0 +1,27 @@ +import sys, os + +def init(targets): + if not os.environ.get('REDO'): + # 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'] + os.environ['REDO'] = os.path.abspath(sys.argv[0]) + + if not os.environ.get('REDO_BASE'): + base = os.path.commonprefix([os.path.abspath(os.path.dirname(t)) + for t in targets] + [os.getcwd()]) + bsplit = base.split('/') + for i in range(len(bsplit)-1, 0, -1): + newbase = '/'.join(bsplit[:i]) + if os.path.exists(newbase + '/.redo'): + base = newbase + break + os.environ['REDO_BASE'] = base + os.environ['REDO_STARTDIR'] = os.getcwd() + + import state + state.init()