Rev 2363: Cleanup errors, and change ReadOnlyLockError to pass around more details. in http://bzr.arbash-meinel.com/branches/bzr/0.15-dev/lock_cleanup

John Arbash Meinel john at arbash-meinel.com
Wed Mar 14 20:47:29 GMT 2007


At http://bzr.arbash-meinel.com/branches/bzr/0.15-dev/lock_cleanup

------------------------------------------------------------
revno: 2363
revision-id: john at arbash-meinel.com-20070314204717-htynwogv97fqr22a
parent: john at arbash-meinel.com-20070314201552-bjtfua57456dviep
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: lock_cleanup
timestamp: Wed 2007-03-14 15:47:17 -0500
message:
  Cleanup errors, and change ReadOnlyLockError to pass around more details.
modified:
  bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
  bzrlib/lock.py                 lock.py-20050527050856-ec090bb51bc03349
  bzrlib/tests/test_errors.py    test_errors.py-20060210110251-41aba2deddf936a8
-------------- next part --------------
=== modified file 'bzrlib/errors.py'
--- a/bzrlib/errors.py	2007-03-13 19:39:27 +0000
+++ b/bzrlib/errors.py	2007-03-14 20:47:17 +0000
@@ -698,12 +698,13 @@
 
 
 class ReadOnlyLockError(LockError):
-    
-    _fmt = "Cannot acquire write lock on %(fname)s. File is readonly."
-
-    def __init__(self, fname):
+
+    _fmt = "Cannot acquire write lock on %(fname)s. %(msg)s"
+
+    def __init__(self, fname, msg):
         LockError.__init__(self, '')
         self.fname = fname
+        self.msg = msg
 
 
 class OutSideTransaction(BzrError):

=== modified file 'bzrlib/lock.py'
--- a/bzrlib/lock.py	2007-03-14 20:15:52 +0000
+++ b/bzrlib/lock.py	2007-03-14 20:47:17 +0000
@@ -48,21 +48,23 @@
 
     def __init__(self):
         self.f = None
+        self.filename = None
 
     def _open(self, filename, filemode):
+        self.filename = realpath(filename)
         try:
-            self.f = open(filename, filemode)
+            self.f = open(self.filename, filemode)
             return self.f
         except IOError, e:
             if e.errno in (errno.EACCES, errno.EPERM):
-                raise errors.ReadOnlyLockError(e)
+                raise errors.ReadOnlyLockError(self.filename, str(e))
             if e.errno != errno.ENOENT:
                 raise
 
             # maybe this is an old branch (before may 2005)
-            mutter("trying to create missing branch lock %r", filename)
+            mutter("trying to create missing lock %r", self.filename)
 
-            self.f = open(filename, 'wb+')
+            self.f = open(self.filename, 'wb+')
             return self.f
 
     def _clear_f(self):
@@ -123,7 +125,6 @@
             # standard IO errors get exposed directly.
             super(_fcntl_WriteLock, self).__init__()
             self._open(filename, 'rb+')
-            self.filename = realpath(filename)
             if self.filename in self.open_locks:
                 self._clear_f()
                 raise LockContention(self.filename)
@@ -326,33 +327,3 @@
 # We default to using the first available lock class.
 _lock_type, WriteLock, ReadLock = _lock_classes[0]
 
-
-class LockTreeTestProviderAdapter(object):
-    """A tool to generate a suite testing multiple lock formats at once.
-
-    This is done by copying the test once for each lock and injecting the
-    read_lock and write_lock classes.
-    They are also given a new test id.
-    """
-
-    def __init__(self, lock_classes):
-        self._lock_classes = lock_classes
-
-    def _clone_test(self, test, write_lock, read_lock, variation):
-        """Clone test for adaption."""
-        new_test = deepcopy(test)
-        new_test.write_lock = write_lock
-        new_test.read_lock = read_lock
-        def make_new_test_id():
-            new_id = "%s(%s)" % (test.id(), variation)
-            return lambda: new_id
-        new_test.id = make_new_test_id()
-        return new_test
-
-    def adapt(self, test):
-        from bzrlib.tests import TestSuite
-        result = TestSuite()
-        for name, write_lock, read_lock in self._lock_classes:
-            new_test = self._clone_test(test, write_lock, read_lock, name)
-            result.addTest(new_test)
-        return result

=== modified file 'bzrlib/tests/test_errors.py'
--- a/bzrlib/tests/test_errors.py	2007-02-26 22:08:14 +0000
+++ b/bzrlib/tests/test_errors.py	2007-03-14 20:47:17 +0000
@@ -105,6 +105,11 @@
             "to be.",
             str(error))
 
+    def test_read_only_lock_error(self):
+        error = errors.ReadOnlyLockError('filename', 'error message')
+        self.assertEqualDiff("Cannot acquire write lock on filename."
+                             " error message", str(error))
+
     def test_too_many_concurrent_requests(self):
         error = errors.TooManyConcurrentRequests("a medium")
         self.assertEqualDiff("The medium 'a medium' has reached its concurrent "



More information about the bazaar-commits mailing list