redo-ifchange can now be run even if there's no parent redo.

This commit is contained in:
Avery Pennarun 2010-12-11 19:08:53 -08:00
commit fba684ee07
4 changed files with 46 additions and 32 deletions

View file

@ -1,5 +1,11 @@
#!/usr/bin/python #!/usr/bin/python
import sys, os, errno, stat 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 import vars, state, builder, jwack
from helpers import unlink from helpers import unlink
from log import debug, debug2, err from log import debug, debug2, err
@ -103,13 +109,17 @@ def should_build(t):
rv = 202 rv = 202
try: try:
if vars.TARGET and not vars.UNLOCKED:
me = os.path.join(vars.STARTDIR, me = os.path.join(vars.STARTDIR,
os.path.join(vars.PWD, vars.TARGET)) os.path.join(vars.PWD, vars.TARGET))
f = state.File(name=me) f = state.File(name=me)
debug2('TARGET: %r %r %r\n' % (vars.STARTDIR, vars.PWD, vars.TARGET)) debug2('TARGET: %r %r %r\n' % (vars.STARTDIR, vars.PWD, vars.TARGET))
else:
f = me = None
debug2('redo-ifchange: not adding depends.\n')
try: try:
targets = sys.argv[1:] targets = sys.argv[1:]
if not vars.UNLOCKED: if f:
for t in targets: for t in targets:
f.add_dep('m', t) f.add_dep('m', t)
f.save() f.save()
@ -118,4 +128,5 @@ try:
jwack.force_return_tokens() jwack.force_return_tokens()
except KeyboardInterrupt: except KeyboardInterrupt:
sys.exit(200) sys.exit(200)
state.commit()
sys.exit(rv) sys.exit(rv)

28
redo.py
View file

@ -35,36 +35,12 @@ if opt.debug_locks:
if opt.debug_pids: if opt.debug_pids:
os.environ['REDO_DEBUG_PIDS'] = '1' os.environ['REDO_DEBUG_PIDS'] = '1'
is_root = not os.environ.get('REDO', '') import vars_init
vars_init.init(targets)
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, state, builder, jwack import vars, state, builder, jwack
from log import err from log import err
if is_root:
state.init()
try: try:
j = atoi(opt.jobs or 1) j = atoi(opt.jobs or 1)
if j < 1 or j > 1000: if j < 1 or j > 1000:

View file

@ -17,7 +17,7 @@ VERBOSE = os.environ.get('REDO_VERBOSE', '') and 1 or 0
XTRACE = os.environ.get('REDO_XTRACE', '') 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 KEEP_GOING = os.environ.get('REDO_KEEP_GOING', '') and 1 or 0
SHUFFLE = os.environ.get('REDO_SHUFFLE', '') 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 RUNID = atoi(os.environ.get('REDO_RUNID')) or None
BASE = os.environ['REDO_BASE'] BASE = os.environ['REDO_BASE']
while BASE and BASE.endswith('/'): while BASE and BASE.endswith('/'):

27
vars_init.py Normal file
View file

@ -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()