From: Justin Collins Date: 2006-03-11T06:44:00+09:00 Subject: Re: svn pre-commit hook 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 = < To: #{recipients.join(',')} > From: SVN > 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