[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