blob: 7c2f5a7ed864871e7ca447a4a45e08a1c284e19e [file] [log] [blame]
## rtags -- tag source files recursively in a directory tree
##
## Examples:
## R CMD rtags -o TAGS /path/to/Rsrc/
revision='$Rev: 47214 $'
version=`set - ${revision}; echo ${2}`
version="rtags/etags front-end: ${R_VERSION} (r${version})
Copyright (C) 2008 The R Core Team.
This is free software; see the GNU General Public License version 2
or later for copying conditions. There is NO warranty."
usage="Usage: R CMD rtags [options] [path]
Tag C, R, and Rd files under the directory 'path' (pwd by default).
Options:
-h, --help print short help message and exit
-v, --version print version info and exit
-o, --output=FILE write output to FILE (default TAGS)
--no-c do not tag C (.c, .h) files
--no-R do not tag R (.R, .r, .S, .s) files
--no-Rd do not tag Rd (.Rd) files
-a --append append to output file (overwrites by default)
-V, --verbose echo the name of files processed
Report bugs to <deepayan.sarkar@r-project.org>."
## FIXME: Rd and C files may be simpler to deal with on Windows if we
## use R to locate the files, and then call system("etags ...") to tag
## them.
cfiles=true
rfiles=true
rdfiles=true
verbose=false
append=false
ofile="TAGS"
while test -n "${1}"; do
case ${1} in
-h|--help)
echo "${usage}"; exit 0 ;;
-v|--version)
echo "${version}"; exit 0 ;;
-V|--verbose)
verbose=true ;;
-a|--append)
append=true ;;
--no-c)
cfiles=false ;;
--no-R)
rfiles=false ;;
--no-Rd)
rdfiles=false ;;
--output=*)
ofile=`echo "${1}" | ${SED} -e 's/[^=]*=//'` ;;
-o)
if test -n "`echo ${2} | ${SED} 's/^-.*//'`"; then
ofile="${2}"; shift
else
echo "ERROR: option '${1}' requires an argument"
exit 1
fi
;;
--|*)
break ;;
esac
shift
done
NDIR=${#}
case ${NDIR} in
0)
SRCDIR=`pwd` ;;
1)
SRCDIR=${1} ;;
*)
SRCDIR=${1}; echo "WARNING: multiple paths specified; using the first one";;
esac
RPROG=${R_HOME}/bin/R
type=""
first=true
if ${rfiles}; then type="R"; first=false; fi
if ${cfiles}; then
if ${first}; then
type="C"
first=false
else
type="${type}/C"
fi
fi
if ${rdfiles}; then
if ${first}; then
type="Rd"
first=false
else
type="${type}/Rd"
fi
fi
if test -z ${type}; then
echo "ERROR: nothing to tag"
exit 1
fi
echo @ECHO_N@ "
Tagging ${type} files under ${SRCDIR}; writing to ${ofile}"@ECHO_C@
if ! ${append}; then
echo @ECHO_N@ " (overwriting)"@ECHO_C@
echo @ECHO_N@ "" > ${ofile}@ECHO_C@
else
echo @ECHO_N@ " (appending)"@ECHO_C@
touch ${ofile}
fi
echo "...
"
## echo RPROG=${RPROG}
if ${verbose}; then VERBOSE=TRUE; else VERBOSE=FALSE; fi
if ${append}; then APPEND=TRUE; else APPEND=FALSE; fi
if ${rfiles}; then
SCRIPT_DIR=$(dirname $0)
echo "
require(utils)
rtags(path.expand('${SRCDIR}'), pattern = '[.]*\\\\\.[RrSs]$',
keep.re = '/R/[^/]*\\\\\.[RrSs]',
verbose = ${VERBOSE},
ofile = '${ofile}',
append = ${APPEND},
recursive = TRUE)" | "${RPROG}" --slave
fi
if ${rdfiles}; then
if ${verbose}; then
find -L ${SRCDIR} -type f -name "*.Rd" -print
fi
find -L ${SRCDIR} -type f -name "*.Rd" -print0 | xargs -0 etags -o ${ofile} -a -l none --regex='/\\alias[{]\([^{}]*\)[}]/\1/'
fi
if ${cfiles}; then
if ${verbose}; then
find -L ${SRCDIR} -type f -name "*.[ch]" -print
find -L ${SRCDIR} -type f -name "*.cpp" -print
find -L ${SRCDIR} -type f -name "*.hpp" -print
find -L ${SRCDIR} -type f -name "*.cc" -print
find -L ${SRCDIR} -type f -name "*.hh" -print
fi
find -L ${SRCDIR} -type f -name "*.[ch]" -print0 | xargs -0 etags -o ${ofile} -a -l c
find -L ${SRCDIR} -type f -name "*.cpp" -print0 | xargs -0 etags -o ${ofile} -a -l c
find -L ${SRCDIR} -type f -name "*.hpp" -print0 | xargs -0 etags -o ${ofile} -a -l c
find -L ${SRCDIR} -type f -name "*.cc" -print0 | xargs -0 etags -o ${ofile} -a -l c
find -L ${SRCDIR} -type f -name "*.hh" -print0 | xargs -0 etags -o ${ofile} -a -l c
fi
echo "Done"
exit 0
### Local Variables: ***
### mode: sh ***
### sh-indentation: 2 ***
### End: ***