2010-11-12 05:24:46 -08:00
|
|
|
import sys, os, errno
|
2010-11-13 00:53:55 -08:00
|
|
|
import vars
|
2010-11-12 05:24:46 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def unlink(f):
|
|
|
|
|
"""Delete a file at path 'f' if it currently exists.
|
|
|
|
|
|
|
|
|
|
Unlike os.unlink(), does not throw an exception if the file didn't already
|
|
|
|
|
exist.
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
os.unlink(f)
|
|
|
|
|
except OSError, e:
|
|
|
|
|
if e.errno == errno.ENOENT:
|
|
|
|
|
pass # it doesn't exist, that's what you asked for
|
|
|
|
|
|
|
|
|
|
|
2010-11-12 07:03:06 -08:00
|
|
|
def mkdirp(d, mode=None):
|
|
|
|
|
"""Recursively create directories on path 'd'.
|
|
|
|
|
|
|
|
|
|
Unlike os.makedirs(), it doesn't raise an exception if the last element of
|
|
|
|
|
the path already exists.
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
if mode:
|
|
|
|
|
os.makedirs(d, mode)
|
|
|
|
|
else:
|
|
|
|
|
os.makedirs(d)
|
|
|
|
|
except OSError, e:
|
|
|
|
|
if e.errno == errno.EEXIST:
|
|
|
|
|
pass
|
|
|
|
|
else:
|
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
|
2010-11-13 00:53:55 -08:00
|
|
|
def _log(s):
|
|
|
|
|
sys.stdout.flush()
|
|
|
|
|
sys.stderr.write(s)
|
|
|
|
|
sys.stderr.flush()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _clog(s):
|
2010-11-13 01:28:31 -08:00
|
|
|
if vars.VERBOSE: _log('\n')
|
2010-11-13 01:55:07 -08:00
|
|
|
_log('\x1b[32mredo %s\x1b[1m%s\x1b[m' % (vars.DEPTH, s))
|
2010-11-13 00:53:55 -08:00
|
|
|
def _bwlog(s):
|
2010-11-13 01:28:31 -08:00
|
|
|
if vars.VERBOSE: _log('\n')
|
2010-11-13 01:55:07 -08:00
|
|
|
_log('redo %s%s' % (vars.DEPTH, s))
|
2010-11-13 01:21:59 -08:00
|
|
|
|
|
|
|
|
def _cerr(s):
|
|
|
|
|
_log('\x1b[31mredo: %s\x1b[1m%s\x1b[m' % (vars.DEPTH, s))
|
|
|
|
|
def _bwerr(s):
|
|
|
|
|
_log('redo: %s%s' % (vars.DEPTH, s))
|
|
|
|
|
|
|
|
|
|
|
2010-11-13 00:53:55 -08:00
|
|
|
if os.isatty(2):
|
|
|
|
|
log = _clog
|
2010-11-13 01:21:59 -08:00
|
|
|
err = _cerr
|
2010-11-13 00:53:55 -08:00
|
|
|
else:
|
|
|
|
|
log = _bwlog
|
2010-11-13 01:21:59 -08:00
|
|
|
err = _bwerr
|
2010-11-13 00:53:55 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def debug(s):
|
2010-11-16 04:13:17 -08:00
|
|
|
if vars.DEBUG >= 1:
|
|
|
|
|
_log('redo: %s%s' % (vars.DEPTH, s))
|
|
|
|
|
def debug2(s):
|
|
|
|
|
if vars.DEBUG >= 2:
|
2010-11-13 00:53:55 -08:00
|
|
|
_log('redo: %s%s' % (vars.DEPTH, s))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def relpath(t, base):
|
|
|
|
|
t = os.path.abspath(t)
|
|
|
|
|
tparts = t.split('/')
|
|
|
|
|
bparts = base.split('/')
|
|
|
|
|
for tp,bp in zip(tparts,bparts):
|
|
|
|
|
if tp != bp:
|
|
|
|
|
break
|
|
|
|
|
tparts.pop(0)
|
|
|
|
|
bparts.pop(0)
|
|
|
|
|
while bparts:
|
|
|
|
|
tparts.insert(0, '..')
|
|
|
|
|
bparts.pop(0)
|
|
|
|
|
return '/'.join(tparts)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def sname(typ, t):
|
|
|
|
|
# FIXME: t.replace(...) is non-reversible and non-unique here!
|
|
|
|
|
tnew = relpath(t, vars.BASE)
|
|
|
|
|
#log('sname: (%r) %r -> %r\n' % (vars.BASE, t, tnew))
|
|
|
|
|
return vars.BASE + ('/.redo/%s^%s' % (typ, tnew.replace('/', '^')))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def add_dep(t, mode, dep):
|
|
|
|
|
open(sname('dep', t), 'a').write('%s %s\n' % (mode, dep))
|