apenwarr-redo/redo.py
2010-11-12 05:25:03 -08:00

52 lines
1.2 KiB
Python
Executable file

#!/usr/bin/python
import sys, os, subprocess
import options
from helpers import *
optspec = """
redo [targets...]
--
ifchange something something
"""
o = options.Options('redo', optspec)
(opt, flags, extra) = o.parse(sys.argv[1:])
targets = extra or ['it']
def find_do_file(t):
p = '%s.do' % t
if os.path.exists(p):
return p
else:
return None
def build(t):
dofile = find_do_file(t)
if not dofile:
if os.path.exists(t): # an existing source file
return # success
else:
raise Exception('no rule to make %r' % t)
unlink(t)
os.putenv('REDO_TARGET', t)
tmpname = '%s.redo.tmp' % t
unlink(tmpname)
f = open(tmpname, 'w+')
log('running: %r\n' % dofile)
rv = subprocess.call(['sh', '-e', dofile, t , 'FIXME', tmpname],
stdout=f.fileno())
st = os.stat(tmpname)
log('rv: %d (%d bytes) (%r)\n' % (rv, st.st_size, dofile))
if rv==0 and st.st_size:
os.rename(tmpname, t)
log('made %r\n' % t)
else:
unlink(tmpname)
f.close()
if rv != 0:
raise Exception('non-zero return code building %r' % t)
for t in targets:
build(t)