[CalendarServer-changes] [9464] CalendarServer/branches/release/CalendarServer-4.1-dev/contrib/ migration

source_changes at macosforge.org source_changes at macosforge.org
Thu Jul 19 13:50:27 PDT 2012


Revision: 9464
          http://trac.macosforge.org/projects/calendarserver/changeset/9464
Author:   sagen at apple.com
Date:     2012-07-19 13:50:26 -0700 (Thu, 19 Jul 2012)
Log Message:
-----------
Pulling migration extra fix for non-colliding data directories over from trunk

Modified Paths:
--------------
    CalendarServer/branches/release/CalendarServer-4.1-dev/contrib/migration/calendarmigrator.py
    CalendarServer/branches/release/CalendarServer-4.1-dev/contrib/migration/test/test_migrator.py

Modified: CalendarServer/branches/release/CalendarServer-4.1-dev/contrib/migration/calendarmigrator.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-4.1-dev/contrib/migration/calendarmigrator.py	2012-07-19 20:47:36 UTC (rev 9463)
+++ CalendarServer/branches/release/CalendarServer-4.1-dev/contrib/migration/calendarmigrator.py	2012-07-19 20:50:26 UTC (rev 9464)
@@ -596,7 +596,8 @@
                 newDocumentRoot = os.path.join(newDataRoot, newDocumentRootValue)
                 # Move aside whatever is there
                 if diskAccessor.exists(newDataRoot):
-                    diskAccessor.rename(newDataRoot, newDataRoot + ".bak")
+                    renameTo = nextAvailable(newDataRoot, "bak", diskAccessor=diskAccessor)
+                    diskAccessor.rename(newDataRoot, renameTo)
 
                 if diskAccessor.exists(absolutePathWithRoot(sourceRoot, oldCalDataRootValueProcessed)):
                     diskAccessor.ditto(
@@ -768,6 +769,35 @@
         return os.path.join(root, path)
 
 
+def nextAvailable(path, ext, diskAccessor=None):
+    """
+    If path.ext doesn't exist, return path.ext.  Otherwise return the first path name
+    following the path.N.ext pattern that doesn't exist, where N starts at 1
+    and increments until a non-existent path name is determined.
+
+    @param path: path to examine
+    @type path: C{str}
+    @param ext: filename extension to append (don't include ".")
+    @type ext: C{str}
+    @returns: non-existent path name
+    @rtype: C{str}
+    """
+
+    if diskAccessor is None:
+        diskAccessor = DiskAccessor()
+
+    newPath = "%s.%s" % (path, ext)
+    if not diskAccessor.exists(newPath):
+        return newPath
+
+    i = 1
+    while(True):
+        newPath = "%s.%d.%s" % (path, i, ext)
+        if not diskAccessor.exists(newPath):
+            return newPath
+        i += 1
+
+
 class DiskAccessor(object):
     """
     A wrapper around various disk access methods so that unit tests can easily
@@ -795,7 +825,7 @@
             return os.rename(before, after)
         except OSError:
             # Can't rename because it's cross-volume; must copy/delete
-            shutil.copy2(before, after)
+            self.ditto(before, after)
             return os.remove(before)
 
     def isfile(self, path):

Modified: CalendarServer/branches/release/CalendarServer-4.1-dev/contrib/migration/test/test_migrator.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-4.1-dev/contrib/migration/test/test_migrator.py	2012-07-19 20:47:36 UTC (rev 9463)
+++ CalendarServer/branches/release/CalendarServer-4.1-dev/contrib/migration/test/test_migrator.py	2012-07-19 20:50:26 UTC (rev 9464)
@@ -17,7 +17,7 @@
 import twistedcaldav.test.util
 from contrib.migration.calendarmigrator import (
     mergePlist, examinePreviousSystem, relocateData, relativize, isServiceDisabled,
-    ServiceStateError
+    ServiceStateError, nextAvailable
 )
 import contrib.migration.calendarmigrator
 
@@ -1039,6 +1039,9 @@
 
                 "/Volumes/External/CalendarServer/Documents/calendars/" : True,
                 "/Volumes/External/CalendarServer/Calendar and Contacts Data/" : True,
+                "/Volumes/External/CalendarServer/Calendar and Contacts Data.bak/" : True,
+                "/Volumes/External/CalendarServer/Calendar and Contacts Data.1.bak/" : True,
+                "/Volumes/External/CalendarServer/Calendar and Contacts Data.2.bak/" : True,
                 "/Library/Server/Previous/Library/CalendarServer/Data/" : True,
                 "/Volumes/External/AddressBookServer/Documents/addressbooks/" : True,
                 "/Library/Server/Previous/Library/AddressBookServer/Data/" : True,
@@ -1061,7 +1064,7 @@
             [   # expected DiskAccessor history
                 ('rename',
                  '/Volumes/External/CalendarServer/Calendar and Contacts Data',
-                 '/Volumes/External/CalendarServer/Calendar and Contacts Data.bak'),
+                 '/Volumes/External/CalendarServer/Calendar and Contacts Data.3.bak'),
                 ('ditto', '/Library/Server/Previous/Library/CalendarServer/Data', '/Volumes/External/CalendarServer/Calendar and Contacts Data'),
                 ('rename', '/Volumes/External/CalendarServer/Documents', '/Volumes/External/CalendarServer/Calendar and Contacts Data/Documents'),
                 ('chown-recursive', '/Volumes/External/CalendarServer/Calendar and Contacts Data', FakeUser.pw_uid, FakeGroup.gr_gid),
@@ -1505,6 +1508,18 @@
             self.assertEquals(history, accessor.history)
 
 
+    def test_nextAvailable(self):
+        data = [
+            ( { }, "a.bak" ),
+            ( { "a.bak": True }, "a.1.bak" ),
+            ( { "a.bak": True, "a.1.bak" : True }, "a.2.bak" ),
+        ]
+        for paths, expected in data:
+            accessor = StubDiskAccessor(paths)
+            actual = nextAvailable("a", "bak", diskAccessor=accessor)
+            self.assertEquals(actual, expected)
+
+
     def test_stubDiskAccessor(self):
 
         paths = {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120719/01287bb4/attachment-0001.html>


More information about the calendarserver-changes mailing list