musaic
1/1/2009 - 4:44 PM

A script for generating TAGS from a git hook.

A script for generating TAGS from a git hook.

#!/usr/bin/ruby
#-*-ruby-*-
# A script to run ctags on all .rb files in a project. Can be run on
# the current dir, called from a git callback, or install itself as a
# git post-merge and post-commit callback.

CTAGS = '/opt/local/bin/ctags'
HOOKS = %w{ post-merge post-commit post-checkout }
HOOKS_DIR = '.git/hooks'

def install
  if !File.writable?(HOOKS_DIR)
    $stderr.print "The install option [-i] can only be used within a git repo; exiting.\n"
    exit 1
  end
  
  HOOKS.each { |hook| install_hook("#{HOOKS_DIR}/#{hook}") }
end

def run_tags(dir, run_in_background = false)
  if File.executable?(CTAGS) and File.writable?(dir)
    cmd = "find #{dir} -name \\\*.rb | #{CTAGS} -e -f #{dir}/TAGS -L - 2>>/dev/null "
    cmd << '&' if run_in_background
    #$stderr.print "calling #{cmd}\n"
    system cmd
  else
    $stderr.print "FAILED to write TAGS file to #{dir}\n"
  end
end

def install_hook(hook)
  if File.exists?(hook)
    $stderr.print "A file already exists at #{hook}, and will NOT be replaced.\n"
    return
  end
  
  print "Linking #{__FILE__} to #{hook}\n"
  %x{ln -s #{__FILE__}  #{hook}}
end

if ARGV.first == '-i'
  install
else
  run_tags Dir.pwd, HOOKS.include?(File.basename(__FILE__))
end