Ruby merge scriptje voor Subversion

Voor de liefhebbers als je niet steeds wilt taggen om de trunk in jouw branch te mergen. Draaien vanuit de root in je branch workfolder:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# find stored previous revision
previous_merged_revision= File.open("merged_with.txt",'r').readline.chop rescue nil
 
unless previous_merged_revision == nil
  trunk = "https://repos/trunk"
 
  #revision for current head, by querying svn repository and parsing result
  current_trunk_head_revision = `svn info #{trunk}`.split("\n")[4].delete("Revision: ")
  current_trunk_url_incl_revision = "#{trunk}@#{current_trunk_head_revision}"
  # do the merge and store the current head
  puts `svn merge #{previous_merged_revision} #{current_trunk_url_incl_revision} . `
  `echo #{current_trunk_url_incl_revision} > merged_with.txt`
else
  puts "no previous merge found"
end

Dit zijn voor het grootste deel gewoon shell commando's achter mekaar en zouden dus ook met een unix shell script of een batch file gedaan kunnen worden. Alleen voor het vinden van de revisie nummer van de actuele trunk moet je dan wat harder werken. Dit moet met svn info op de URL en dan krijg je zoiets als:

1
2
3
4
5
6
7
8
9
10
Path: .
URL: https://repos/trunk
Repository Root: https://repos
Repository UUID: 563624ef-ab15-0410-b9c3-ca43eba92057
Revision: 4148
Node Kind: directory
Schedule: normal
Last Changed Author: james
Last Changed Rev: 4147
Last Changed Date: 2008-03-19 16:47:23 +0100 (wo, 19 mrt 2008)

Ergens op de vijfde regel vind je het revisie nummer. Het opvragen en parsen kan in ruby in een regel.

1
current_trunk_head_revision = `svn info #{trunk}`.split("\n")[4].delete("Revision: ")

In eerste instantie wilden we dit proces met een ant script automatiseren, maar de svnant task kent geen svninfo en als je met ant de svn info wilt parsen zul je toch je eigen ant library in java moeten bouwen.