#!/usr/bin/ruby -w BASECAMP_URL = 'myurl.clientsection.com' BASECAMP_USER = '' BASECAMP_PASSWORD = '' BASECAMP_MESSAGE_CATEGORY = '' BASECAMP_COMPANY_NAME = '' BASECAMP_PROJECT_NAME = '' SHOW_CODE_CHANGES = true LOG_PREPEND = '\n-{2}' begin require 'basecamp' rescue LoadError %x{echo "repo:#{ARGV[0]} rev: #{ARGV[1]}" > /tmp/svn-hooks.log} %x{echo "Error: #{$!} trace:#{caller}" >> /tmp/svn-hooks.log} end def swap_word(abr) case abr when 85 "Updated" when 65 "Added" when 68 "Deleted" end end def gather_and_post(repo_path, revision) svnlook = '/usr/local/bin/svnlook' commit_author = `#{svnlook} author #{repo_path} -r #{revision}`.chop commit_log = `#{svnlook} log #{repo_path} -r #{revision}` commit_diff = `#{svnlook} diff #{repo_path} -r #{revision}` commit_date = `#{svnlook} date #{repo_path} -r #{revision}` commit_changed = `#{svnlook} changed #{repo_path} -r #{revision}` message_title = 'Rev. ' + revision.to_s + ' [' + commit_log.split(/\n/)[0].gsub(/-/,'').strip.capitalize + ']' if message_title.length > 127 message_title = message_title[0..127] message_title += '' end commit_log_textilized = '' commit_log.split(%r{#{LOG_PREPEND}}).collect do |log_item| commit_log_textilized << "* #{log_item.gsub(/-/,'').gsub(/\n/,'
').capitalize}\n" end commit_changed_textilized = '' commit_changed.each do |line| matches = line.match(/^\w\s+(.*)/) file_status = swap_word(matches[0][0]) commit_changed_textilized << "* *#{file_status}:* #{matches[1]}\n" end if SHOW_CODE_CHANGES message_body = <<-END_MSG h2. Summary: #{commit_log_textilized} h2. Changed files: #{commit_changed_textilized} END_MSG else message_body = <<-END_MSG h2. Summary: #{commit_log_textilized} END_MSG end session = Basecamp.new(BASECAMP_URL,BASECAMP_USER,BASECAMP_PASSWORD) return unless session basecamp_project = session.projects.find do |bc_project| (bc_project['company']['name'] =~ %r{#{Regexp.escape BASECAMP_COMPANY_NAME}}i) && (bc_project['name'] =~ %r{#{Regexp.escape BASECAMP_PROJECT_NAME}}i) end if basecamp_project basecamp_category = session.message_categories(basecamp_project['id']).find do |bc_category| bc_category['name'] == BASECAMP_MESSAGE_CATEGORY end if basecamp_category msg = session.post_message(basecamp_project['id'], {:title => message_title, :body => message_body, :category_id => basecamp_category['id'], :use_textile => 1}) end end end #Log the repo passed in to test the file begin gather_and_post(ARGV[0], ARGV[1]) rescue %x{echo "repo:#{ARGV[0]} rev: #{ARGV[1]}" > /tmp/svn-hooks.log} %x{echo "Error: #{$!} trace:#{caller}" >> /tmp/svn-hooks.log} end