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.
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
$ mtn --db=test.mtn setup -b com.example.test
$ mkdir -p foo/bar/baz
$ cd 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'
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
known are in the
$ known | xargs etags
TAGS file from any directory in a source tree.