When we can't find a .do file, we walk all the way back to the root directory. When that happens, the root directory is actually searched twice. This is harmless (since a .do file doesn't exist there anyway) but causes redo-whichdo to produce the wrong output. Also, add a test, which I forgot to do when writing whichdo in the first place. To make the test work from the root directory, we need a way to initialize redo without actually creating a .redo directory. Add a init_no_state() function for that purpose, and split the necessary path functions into their own module so we can avoid importing builder.py.
46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
import sys, os
|
|
|
|
|
|
def init_no_state():
|
|
if not os.environ.get('REDO'):
|
|
os.environ['REDO'] = 'NOT_DEFINED'
|
|
if not os.environ.get('REDO_BASE'):
|
|
os.environ['REDO_BASE'] = 'NOT_DEFINED'
|
|
|
|
|
|
def init(targets):
|
|
if not os.environ.get('REDO'):
|
|
# toplevel call to redo
|
|
if len(targets) == 0:
|
|
targets.append('all')
|
|
exenames = [os.path.abspath(sys.argv[0]),
|
|
os.path.realpath(sys.argv[0])]
|
|
dirnames = [os.path.dirname(p) for p in exenames]
|
|
trynames = ([os.path.abspath(p+'/../lib/redo') for p in dirnames] +
|
|
[p+'/redo-sh' for p in dirnames] +
|
|
dirnames)
|
|
seen = {}
|
|
dirs = []
|
|
for k in trynames:
|
|
if not seen.get(k):
|
|
seen[k] = 1
|
|
dirs.append(k)
|
|
os.environ['PATH'] = ':'.join(dirs) + ':' + os.environ['PATH']
|
|
os.environ['REDO'] = os.path.abspath(sys.argv[0])
|
|
|
|
if not os.environ.get('REDO_BASE'):
|
|
base = os.path.commonprefix([os.path.abspath(os.path.dirname(t))
|
|
for t in targets] + [os.getcwd()])
|
|
bsplit = base.split('/')
|
|
for i in range(len(bsplit)-1, 0, -1):
|
|
newbase = '/'.join(bsplit[:i])
|
|
if os.path.exists(newbase + '/.redo'):
|
|
base = newbase
|
|
break
|
|
os.environ['REDO_BASE'] = base
|
|
os.environ['REDO_STARTDIR'] = os.getcwd()
|
|
|
|
import state
|
|
state.init()
|
|
|
|
os.environ['REDO_LOCKS'] = os.environ.get('REDO_LOCKS', '')
|