Extremely basic first crack at implementing djb's redo.
And a test program.
This commit is contained in:
commit
a51764c907
13 changed files with 305 additions and 0 deletions
52
redo.py
Executable file
52
redo.py
Executable file
|
|
@ -0,0 +1,52 @@
|
|||
#!/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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue