state.py: remove all the ugly fromdir= stuff.

Instead, just change the target name to be more specific, in the one place
in redo-ifchange that actually needed it.
This commit is contained in:
Avery Pennarun 2010-11-21 04:57:04 -08:00
commit 47edb9527d
3 changed files with 48 additions and 50 deletions

View file

@ -67,18 +67,3 @@ def debug2(s):
log_('redo: %s%s' % (vars.DEPTH, s)) 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)

View file

@ -4,22 +4,22 @@ import vars, state, builder
from helpers import debug, err, mkdirp, unlink from helpers import debug, err, mkdirp, unlink
def _dirty_deps(t, depth, fromdir): def _dirty_deps(t, depth):
debug('%s?%s\n' % (depth, t)) debug('%s?%s\n' % (depth, t))
if state.isbuilt(t, fromdir): if state.isbuilt(t):
debug('%s-- DIRTY (built)\n' % depth) debug('%s-- DIRTY (built)\n' % depth)
return True # has already been built during this session return True # has already been built during this session
if state.ismarked(t, fromdir): if state.ismarked(t):
debug('%s-- CLEAN (marked)\n' % depth) debug('%s-- CLEAN (marked)\n' % depth)
return False # has already been checked during this session return False # has already been checked during this session
stamptime = state.stamped(t, fromdir) stamptime = state.stamped(t)
if stamptime == None: if stamptime == None:
debug('%s-- DIRTY (no stamp)\n' % depth) debug('%s-- DIRTY (no stamp)\n' % depth)
return True return True
try: try:
realtime = os.stat(os.path.join(fromdir or '', t)).st_mtime realtime = os.stat(t).st_mtime
except OSError: except OSError:
realtime = 0 realtime = 0
@ -27,22 +27,22 @@ def _dirty_deps(t, depth, fromdir):
debug('%s-- DIRTY (mtime)\n' % depth) debug('%s-- DIRTY (mtime)\n' % depth)
return True return True
for mode,name in state.deps(t, fromdir): for mode,name in state.deps(t):
if mode == 'c': if mode == 'c':
if os.path.exists(name): if os.path.exists(name):
debug('%s-- DIRTY (created)\n' % depth) debug('%s-- DIRTY (created)\n' % depth)
return True return True
elif mode == 'm': elif mode == 'm':
if dirty_deps(name, depth + ' ', fromdir=vars.BASE): if dirty_deps(os.path.join(vars.BASE, name), depth + ' '):
debug('%s-- DIRTY (sub)\n' % depth) debug('%s-- DIRTY (sub)\n' % depth)
return True return True
state.mark(t, fromdir) state.mark(t)
return False return False
def dirty_deps(t, depth, fromdir=None): def dirty_deps(t, depth):
if _dirty_deps(t, depth, fromdir): if _dirty_deps(t, depth):
state.unstamp(t, fromdir) state.unstamp(t)
return True return True
return False return False

View file

@ -1,6 +1,6 @@
import sys, os, errno, glob import sys, os, errno, glob
import vars import vars
from helpers import unlink, relpath, debug2, mkdirp from helpers import unlink, debug2, mkdirp
def init(): def init():
@ -17,10 +17,23 @@ def init():
os.unlink(f) os.unlink(f)
def _sname(typ, t, fromdir=None): def relpath(t, base):
t = os.path.normpath(os.path.join(os.getcwd(), 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! # FIXME: t.replace(...) is non-reversible and non-unique here!
if fromdir:
t = os.path.join(fromdir, t)
tnew = relpath(t, vars.BASE) tnew = relpath(t, vars.BASE)
v = vars.BASE + ('/.redo/%s^%s' % (typ, tnew.replace('/', '^'))) v = vars.BASE + ('/.redo/%s^%s' % (typ, tnew.replace('/', '^')))
debug2('sname: (%r) %r -> %r\n' % (os.getcwd(), t, tnew)) debug2('sname: (%r) %r -> %r\n' % (os.getcwd(), t, tnew))
@ -33,8 +46,8 @@ def add_dep(t, mode, dep):
% (mode, relpath(dep, vars.BASE))) % (mode, relpath(dep, vars.BASE)))
def deps(t, fromdir=None): def deps(t):
for line in open(_sname('dep', t, fromdir)).readlines(): for line in open(_sname('dep', t)).readlines():
assert(line[0] in ('c','m')) assert(line[0] in ('c','m'))
assert(line[1] == ' ') assert(line[1] == ' ')
assert(line[-1] == '\n') assert(line[-1] == '\n')
@ -43,8 +56,8 @@ def deps(t, fromdir=None):
yield mode,name yield mode,name
def _stampname(t, fromdir=None): def _stampname(t):
return _sname('stamp', t, fromdir) return _sname('stamp', t)
def stamp(t): def stamp(t):
@ -66,13 +79,13 @@ def stamp(t):
open(depfile, 'a').close() open(depfile, 'a').close()
def unstamp(t, fromdir=None): def unstamp(t):
unlink(_stampname(t, fromdir)) unlink(_stampname(t))
def stamped(t, fromdir=None): def stamped(t):
try: try:
stamptime = os.stat(_stampname(t, fromdir)).st_mtime stamptime = os.stat(_stampname(t)).st_mtime
except OSError, e: except OSError, e:
if e.errno == errno.ENOENT: if e.errno == errno.ENOENT:
return None return None
@ -81,9 +94,9 @@ def stamped(t, fromdir=None):
return stamptime return stamptime
def built(t, fromdir=None): def built(t):
try: try:
open(_sname('built', t, fromdir), 'w').close() open(_sname('built', t), 'w').close()
except IOError, e: except IOError, e:
if e.errno == errno.ENOENT: if e.errno == errno.ENOENT:
pass # may happen if someone deletes our .redo dir pass # may happen if someone deletes our .redo dir
@ -92,17 +105,17 @@ def built(t, fromdir=None):
_builts = {} _builts = {}
def isbuilt(t, fromdir=None): def isbuilt(t):
if _builts.get((t,fromdir)): if _builts.get(t):
return True return True
if os.path.exists(_sname('built', t, fromdir)): if os.path.exists(_sname('built', t)):
_builts[(t,fromdir)] = True _builts[t] = True
return True return True
def mark(t, fromdir=None): def mark(t):
try: try:
open(_sname('mark', t, fromdir), 'w').close() open(_sname('mark', t), 'w').close()
except IOError, e: except IOError, e:
if e.errno == errno.ENOENT: if e.errno == errno.ENOENT:
pass # may happen if someone deletes our .redo dir pass # may happen if someone deletes our .redo dir
@ -111,11 +124,11 @@ def mark(t, fromdir=None):
_marks = {} _marks = {}
def ismarked(t, fromdir=None): def ismarked(t):
if _marks.get((t,fromdir)): if _marks.get(t):
return True return True
if os.path.exists(_sname('mark', t, fromdir)): if os.path.exists(_sname('mark', t)):
_marks[(t,fromdir)] = True _marks[t] = True
return True return True