52 lines
1.2 KiB
Python
52 lines
1.2 KiB
Python
|
|
#!/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)
|