Subversion backup script untuk Windows
Posted on May 15th, 2006 | by Endy Muhardin |Dulu saya pernah menulis tentang cara backup repository Subversion secara otomatis. Tetapi, script yang ada di situ hanya bisa dijalankan di Linux, karena ada satu baris bermasalah pada Perl scriptnya, yaitu:
$next_backup_file = "daily-incremental-backup." . `date +%Y%m%d`;
Baris di atas akan menjalankan perintah operating system seakan-akan kita menjalankan perintah ini di command prompt:
$ date +%Y%m%d
Di Linux, perintah ini berjalan lancar, menampilkan output sebagai berikut:
20060515
Output tersebut nantinya digunakan untuk membentuk nama file dump. Tetapi di Windows, hasilnya adalah:
The system cannot accept the date entered .. blablabla
Rupanya Windows mengira kita akan ganti tanggal komputer.
Jadi akhirnya, karena saya tidak mengerti Perl, saya membuat backup script baru dengan Ruby. Logika yang sama, alur program yang sama, cuma beda bahasa. Inilah hasilnya. Silahkan digunakan dan dimodifikasi sesuai kebutuhan.
svn-weekly-backup.rb
# Full Backup script for Subversion Repository #
require 'date'
# 1. Initialize variables
backup_folder = "c:/Backup"
repo_folder = "c:/Repository/Imagine"
youngest = `svnlook youngest #{repo_folder}`.strip
next_backup_file = "weekly-full-backup.#{Time.now.strftime("%Y%m%d")}.dmp"
compress_script = backup_folder+"/compress-"+youngest+".tzs"
compress_command = "C:/Program Files/TUGZip/TzScript.exe #{compress_script}"
# 2. Perform backup
puts "Backing up to revision #{youngest}\n";
result = `svnadmin dump #{repo_folder} > #{backup_folder}/#{next_backup_file}`
# 3. Compress backup result
# 3.1 Creating temporary zip script [TugZip Required]
puts “Generating compress script …\n”;
tzs_file = < <-TZS
function main()
{
var Comp = new Compress();
Comp.Archive = "#{backup_folder}/#{next_backup_file}.zip";
Comp.Type = "ZIP";
Comp.Compression = 3;
Comp.WorkingDir = "#{backup_folder}";
Comp.Data = "#{next_backup_file}";
Comp.Password = "";
Comp.DateExtension = 0;
Comp.TimeExtension = 0;
Comp.Overwrite = 1;
Comp.Recurse = 0;
Comp.StoreFolderNames = 1;
Comp.IncludeHiddenFiles = 1;
Comp.DoCompress();
}
TZS
File.open(compress_script, "w") do | file |
file << tzs_file
end
# 3.2. Executing compression
puts "Compressing dump file...\n";
puts `#{compress_command}`
# 3.3. Deleting temporary zip script
puts "Deleting compress script ...\n";
File.delete(compress_script);
# 3.4 Deleting uncompressed dump file
puts "Deleting uncompressed dump file ...\n";
File.delete(backup_folder+"/"+next_backup_file);
# 4. Write last backup position to marker file
File.open(backup_folder+"/last_backed_up", "w") do | file |
file << youngest
end
svn-daily-backup.rb
# Full Backup script for Subversion Repository #
require 'date'
# 1. Initialize variables
backup_folder = "c:/Backup"
repo_folder = "c:/Repository/Imagine"
youngest = `svnlook youngest #{repo_folder}`.strip
next_backup_file = "daily-incremental-backup.#{Time.now.strftime("%Y%m%d")}.dmp"
compress_script = backup_folder+"/compress-"+youngest+".tzs"
compress_command = "C:/Program Files/TUGZip/TzScript.exe #{compress_script}"
# 1.a. Get last backed up revision
last_backup = 0;
if File.exist?(backup_folder+"/last_backed_up")
File.open(backup_folder+"/last_backed_up", "r") do | file |
while line = file.gets
last_backup = line.strip.to_i
end
end
end
# 2. Perform backup
if last_backup == youngest.to_i
puts "No new revision since last backup .. exiting"
exit 0;
end
start_backup = last_backup + 1
puts "Backing up from revision #{last_backup} to revision #{youngest}\n";
result = `svnadmin dump --incremental --revision #{last_backup}:#{youngest} #{repo_folder} > #{backup_folder}/#{next_backup_file}`
# 3. Compress backup result
# 3.1 Creating temporary zip script [TugZip Required]
puts “Generating compress script …\n”;
tzs_file = < <-TZS
function main()
{
var Comp = new Compress();
Comp.Archive = "#{backup_folder}/#{next_backup_file}.zip";
Comp.Type = "ZIP";
Comp.Compression = 3;
Comp.WorkingDir = "#{backup_folder}";
Comp.Data = "#{next_backup_file}";
Comp.Password = "";
Comp.DateExtension = 0;
Comp.TimeExtension = 0;
Comp.Overwrite = 1;
Comp.Recurse = 0;
Comp.StoreFolderNames = 1;
Comp.IncludeHiddenFiles = 1;
Comp.DoCompress();
}
TZS
File.open(compress_script, "w") do | file |
file << tzs_file
end
# 3.2. Executing compression
puts "Compressing dump file...\n";
puts `#{compress_command}`
# 3.3. Deleting temporary zip script
puts "Deleting compress script ...\n";
File.delete(compress_script);
# 3.4 Deleting uncompressed dump file
puts "Deleting uncompressed dump file ...\n";
File.delete(backup_folder+"/"+next_backup_file);
# 4. Write last backup position to marker file
File.open(backup_folder+"/last_backed_up", "w") do | file |
file << youngest
end
Langkah terakhir, buat bat script sederhana untuk mengeksekusi script ruby ini. Dengan adanya bat script, kita bisa dengan mudah menambahkan entri di Windows Scheduler untuk dijalankan secara otomatis dan terjadwal.
svn-weekly-backup.bat
ruby C:\Backup\svn-weekly-backup.rb
daily-full-backup.bat
ruby C:\Backup\svn-daily-backup.rb
Terakhir, buat folder c:\Backup dan letakkan file-file berikut dalam folder tersebut:
- svn-weekly-backup.rb
- svn-daily-backup.rb
- svn-weekly-backup.bat
- svn-daily-backup.bat
Sistem backup Anda siap digunakan.
Buat yang malas copy-paste, silahkan download keempat file tersebut [tar.bz2 | 1.4 KB].
Perhatian: Untuk menjalankan kode ini dengan baik, Anda harus menginstal aplikasi TugZIP. Ini dibutuhkan untuk mengkompres file hasil dump. Buat yang lebih suka WinZip, WinRAR, atau aplikasi kompresi yang lain, silahkan memikirkan cara memanggilnya dari command prompt dan memodifikasi kode program di atas, yaitu bagian #3: Compress Backup Result.
Selain itu, Anda juga harus menginstal bahasa pemrograman Ruby. Installernya bisa didownload di sini.
Selamat menggunakan, semoga bermanfaat ![]()
7 Responses to “Subversion backup script untuk Windows”
By Benny Regardho on May 19, 2006 | Reply
Bang, script ente berantakan tuh. overflow horizontal kemana-mana. ane browsing blog ente pake opera 9.0 dan sometimes firefox 1.5 tapi tetep aja overflow.
sepertinya template ente yang baru ini tidak kompatible dengan tag-tag yang ente gunakan (khususnya tag code dan tag pre). Masih lebih rapi template yang dulu.
Coba di edit aja css-nya terus modif tag code dan pre.
sebagai referensi, berikut ini rembesan css ane:
code {
font: 11px ‘Courier New’, Courier, Fixed;
background: #EEEEEE;
width: 430px;
text-align: left;
}
pre {
font: 11px ‘Courier New’, Courier, Fixed;
background: #EEEEEE;
width: 430px;
overflow: auto;
text-align: left;
padding: 10px;
}
pre code {
border: 0;
}
By Endy Muhardin on May 22, 2006 | Reply
Ok bos, sudah gw perbaiki.

Thx for masukannya
By Benny Regardho on May 22, 2006 | Reply
nah sekarang udah rapi nih blog bang endy. bahasa jawa nya udah gak bleber lagi kemana-mana.
sip deh.
By adi on May 24, 2006 | Reply
Bung endy,
saya punya batch script kayak gini .. dan bisa di windows,
mungkin bisa dicoba.
set tahun=%DATE:~10,4%
set bulan=%DATE:~4,2%
set tanggal=%DATE:~7,2%
echo %tahun%%bulan%%tanggal%
By Endy Muhardin on Jul 31, 2006 | Reply
Mas Adi .. terima kasih atas sarannya.
Nanti kapan2 mau bikin *.bat script lagi akan saya gunakan.
Sementara ini mau pakai yang Ruby saja
By Don Lapre Zach on Feb 2, 2007 | Reply
I will be very grateful if you tell me about this language! What is this???!
Don Lapre Zach
webmaster@linuxrocks.org
http://www.linuxrocks.org