My dotfiles. Period.

update_tags.sh 4.2KB

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