Relative Pathnames
Often one is building software in a directory elsewhere than a Monotone project root. In that case, a command such as "mtn list known | xargs etags
" will not have the desired effect, because mtn list known
always returns pathnames relative to the project root.
mtnpwd
For those situations, the following is a simple mtnpwd
script which prints the current working directory relative to the project root.
#!/bin/sh
mtndir=""
while [ "$PWD" != '/' ]; do
[ -d _MTN ] && echo "$mtndir" && exit 0
if [ -n "$mtndir" ]; then
mtndir="`basename $PWD`/$mtndir"
else
mtndir="`basename $PWD`"
fi
cd .. 2> /dev/null || break
done
echo "Not in a monotone project; no _MTN dir found." >&2
exit 255
For example:
$ mtn --db=test.mtn setup -b com.example.test
$ mkdir -p foo/bar/baz
$ cd foo/bar/baz
$ mtnpwd
foo/bar/baz
And of course from there it is easy (assuming sed
is GNU sed
) to print the project root relative to the current working directory:
$ mtnpwd | sed -e 's/[^/]+/../g'
../../..
known
Finally, here is a script called known
which prints the output of mtn list known
with paths made relative to the current directory. As an added benefit, it allows one to filter out files or directories, so that the output may be piped directly into commands which expect filenames of a particular type:
#!/bin/sh
mtndir=`mtnpwd` || exit $?
if [ -n "$mtndir" ]; then
mtnrel="$(echo $mtndir | sed -e 's/[^/]\+/../g')/"
fi
if [ "$1" = '-h' -o "$1" = '--help' ]; then
echo "usage: `basename $0` [-a|-d] PATH..."
echo " -a list files and directories"
echo " -d list only directories"
echo " otherwise, lists only files"
exit 255
fi
if [ "$1" = "-a" ]; then
dirs=true
files=true
shift
elif [ "$1" = "-d" ]; then
dirs=true
files=false
shift
else
dirs=false
files=true
fi
mtn list known $* | while read f; do
r="$mtnrel$f"
[ -e "$r" ] || continue
[ -f "$r" ] && ! $files && continue
[ -d "$r" ] && ! $dirs && continue
echo $r
done
exit 0
For example (assuming both mtnpwd
and known
are in the PATH
):
$ known | xargs etags
builds the TAGS
file from any directory in a source tree.