Random Sequence

This is the script I use to copy my Subversion repositories to a backup server. Each repository is checked for changes before doing the export.

Sponsored Links:

SVN Backup Script

How to Use

  1. Download the script below
  2. Make the script execuatable: chmod +x svn-backup.php
  3. Set the 4 configuration variables at the top: $source_dir, $dest_dir, $tmp_dir & $hashfile
  4. Run the script: ./svn-backup.php

Download

svn-backup.php.zip (1 KB)

!/usr/bin/php5 -q

<?php // Requires PHP5 or the file_put_contents() function from PEAR::Compat

$source_dir = "/usr/local/svn";             // this is a directory with my svn repositories in it
$dest_dir = "/mnt/backup/svn";              // this is where the svn dumps will go
$tmp_dir = "/usr/local/tmp";                // temp dir
$hashfile = "/mnt/backup/svn/hashes.txt";   // we only back up repositories which have changed

// read in the existing hash file if there is one
$hashes = array();
$hashlines = array();
if (file_exists($hashfile)) {
    $hashlines = file($hashfile);           
}
// build this into a useful array
foreach($hashlines as $hashline) {
    $key = substr($hashline,0,strpos($hashline,":"));
    $value = substr($hashline,strpos($hashline,":")+1);
    if ($key && $value) {
        $hashes[$key] = $value;         
    }
}

// loop thorugh the repositories in the source directory
if ($handle = opendir($source_dir)) {
   while (false !== ($file = readdir($handle))) {
       if (is_dir($source_dir."/".$file) && $file != "." && $file != "..") {
            // generate an md5 hash for the contents of the repository
            $command = "svnlook info '$source_dir/$file'";
            // echo $command."\n";
            exec($command,$output);
            $md5 = trim(md5(trim(str_replace("\n","-",implode("\n",$output)))));
            if (!isset($hashes[$file]) || $hashes[$file] !== $md5) {
            // echo "dumping $file\n";
            $return = system("mkdir -p $tmp_dir/svn_backup/$file");     
            $return = system("svnadmin hotcopy $source_dir/$file $tmp_dir/svn_backup/$file");       
            $return = system("svnadmin dump -q $tmp_dir/svn_backup/$file | bzip2 -c > $dest_dir/$file.bz2");        
            $return = system("rm -Rf $tmp_dir/svn_backup/$file");                                               
            $hashes[$file] = $md5;
            }
       }
   }
   closedir($handle);
}   

$hashelines = "";
foreach($hashes as $key => $md5) {
    $hashelines .= "$key:$md5\n";
}

file_put_contents($hashfile,$hashelines);

?>

Sponsored Links: