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 + + +