Backup 2

Subversion のバックアップ、その 2。」

フルバックアップ用と差分バックアップ用を一本化。latest があれば差分、なければフルで動作する。運用としては、これを毎日走らせておき、時々 latest を消すように cron を書くことを想定。

--- (svnbackup.rb)
#!/usr/local/bin/ruby

require 'pathname'

# パラメーターが足らなければ終了。
if ARGV.size < 2
  puts <<EOS
USAGE :
ruby svnbackup <repository> <backup directory>
EOS
  exit
end

# 準備
repository  = Pathname.new ARGV[0]
base_dir    = Pathname.new ARGV[1]
mark_file   = base_dir + 'latest'
latest      = 0
latest      = mark_file.read.to_i if mark_file.exist?
youngest    = `svnlook youngest #{repository}`.to_i

# バックアップ済みなら終了。
exit if latest == youngest

# ダンプ
if latest == 0
  dump_option = "--revision #{latest}:#{youngest}"
else
  latest += 1
  dump_option = "--revision #{latest}:#{youngest} --incremental"
end

dump_name = base_dir + "dump_#{latest}_#{youngest}.bak"
`svnadmin dump #{repository} #{dump_option} > #{dump_name}`

# マーキング
mark_file.open("w") {|file| file.print youngest }