My dotfiles. Period.

update_tags.cmd 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. @echo off
  2. setlocal EnableExtensions EnableDelayedExpansion
  3. rem ==========================================
  4. rem PARSE ARGUMENTS
  5. rem ==========================================
  6. set CTAGS_EXE=ctags
  7. set CTAGS_ARGS=
  8. set TAGS_FILE=tags
  9. set PROJECT_ROOT=
  10. set FILE_LIST_CMD=
  11. set FILE_LIST_CMD_IS_ABSOLUTE=0
  12. set UPDATED_SOURCE=
  13. set POST_PROCESS_CMD=
  14. set PAUSE_BEFORE_EXIT=0
  15. set LOG_FILE=
  16. :ParseArgs
  17. if [%1]==[] goto :DoneParseArgs
  18. if [%1]==[-e] (
  19. set CTAGS_EXE=%~2
  20. shift
  21. goto :LoopParseArgs
  22. )
  23. if [%1]==[-x] (
  24. set CTAGS_ARGS=%CTAGS_ARGS% --exclude=%2
  25. shift
  26. goto :LoopParseArgs
  27. )
  28. if [%1]==[-t] (
  29. set TAGS_FILE=%~2
  30. shift
  31. goto :LoopParseArgs
  32. )
  33. if [%1]==[-p] (
  34. set PROJECT_ROOT=%~2
  35. shift
  36. goto :LoopParseArgs
  37. )
  38. if [%1]==[-L] (
  39. set FILE_LIST_CMD=%~2
  40. shift
  41. goto :LoopParseArgs
  42. )
  43. if [%1]==[-A] (
  44. set FILE_LIST_CMD_IS_ABSOLUTE=1
  45. goto :LoopParseArgs
  46. )
  47. if [%1]==[-s] (
  48. set UPDATED_SOURCE=%~2
  49. shift
  50. goto :LoopParseArgs
  51. )
  52. if [%1]==[-c] (
  53. set PAUSE_BEFORE_EXIT=1
  54. goto :LoopParseArgs
  55. )
  56. if [%1]==[-l] (
  57. set LOG_FILE=%~2
  58. shift
  59. goto :LoopParseArgs
  60. )
  61. if [%1]==[-o] (
  62. set CTAGS_ARGS=%CTAGS_ARGS% --options=%2
  63. shift
  64. goto :LoopParseArgs
  65. )
  66. if [%1]==[-O] (
  67. set CTAGS_ARGS=%CTAGS_ARGS% %~2
  68. shift
  69. goto :LoopParseArgs
  70. )
  71. if [%1]==[-P] (
  72. set POST_PROCESS_CMD=%~2
  73. shift
  74. goto :LoopParseArgs
  75. )
  76. echo Invalid Argument: %1
  77. goto :Usage
  78. :LoopParseArgs
  79. shift
  80. goto :ParseArgs
  81. :DoneParseArgs
  82. rem ==========================================
  83. rem GENERATE TAGS
  84. rem ==========================================
  85. if [%LOG_FILE%]==[] set LOG_FILE=CON
  86. echo Locking tags file... > %LOG_FILE%
  87. echo locked > "%TAGS_FILE%.lock"
  88. set INDEX_WHOLE_PROJECT=1
  89. if exist "%TAGS_FILE%" (
  90. if not ["%UPDATED_SOURCE%"]==[""] (
  91. echo Removing references to: %UPDATED_SOURCE% >> %LOG_FILE%
  92. echo findstr /V /C:"%UPDATED_SOURCE%" "%TAGS_FILE%" ^> "%TAGS_FILE%.temp" >> %LOG_FILE%
  93. findstr /V /C:"%UPDATED_SOURCE%" "%TAGS_FILE%" > "%TAGS_FILE%.temp"
  94. set CTAGS_ARGS=%CTAGS_ARGS% --append "%UPDATED_SOURCE%"
  95. set INDEX_WHOLE_PROJECT=0
  96. )
  97. )
  98. if ["%INDEX_WHOLE_PROJECT%"]==["1"] (
  99. if not ["%FILE_LIST_CMD%"]==[""] (
  100. echo Running file list command >> %LOG_FILE%
  101. set use_raw_list=0
  102. if ["%PROJECT_ROOT%"]==["."] set use_raw_list=1
  103. if ["%FILE_LIST_CMD_IS_ABSOLUTE%"]==["1"] set use_raw_list=1
  104. rem No idea why we need to use delayed expansion here to make it work :(
  105. if ["!use_raw_list!"]==["1"] (
  106. echo call %FILE_LIST_CMD% ^> %TAGS_FILE%.files >> %LOG_FILE%
  107. call %FILE_LIST_CMD% > %TAGS_FILE%.files
  108. ) else (
  109. rem Potentially useful:
  110. rem http://stackoverflow.com/questions/9749071/cmd-iterate-stdin-piped-from-another-command
  111. echo call %FILE_LIST_CMD% -- with loop for prepending project root >> %LOG_FILE%
  112. type NUL > %TAGS_FILE%.files
  113. for /F "usebackq delims=" %%F in (`%FILE_LIST_CMD%`) do @echo %PROJECT_ROOT%\%%F >> %TAGS_FILE%.files
  114. )
  115. set CTAGS_ARGS=%CTAGS_ARGS% -L %TAGS_FILE%.files
  116. ) else (
  117. set CTAGS_ARGS=%CTAGS_ARGS% "%PROJECT_ROOT%"
  118. )
  119. )
  120. echo Running ctags >> %LOG_FILE%
  121. echo call "%CTAGS_EXE%" -f "%TAGS_FILE%.temp" %CTAGS_ARGS% >> %LOG_FILE%
  122. call "%CTAGS_EXE%" -f "%TAGS_FILE%.temp" %CTAGS_ARGS% >> %LOG_FILE% 2>&1
  123. if ERRORLEVEL 1 (
  124. echo ERROR: Ctags executable returned non-zero code. >> %LOG_FILE%
  125. goto :Unlock
  126. )
  127. if not ["%POST_PROCESS_CMD%"]==[""] (
  128. echo Running post process >> %LOG_FILE%
  129. echo call %POST_PROCESS_CMD% %TAGS_FILE%.temp >> %LOG_FILE%
  130. call %POST_PROCESS_CMD% %TAGS_FILE%.temp >> %LOG_FILE% 2>&1
  131. if ERRORLEVEL 1 (
  132. echo ERROR: Post process returned non-zero code. >> %LOG_FILE%
  133. goto :Unlock
  134. )
  135. )
  136. echo Replacing tags file >> %LOG_FILE%
  137. echo move /Y "%TAGS_FILE%.temp" "%TAGS_FILE%" >> %LOG_FILE%
  138. move /Y "%TAGS_FILE%.temp" "%TAGS_FILE%" >> %LOG_FILE% 2>&1
  139. if ERRORLEVEL 1 (
  140. echo ERROR: Unable to rename temp tags file into actual tags file. >> %LOG_FILE%
  141. goto :Unlock
  142. )
  143. :Unlock
  144. echo Unlocking tags file... >> %LOG_FILE%
  145. del /F "%TAGS_FILE%.files" "%TAGS_FILE%.lock"
  146. if ERRORLEVEL 1 (
  147. echo ERROR: Unable to remove file lock. >> %LOG_FILE%
  148. )
  149. echo Done. >> %LOG_FILE%
  150. if [%PAUSE_BEFORE_EXIT%]==[1] (
  151. pause
  152. )
  153. goto :EOF
  154. rem ==========================================
  155. rem USAGE
  156. rem ==========================================
  157. :Usage
  158. echo Usage:
  159. echo %~n0 ^<options^>
  160. echo.
  161. echo -e [exe=ctags]: The ctags executable to run
  162. echo -t [file=tags]: The path to the ctags file to update
  163. echo -p [dir=]: The path to the project root
  164. echo -L [cmd=]: The file list command to run
  165. echo -A: Specifies that the file list command returns
  166. echo absolute paths
  167. echo -s [file=]: The path to the source file that needs updating
  168. echo -l [log=]: The log file to output to
  169. echo -o [options=]: An options file to read additional options from
  170. echo -c: Ask for confirmation before exiting
  171. echo.