# # test = DRbObject.new(nil, 'druby://localhost:8887') # test.on_create('subversion', 'breakout', 'bigSecret') # class name, repository name, secret key # test.on_create('subversion', 'breakout') require "zlib" require 'control_tool' require File.dirname(__FILE__) + "/minitar" class Subversion < ControlTool include Archive::Tar SUBVERSION = 'subversion' attr_accessor :template_dir def prepare_template puts "Creating subversion template" dest_dir = template_dir options = "--fs-type fsfs" cmd = "/usr/bin/svnadmin create #{options} #{dest_dir}" run(cmd) ln_sf("/u/apps/breakout/current/script/svn_hook", "#{dest_dir}/hooks/post-commit") end def on_create(settings) # --fs-type fsfs or --fs-type bdb repository_name = settings['project_url'] dest_dir = dest_dir(repository_name) raise StandardError.new("SVN: destination directory exists") if FileTest.directory?(dest_dir) if settings["svn_archive_file"] tar_gz_path = File.join(tmp_dir, settings["svn_archive_file"]) if test(?f, tar_gz_path) extract_tar_gz(tar_gz_path, dest_dir) else raise StandardError.new("SVN: archive file does not exists") end else src_dir = template_dir if settings["copy_vcs_from"] src_dir = dest_dir(settings["copy_vcs_from"]) end cp_r(src_dir, dest_dir) end raise StandardError.new("SVN: failed to init repository") unless FileTest.directory?(dest_dir) create_breakout_ini(dest_dir, settings) url(repository_name) end def on_destroy(repository_name, suffix = nil) backup_dir = $config['backup_dir'] + '/svn' Dir.mkdir(backup_dir) unless FileTest.directory?(backup_dir) dir = fix_project_name(repository_name) + suffix # fileutils#mv fail to move dirs from nfs that countains symlink run("mv #{dest_dir(repository_name)} #{File.join(backup_dir, dir)}") end def dest_dir(repository_name) File.expand_path(File.join(repositories_dir, fix_project_name(repository_name))) end alias vcs_dir dest_dir def url(svn_dir) 'http://' + ($config[SUBVERSION]['host'] || $config['server']) + $config[SUBVERSION]['base_url'] + '/' + svn_dir end def repositories_dir $config[SUBVERSION]['base_dir'] end def disk_space(settings) dir = dest_dir(settings['dir_name']) dir_disk_space(dir) end def rename_dir(old_name, new_name) File.rename dest_dir(old_name), dest_dir(new_name) if test(?d, dest_dir(old_name)) end # Extract repository from tar.gz file def extract_tar_gz(tar_gz_path, dest_dir) tgz = Zlib::GzipReader.new(File.open(tar_gz_path)) Minitar::Input.open(tgz) do |io| io.each do |entry| parts = entry.full_name.split '/' # remove dir parts[0] = dest_dir file_path = parts.join('/') if entry.directory? mkdir_p file_path unless test(?d, file_path) next end io.extract_entry(File.dirname(file_path), entry) end end end # Create a repository tar.gz backup in tmp directory # Returns: file name def create_backup(repository_name) dest_dir = dest_dir(repository_name) raise StandardError.new("SVN: repository dir does not exist") unless test(?d, dest_dir) repo_dir = File.basename dest_dir out_file = "%s_%d_%d.tar.gz" % [repo_dir, Time.now.to_i, rand(10000)] if run("#{TAR} czf #{File.join(tmp_dir, out_file)} -C #{repositories_dir} #{repo_dir}") return out_file else raise StandardError.new("SVN: failed to create repo archive") end end end