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