Bil Kleb wrote:
OK, I give up.
Can someone (Kou?) please sketch out how to intercept
a Subversion transaction with a pre-commit hook and
throw each file matching, say, /\.rb$/ to some StyleChecker?
Based on Kou's svnlook,
https://svn.collab.net/repos/svn/trunk/tools/examples/svnlook.rb
and the bindings,
http://svn.collab.net/repos/svn/trunk/subversion/bindings/swig/ruby/svn/
it seems that Svn:Fs might be the answer, but I'm having
trouble figuring out SVN transactions -- the manual says
very little about these creatures.
Thanks,
--
Bil
http://fun3d.larc.nasa.gov
I don't know about pre-commit hooks, but here's a post-commit hook I wrote the other day. Not fancy or anything, but will maybe give you an idea?
I just used the normal 'svnlook'.
#!/usr/bin/env ruby
require 'net/smtp'
if ARGV.length != 2
puts "Usage: post-commit [repos] [revision]"
end
def parse_changed(change_list)
added = Array.new
modified = Array.new
deleted = Array.new
other = Array.new
change_list = change_list.split("\n")
change_list.each { |changed|
#changed file/dir is preceded by U/D/A
mod = changed[0, 1]
case mod
when 'U'
modified << changed[1..-1]
when 'A'
added << changed[1..-1]
when 'D'
deleted << changed[1..-1]
else
other << changed
end
}
change_string = String.new
if not added.empty?
change_string << "Added:\n" << added.join("\n") << "\n"
end
if not modified.empty?
change_string << "Modified:\n" << modified.join("\n") << "\n"
end
if not deleted.empty?
change_string << "Deleted:\n" << deleted.join("\n") << "\n"
end
if not other.empty?
change_string << "Other:\n" << other.join("\n") << "\n"
end
return change_string
end
recipients = ['fake@fake.com']
repository = ARGV[0]
revision = ARGV[1]
author = `svnlook author #{repository} --revision #{revision}`.chomp.capitalize
date = `svnlook date #{repository} --revision #{revision}`.chomp
changed = parse_changed(`svnlook changed #{repository} --revision #{revision}`.chomp)
diff = `svnlook diff #{repository} --revision #{revision} --no-diff-deleted`
log = `svnlook log #{repository} --revision #{revision}`
message = <<END_OF_MESSAGE
To: #{recipients.join(',')}
From: SVN <svn@host.net>
Subject: SVN Commit: Revision #{revision} by #{author}
Author: #{author}
Date: #{date}
Revision: #{revision}
#{changed}
Log Message:
#{log}
#{diff}
END_OF_MESSAGE
if $DEBUG
puts message
exit
end
Net::SMTP.start('smtp.host.net', 25, 'host.net', 'fake@fake.net', 'password') { |smtp|
smtp.send_message(message, 'fake@fake.net', recipients)
}
-Justin