svn-backup.php

Bruno Prado, 2010-01-12 17:02

Download (2.21 KB)

 
1
#!/usr/bin/php5 -q
2

    
3
<?php
4

    
5
// Requires PHP5 or the file_put_contents() function from PEAR::Compat
6

    
7
$source_dir = "/var/svn";           // this is a directory with my svn repositories in it
8
$dest_dir = "/mnt/server/DS/SVN"; // this is where the svn dumps will go
9
$tmp_dir = "/tmp";                   // temp dir
10
$hashfile = "/tmp/hash/hashes.txt";// we only back up repositories which have changed
11
$date = system("date +%Y-%m-%d");
12

    
13
// read in the existing hash file if there is one
14
$hashes = array();
15
$hashlines = array();
16
if (file_exists($hashfile)) {
17
  $hashlines = file($hashfile);                        
18
}
19

    
20
// build this into an useful array
21
foreach($hashlines as $hashline) {
22
  $key = substr($hashline,0,strpos($hashline,":"));
23
  $value = substr($hashline,strpos($hashline,":")+1);
24
  if ($key && $value) {
25
    $hashes[$key] = $value;                        
26
  }
27
}
28

    
29
system("mkdir $dest_dir/backup");
30
system("chmod 755 $dest_dir/backup");
31

    
32
// loop through the repositories in the source directory
33
if ($handle = opendir($source_dir)) {
34
  while (false !== ($file = readdir($handle))) {
35
    if (is_dir($source_dir."/".$file) && $file != "." && $file != "..") {
36
      // generate a md5 hash for the contents of the repository
37
      $command = "svnlook info '$source_dir/$file'";
38
      // echo $command."\n";
39
      exec($command,$output);
40
      $md5 = trim(md5(trim(str_replace("\n","-",implode("\n",$output)))));
41
      if (!isset($hashes[$file]) || $hashes[$file] !== $md5) {
42
        // echo "dumping $file\n";
43
        $return = system("mkdir -p $tmp_dir/svn_backup/$file");
44
        $return = system("svnadmin hotcopy $source_dir/$file $tmp_dir/svn_backup/$file");
45
        $return = system("svnadmin dump -q $tmp_dir/svn_backup/$file | bzip2 -c > $dest_dir/backup/$file.bz2");
46
        $return = system("rm -Rf $tmp_dir/svn_backup/$file");
47
        $hashes[$file] = $md5;
48
      }
49
    }
50
  }
51
  //Compress repositories dumped
52
  system("tar -cf $dest_dir/$date.tar $dest_dir/backup");
53
  system("rm -r $dest_dir/backup*");
54

    
55
  //Remove oldest backup
56
  system("find $dest_dir -amin +6000 -exec rm '{}'");
57

    
58
 closedir($handle);
59
}
60

    
61
$hashelines = "";
62
foreach($hashes as $key => $md5) {
63
  $hashelines .= "$key:$md5\n";
64
}
65

    
66
file_put_contents($hashfile, $hashelines);
67

    
68
?>