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