> I unfortunately don't have time to review the patch itself, but for
> crediting Chris Foote, you should use the "Patch by: " syntax in the
> log message.  
Karl, thank you for your hint (and shame on me for not paying enough attention).
Next Try:
[[[
* hot-backup.py.in
   Replace os.rmtree with our own rmtree implementation
   so that we can remove read-only files on Windows.
Patch by: Chris Foote <cfoote@v21.me.uk>
]]]
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:36:41 2007