dotfiles

Configuration for the software I use.
git clone https://git.jaderune.net/jbauer/dotfiles
Log | Files | Refs | README | LICENSE

update_tags.sh (4989B)


      1 #!/bin/sh
      2 
      3 set -e
      4 
      5 PROG_NAME=$0
      6 CTAGS_EXE=ctags
      7 CTAGS_ARGS=
      8 CTAGS_OPT_FILE=
      9 TAGS_FILE=tags
     10 PROJECT_ROOT=
     11 LOG_FILE=
     12 FILE_LIST_CMD=
     13 FILE_LIST_CMD_IS_ABSOLUTE=0
     14 UPDATED_SOURCE=
     15 POST_PROCESS_CMD=
     16 PAUSE_BEFORE_EXIT=0
     17 
     18 
     19 ShowUsage() {
     20     echo "Usage:"
     21     echo "    $PROG_NAME <options>"
     22     echo ""
     23     echo "    -e [exe=ctags]: The ctags executable to run"
     24     echo "    -t [file=tags]: The path to the ctags file to update"
     25     echo "    -p [dir=]:      The path to the project root"
     26     echo "    -l [file=]:     The path to a log file"
     27     echo "    -L [cmd=]:      The file list command to run"
     28     echo "    -A:             Specifies that the file list command returns "
     29     echo "                    absolute paths"
     30     echo "    -s [file=]:     The path to the source file that needs updating"
     31     echo "    -x [pattern=]:  A pattern of files to exclude"
     32     echo "    -o [options=]:  An options file to read additional options from"
     33     echo "    -O [params=]:   Parameters to pass to ctags"
     34     echo "    -P [cmd=]:      Post process command to run on the tags file"
     35     echo "    -c:             Ask for confirmation before exiting"
     36     echo ""
     37 }
     38 
     39 while getopts "h?e:x:t:p:l:L:s:o:O:P:cA" opt; do
     40     case $opt in
     41         h|\?)
     42             ShowUsage
     43             exit 0
     44             ;;
     45         e)
     46             CTAGS_EXE="$OPTARG"
     47             ;;
     48         x)
     49             CTAGS_ARGS="$CTAGS_ARGS --exclude=$OPTARG"
     50             ;;
     51         t)
     52             TAGS_FILE="$OPTARG"
     53             ;;
     54         p)
     55             PROJECT_ROOT="$OPTARG"
     56             ;;
     57         l)
     58             LOG_FILE="$OPTARG"
     59             ;;
     60         L)
     61             FILE_LIST_CMD="$OPTARG"
     62             ;;
     63         A)
     64             FILE_LIST_CMD_IS_ABSOLUTE=1
     65             ;;
     66         s)
     67             UPDATED_SOURCE="$OPTARG"
     68             ;;
     69         c)
     70             PAUSE_BEFORE_EXIT=1
     71             ;;
     72         o)
     73             CTAGS_OPT_FILE="--options=$OPTARG"
     74             ;;
     75         O)
     76             CTAGS_ARGS="$CTAGS_ARGS $OPTARG"
     77             ;;
     78         P)
     79             POST_PROCESS_CMD="$OPTARG"
     80             ;;
     81     esac
     82 done
     83 
     84 shift $((OPTIND - 1))
     85 
     86 if [ "$1" != "" ]; then
     87     echo "Invalid Argument: $1"
     88     exit 1
     89 fi
     90 
     91 echo "Locking tags file..."
     92 echo $$ > "$TAGS_FILE.lock"
     93 
     94 # Remove lock and temp file if script is stopped unexpectedly.
     95 trap 'errorcode=$?; rm -f "$TAGS_FILE.lock" "$TAGS_FILE.files" "$TAGS_FILE.temp"; exit $errorcode' INT QUIT TERM EXIT
     96 
     97 INDEX_WHOLE_PROJECT=1
     98 if [ -f "$TAGS_FILE" ]; then
     99     if [ "$UPDATED_SOURCE" != "" ]; then
    100         echo "Removing references to: $UPDATED_SOURCE"
    101         tab="	"
    102         cmd="grep --text -Ev '^[^$tab]+$tab$UPDATED_SOURCE$tab' '$TAGS_FILE' > '$TAGS_FILE.temp'"
    103         echo "$cmd"
    104         eval "$cmd" || true
    105         INDEX_WHOLE_PROJECT=0
    106     fi
    107 fi
    108 
    109 if [ $INDEX_WHOLE_PROJECT -eq 1 ]; then
    110     if [ -n "${FILE_LIST_CMD}" ]; then
    111         if [ "${PROJECT_ROOT}" = "." ] || [ $FILE_LIST_CMD_IS_ABSOLUTE -eq 1 ]; then
    112             echo "Running file list command"
    113             echo "eval $FILE_LIST_CMD > \"${TAGS_FILE}.files\""
    114             eval "$FILE_LIST_CMD" > "${TAGS_FILE}.files"
    115         else
    116             # If using a tags cache directory, use absolute paths
    117             echo "Running file list command, patching for absolute paths"
    118             echo "eval $FILE_LIST_CMD"
    119             eval "$FILE_LIST_CMD" | while read -r l; do
    120                 echo "${PROJECT_ROOT%/}/${l}"
    121             done > "${TAGS_FILE}.files"
    122         fi
    123         CTAGS_ARGS="${CTAGS_ARGS} -L"
    124         CTAGS_ARG_LAST="${TAGS_FILE}.files"
    125     else
    126         CTAGS_ARG_LAST="${PROJECT_ROOT}"
    127     fi
    128 
    129     echo "Running ctags on whole project"
    130     if [ "$CTAGS_OPT_FILE" != "" ]; then
    131         echo "$CTAGS_EXE -f \"$TAGS_FILE.temp\" \"$CTAGS_OPT_FILE\" $CTAGS_ARGS \"$CTAGS_ARG_LAST\""
    132         "$CTAGS_EXE" -f "$TAGS_FILE.temp" "$CTAGS_OPT_FILE" $CTAGS_ARGS "$CTAGS_ARG_LAST"
    133     else
    134         echo "$CTAGS_EXE -f \"$TAGS_FILE.temp\" $CTAGS_ARGS \"$CTAGS_ARG_LAST\""
    135         "$CTAGS_EXE" -f "$TAGS_FILE.temp" $CTAGS_ARGS "$CTAGS_ARG_LAST"
    136     fi
    137 else
    138     echo "Running ctags on \"$UPDATED_SOURCE\""
    139     if [ "$CTAGS_OPT_FILE" != "" ]; then
    140         echo "$CTAGS_EXE -f \"$TAGS_FILE.temp\" \"$CTAGS_OPT_FILE\" $CTAGS_ARGS --append \"$UPDATED_SOURCE\""
    141         "$CTAGS_EXE" -f "$TAGS_FILE.temp" "$CTAGS_OPT_FILE" $CTAGS_ARGS --append "$UPDATED_SOURCE"
    142     else
    143         echo "$CTAGS_EXE -f \"$TAGS_FILE.temp\" $CTAGS_ARGS --append \"$UPDATED_SOURCE\""
    144         "$CTAGS_EXE" -f "$TAGS_FILE.temp" $CTAGS_ARGS --append "$UPDATED_SOURCE"
    145     fi
    146 fi
    147 
    148 if [ "$POST_PROCESS_CMD" != "" ]; then
    149     echo "Running post process"
    150     echo "$POST_PROCESS_CMD \"$TAGS_FILE.temp\""
    151     $POST_PROCESS_CMD "$TAGS_FILE.temp"
    152 fi
    153 
    154 echo "Replacing tags file"
    155 echo "mv -f \"$TAGS_FILE.temp\" \"$TAGS_FILE\""
    156 if [ -f "$TAGS_FILE.temp" ]; then
    157     mv -f "$TAGS_FILE.temp" "$TAGS_FILE"
    158 fi
    159 
    160 echo "Unlocking tags file..."
    161 rm -f "$TAGS_FILE.lock"
    162 
    163 echo "Done."
    164 
    165 if [ $PAUSE_BEFORE_EXIT -eq 1 ]; then
    166     printf "Press ENTER to exit..."
    167     read -r
    168 fi