snippet - svn_grep.rb
From: Phlip <phlip2005_at_gmail.com>
Date: 2007-09-25 20:26:14 CEST
Rails and SVN aficionados:
My colleague wrote a lite Ruby wrapper on SVN --xml that helps those
The result is completely brute force, and does not exclude log entries
The code also comes with a prototypical unit test illustrating
--
Phlip
#!/usr/bin/env ruby
require 'optparse'
require 'rexml/document'
module SvnGrepModule
class SvnGrepper
def initialize(dir)
@svn = dir
end
def find(regex)
@found_revisions = []
regex = /#{regex}/
revisions.each do |revision|
found = %x[svn cat -r#{revision} #{@svn}].grep(regex)
if found.length > 0
puts "#{revision}: #{found}"
@found_revisions << revision
end
end
end
def revisions
doc = xml('log --xml')
log_entries = REXML::XPath.match(doc, '//logentry')
return log_entries.collect{ |log| log.attributes['revision'] }
end
def xml(command)
REXML::Document.new(%x[svn #{command} #{@svn}])
end
def current_revision
doc = xml('info --xml')
@current_revision = REXML::XPath.first(doc, '/info/entry/@revision').value
end
end
end
if ARGV.include?('test')
require 'test/unit'
require 'rubygems'
require 'mocha'
include SvnGrepModule
class SvnGrepperTest < Test::Unit::TestCase
def test_svn_grepper
svn = SvnGrepper.new('/home/wrecker/projects/ibenwrkinondarailroad/config/environment.rb')
svn.expects(:xml).returns REXML::Document.new("<?xml version='1.0'?>
<info>
<entry
kind='file'
revision='42'
path='/home/wrecker/projects/ibenwrkinondarailroad/config/environment.rb'>
<url>svn://repo/ibenwrkinondarailroad/config/environment.rb</url>
<repository>
<root>svn://repo</root>
<uuid>6f9af763-49f8-0310-a517-bcf8306575d7</uuid>
</repository>
<wc-info>
<schedule>normal</schedule>
<text-updated>2007-07-19T17:54:02.000000Z</text-updated>
<checksum>84ed977b7c0185aa70969675781e3d92</checksum>
</wc-info>
<commit revision='8902'>
<author>wrecker</author>
<date>2007-07-19T18:09:31.817664Z</date>
</commit>
</entry>
</info>")
assert_kind_of SvnGrepper, svn
assert_equal '42', svn.current_revision
svn.expects(:xml).returns REXML::Document.new('<?xml version="1.0"?>
<log>
<logentry
revision="8902">
<author>wrecker</author>
<date>2007-07-20T18:09:31.817663Z</date>
<msg>refactor thingy</msg>
</logentry>
<logentry
revision="8786">
<author>wrecker</author>
<date>2007-09-20T16:17:07.292212Z</date>
<msg>added test for daily_count</msg>
</logentry>
<logentry
revision="8730">
<author>wrecker</author>
<date>2007-09-19T20:25:47.765465Z</date>
<msg>refact-AAARRRR</msg>
</logentry>
<logentry
revision="8711">
<author>wrecker</author>
<date>2007-07-11T15:08:20.585929Z</date>
<msg>Adding yummy COUNTRY_HASH</msg>
</logentry>')
assert_equal 4, svn.revisions.length
# svn.find('DEBUG_LOGGER')
end
end
else
include SvnGrepModule
svn_dir = ARGV.shift
look_for = ARGV.shift
if File.directory?(svn_dir)
# TODO if it is a directory, recursively look at the files
else
SvnGrepper.new(svn_dir).find(look_for)
end
end
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@subversion.tigris.org
For additional commands, e-mail: users-help@subversion.tigris.org
Received on Tue Sep 25 20:26:40 2007
|
This is an archived mail posted to the Subversion Users mailing list.
This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.