Ok, next try, this time with a nice log message and a patch against trunk :)
Credits for this patch goes to Chris Foote <cfoote@v21.me.uk>.
See http://svn.haxx.se/dev/archive-2006-11/0269.shtml for a detailed description.
Regards,
Jens
[[[
* hot-backup.py.in
Replace os.rmtree with our own rmtree implementation
so that we can remove read-only files on Windows.
]]]
Index: tools/backup/hot-backup.py.in
===================================================================
--- tools/backup/hot-backup.py.in (revision 23889)
+++ tools/backup/hot-backup.py.in (working copy)
@@ -22,7 +22,7 @@
######################################################################
-import sys, os, getopt, shutil, string, re
+import sys, os, getopt, stat, string, re
######################################################################
# Global Settings
@@ -151,6 +151,34 @@
return string.strip(stdout_lines[0])
+def rmtree(path):
+ # Re-implement rmtree so we can remove read-only files.
+ cmdtuples = []
+ arg = path
+
+ try:
+ _build_cmdtuple(path, cmdtuples)
+ for func, arg in cmdtuples:
+ func(arg)
+ except OSError:
+ exc = sys.exc_info()
+ # Re-raise the exception
+ raise exc[0], (exc[1][0], exc[1][1] + ' removing '+arg)
+
+def _build_cmdtuple(path, cmdtuples):
+ # Helper for rmtree()
+ for f in os.listdir(path):
+ real_f = os.path.join(path,f)
+ if os.path.isdir(real_f) and not os.path.islink(real_f):
+ _build_cmdtuple(real_f, cmdtuples)
+ else:
+ # The format file on Windows is read-only and can not be removed,
+ # make it writeable before removing.
+ if os.path.basename(real_f) == 'format':
+ cmdtuples.append((lambda x: os.chmod(x, stat.S_IWRITE), real_f))
+ cmdtuples.append((os.remove, real_f))
+ cmdtuples.append((os.rmdir, path))
+
######################################################################
# Main
@@ -256,7 +284,7 @@
sys.exit(err_code)
else:
print "Archive created, removing backup '" + backup_subdir + "'..."
- shutil.rmtree(backup_subdir)
+ rmtree(backup_subdir)
### Step 5: finally, remove all repository backups other than the last
### NUM_BACKUPS.
@@ -271,6 +299,6 @@
old_backup_item = os.path.join(backup_dir, item)
print "Removing old backup: " + old_backup_item
if os.path.isdir(old_backup_item):
- shutil.rmtree(old_backup_item)
+ rmtree(old_backup_item)
else:
os.remove(old_backup_item)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sun Mar 18 10:17:05 2007