.git_helpers/ctags

changeset 180
96dbe6a6008d
child 187
84c6fa7ebc05
new file mode 100755
--- /dev/null
+++ b/.git_helpers/ctags
@@ -0,0 +1,39 @@
+#!/usr/bin/env ruby
+
+# Meant for use as a git hook:
+#   CTAGS_HOOK=1 .git/hooks/ctags &>/dev/null </dev/null &
+# or an aliased cmd on demand:
+#   git config alias.ctags '!.git/hooks/ctags'
+# or disable when you wish:
+#   CTAGS_SKIP=1 git rebase
+
+exit if ENV['CTAGS_SKIP']
+
+ctags  = "/opt/local/bin/ctags"
+ctags  = 'ctags' if !File.exists?(ctags)
+
+dir    = `git rev-parse --show-toplevel`.chomp
+
+conf   = "#{dir}/.git/ctags.conf"
+target = "#{dir}/.tags"
+tmp    = "#{dir}/#{$$}.tags"
+
+opts   = File.exists?(conf) ? "--options=#{conf}" : ''
+
+sleep 10 if ENV['CTAGS_HOOK']
+
+open( target, File::RDONLY|File::CREAT, 0644 ) do |f|
+  if ENV['CTAGS_HOOK']
+    exit unless f.flock( File::LOCK_EX|File::LOCK_NB )
+    exit unless ( Time.now - f.mtime ) > 60
+  end
+
+  system( <<-CMD ) or exit $?.exitstatus
+    git ls-files \
+     | #{ctags} --tag-relative -L - -f"#{tmp}" #{opts} \
+    && mv #{tmp} #{target}
+  CMD
+end
+
+
+

mercurial