redo-whichdo: a command that explains the .do search path for a target.

For example:

$ redo-whichdo a/b/c/.x.y

- a/b/c.x.y.do
- a/b/default.x.y.do
- a/b/default.y.do
- a/b/default.do
- a/default.x.y.do
- a/default.y.do
- a/default.do
- default.x.y.do
- default.y.do
+ default.do
1 a/b/c.x.y
2 a/b/c.x.y

Lines starting with '-' mean a potential .do file that did not exist,
so we moved onto the next choice (but consider using redo-ifcreate in
case it gets created).  '+' means the .do file we actually chose.  '1'
and '2' are the $1 and $2 to pass along to the given .do file if you want to
call it for the given target.

(The output format is a little weird to make sure it's parseable with
sh 'read x y' calls, even when filenames contain spaces or special
characters.)
This commit is contained in:
Avery Pennarun 2018-10-04 20:20:53 -04:00
commit 61d35d3972
3 changed files with 34 additions and 4 deletions

View file

@ -13,7 +13,7 @@ def _default_do_files(filename):
yield ("default%s.do" % ext), basename, ext yield ("default%s.do" % ext), basename, ext
def _possible_do_files(t): def possible_do_files(t):
dirname,filename = os.path.split(t) dirname,filename = os.path.split(t)
yield (os.path.join(vars.BASE, dirname), "%s.do" % filename, yield (os.path.join(vars.BASE, dirname), "%s.do" % filename,
'', filename, '') '', filename, '')
@ -35,8 +35,8 @@ def _possible_do_files(t):
subdir, os.path.join(subdir, basename), ext) subdir, os.path.join(subdir, basename), ext)
def _find_do_file(f): def find_do_file(f):
for dodir,dofile,basedir,basename,ext in _possible_do_files(f.name): for dodir,dofile,basedir,basename,ext in possible_do_files(f.name):
dopath = os.path.join(dodir, dofile) dopath = os.path.join(dodir, dofile)
debug2('%s: %s:%s ?\n' % (f.name, dodir, dofile)) debug2('%s: %s:%s ?\n' % (f.name, dodir, dofile))
if os.path.exists(dopath): if os.path.exists(dopath):
@ -126,7 +126,7 @@ class BuildJob:
sf.save() sf.save()
return self._after2(0) return self._after2(0)
sf.zap_deps1() sf.zap_deps1()
(dodir, dofile, basedir, basename, ext) = _find_do_file(sf) (dodir, dofile, basedir, basename, ext) = find_do_file(sf)
if not dofile: if not dofile:
if os.path.exists(t): if os.path.exists(t):
sf.set_static() sf.set_static()

1
redo-whichdo Symbolic link
View file

@ -0,0 +1 @@
redo-whichdo.py

29
redo-whichdo.py Executable file
View file

@ -0,0 +1,29 @@
#!/usr/bin/env python
import sys, os
import vars_init
vars_init.init([])
import builder
from log import err
if len(sys.argv[1:]) != 1:
err('%s: exactly one argument expected.\n' % sys.argv[0])
sys.exit(1)
want = sys.argv[1]
for dodir,dofile,basedir,basename,ext in builder.possible_do_files(os.path.abspath(want)):
dopath = os.path.join('/', dodir, dofile)
relpath = os.path.relpath(dopath, '.')
exists = os.path.exists(dopath)
assert('\n' not in relpath)
if exists:
print '+', relpath
assert('\n' not in basename)
assert('\n' not in ext)
print '1', basename+ext
print '2', basename
sys.exit(0)
else:
print '-', relpath
sys.exit(1) # no appropriate dofile found