#!/usr/bin/env python
#
#  hot-backup.py: perform a "hot" backup of a Berkeley DB repository.
#
#  Subversion is a tool for revision control.
#  See http://subversion.tigris.org for more information.
#
# ====================================================================
# Copyright (c) 2000-2001 CollabNet.  All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution.  The terms
# are also available at http://subversion.tigris.org/license-1.html.
# If newer versions of this license are posted there, you may use a
# newer version instead, at your option.
#
######################################################################

import os, shutil, string

######################################################################
# Global Settings

# Path to repository
db_dir = "/usr/www/repositories/svn"

# Where to store the repository backup.  The backup will be placed in
# a *subdirectory* of this location, named after the youngest
# revision.
backup_dir = "/usr/backup"

# Path to svnadmin utility
svnadmin = "/usr/local/bin/svnadmin"

# Path to db_archive program
db_archive = "/usr/local/BerkeleyDB.3.3/bin/db_archive"

######################################################################

print "Beginning hot backup of '"+ db_dir + "'."

# Step 1:  get the youngest revision.

infile, outfile, errfile = os.popen3(svnadmin + " youngest " + db_dir)
stdout_lines = outfile.readlines()
stderr_lines = errfile.readlines()
outfile.close()
infile.close()
errfile.close()

youngest = string.strip(stdout_lines[0])
print "Youngest revision is", youngest


# Step 2:  copy the whole repository structure.

backup_subdir = os.path.join(backup_dir, "repo-bkp-" + youngest)
print "Backing up repository to '" + backup_subdir + "'..."
shutil.copytree(db_dir, backup_subdir)
print "Done."


# Step 3:  re-copy the logfiles.  They must *always* be copied last.

infile, outfile, errfile = os.popen3(db_archive + " -l -h "
                                     + os.path.join(db_dir, "db"))
stdout_lines = outfile.readlines()
stderr_lines = errfile.readlines()
outfile.close()
infile.close()
errfile.close()

for item in stdout_lines:
  logfile = string.strip(item)
  src = os.path.join(db_dir, "db", logfile)
  dst = os.path.join(backup_subdir, "db", logfile)
  print "Re-copying logfile '" + logfile + "'..."
  shutil.copy(src, dst)

print "Backup completed."

@@ -87,16 +87,83 @@
 sitory.%0A
+#                 (and clean old logfiles after backup completes.)%0A
 #%0A#  Sub
@@ -710,16 +710,282 @@
 tion.%0A#%0A
+# This software consists of voluntary contributions made by many%0A# individuals.  For exact contribution history, see the revision%0A# history and logs, available at http://subversion.tigris.org/.%0A# ====================================================================%0A%0A
 ########
@@ -2523,16 +2523,46 @@
 lose()%0A%0A
+print %22Re-copying logfiles:%22%0A%0A
 for item
@@ -2710,24 +2710,27 @@
 e)%0A  print %22
+   
 Re-copying l
@@ -2809,8 +2809,485 @@
 leted.%22%0A
+%0A%0A# Step 4:  ask db_archive which logfiles can be expunged.%0A%0Ainfile, outfile, errfile = os.popen3(db_archive + %22 -a -h %22%0A                                     + os.path.join(db_dir, %22db%22))%0Astdout_lines = outfile.readlines()%0Astderr_lines = errfile.readlines()%0Aoutfile.close()%0Ainfile.close()%0Aerrfile.close()%0A%0Aprint %22Cleaning obsolete logfiles:%22%0A%0Afor item in stdout_lines:%0A  logfile = string.strip(item)%0A  print %22   Deleting '%22, logfile, %22'...%22%0A  os.unlink(logfile)%0A%0Aprint %22Done.%22%0A

Backup script now cleans obsolete logfiles too.