Skip to content

Instantly share code, notes, and snippets.

@tominsam
Created December 17, 2010 10:06
Show Gist options
  • Save tominsam/744736 to your computer and use it in GitHub Desktop.
Save tominsam/744736 to your computer and use it in GitHub Desktop.
svn history dumping tool. Becaise I like to be able to browse commit histories very fast, and most nice gui tools insist on fetching them from the server only on demand. This is an ugly hack.
#!/usr/bin/env ruby
require 'rubygems'
require 'xmlsimple'
require 'fileutils'
info = XmlSimple.xml_in(`svn info --xml`, "ForceArray" => false)
root = info['entry']['url']
revision = info["entry"]["commit"]["revision"].to_i
if ARGV.size > 0
revision = ARGV[0].to_i
end
puts "repository #{root}"
file_root = "./history"
if !File.directory?(file_root)
FileUtils.mkdir(file_root)
end
while revision > 0
puts " #{revision}"
log = XmlSimple.xml_in(`svn log -r#{revision} --xml`, "ForceArray" => false)
if !log["logentry"]
revision -= 1
next
end
author = log["logentry"]["author"]
date = log["logentry"]["date"][0..18].gsub(/[:\-]/,'-')
msg = ( log["logentry"]["msg"].to_s.split(/\n/)[0] || "" ).gsub(/[^A-Za-z0-9\s\.\,\-:;=+]/,'').gsub(/\s+/,"_")[0,100]
filename = File.join(file_root, "r#{revision} #{date} #{author} #{msg}.diff")
puts " => #{filename}"
if File.exists?( filename )
puts "found existing file. Stopping."
break
end
File.open(filename, "w") do |f|
f.puts "*** r#{revision} #{author} ***"
f.puts log["logentry"]["date"]
f.puts ""
f.puts log["logentry"]["msg"]
f.puts ""
f.puts `svn diff -r#{revision-1}:#{revision}`
end
revision -= 1
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment