Rev 2400: Support unbreakable locks for trees. in sftp://bazaar.launchpad.net/%7Ebzr/bzr/dirstate/

Robert Collins robertc at robertcollins.net
Sun Feb 25 22:51:49 GMT 2007


At sftp://bazaar.launchpad.net/%7Ebzr/bzr/dirstate/

------------------------------------------------------------
revno: 2400
revision-id: robertc at robertcollins.net-20070225225034-fts7vcvfhkqwcms8
parent: john at arbash-meinel.com-20070225220748-zhn0hzx6zo92vfcz
committer: Robert Collins <robertc at robertcollins.net>
branch nick: dirstate
timestamp: Mon 2007-02-26 09:50:34 +1100
message:
  Support unbreakable locks for trees.
modified:
  bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
  bzrlib/lock.py                 lock.py-20050527050856-ec090bb51bc03349
  bzrlib/tests/bzrdir_implementations/test_bzrdir.py test_bzrdir.py-20060131065642-0ebeca5e30e30866
  bzrlib/tests/test_errors.py    test_errors.py-20060210110251-41aba2deddf936a8
=== modified file 'bzrlib/errors.py'
--- a/bzrlib/errors.py	2007-02-23 22:08:21 +0000
+++ b/bzrlib/errors.py	2007-02-25 22:50:34 +0000
@@ -644,6 +644,16 @@
         self.message = message
 
 
+class LockActive(LockError):
+
+    _fmt = "The lock for '%(lock_description)s' is in use and cannot be broken."
+
+    internal_error = False
+
+    def __init__(self, lock_description):
+        self.lock_description = lock_description
+
+
 class CommitNotPossible(LockError):
 
     _fmt = "A commit was attempted but we do not have a write lock open."

=== modified file 'bzrlib/lock.py'
--- a/bzrlib/lock.py	2007-02-23 01:11:22 +0000
+++ b/bzrlib/lock.py	2007-02-25 22:50:34 +0000
@@ -38,7 +38,7 @@
 import os
 import sys
 
-from bzrlib.errors import LockError
+from bzrlib.errors import LockError, LockContention
 from bzrlib.osutils import realpath
 from bzrlib.trace import mutter
 
@@ -100,8 +100,8 @@
             try:
                 self.filename = realpath(filename)
                 if self.filename in self.open_locks:
-                    self._clear_f() 
-                    raise LockError("Lock already held.")
+                    self._clear_f()
+                    raise LockContention("Lock already held.")
                 # reserve a slot for this lock - even if the lockf call fails, 
                 # at thisi point unlock() will be called, because self.f is set.
                 # TODO: make this fully threadsafe, if we decide we care.

=== modified file 'bzrlib/tests/bzrdir_implementations/test_bzrdir.py'
--- a/bzrlib/tests/bzrdir_implementations/test_bzrdir.py	2007-02-13 18:58:39 +0000
+++ b/bzrlib/tests/bzrdir_implementations/test_bzrdir.py	2007-02-25 22:50:34 +0000
@@ -1420,8 +1420,11 @@
         bzrlib.ui.ui_factory.stdin = StringIO("y\ny\ny\ny\n")
         try:
             tree.bzrdir.break_lock()
-        except NotImplementedError:
+        except (NotImplementedError, errors.LockActive):
             # bzrdir does not support break_lock
+            # or one of the locked objects (currently only tree does this)
+            # raised a LockActive because we do still have a live locked
+            # object.
             tree.unlock()
             return
         self.assertEqual("y\n", bzrlib.ui.ui_factory.stdin.read())

=== modified file 'bzrlib/tests/test_errors.py'
--- a/bzrlib/tests/test_errors.py	2007-02-02 04:23:24 +0000
+++ b/bzrlib/tests/test_errors.py	2007-02-25 22:50:34 +0000
@@ -46,6 +46,12 @@
         error = errors.InstallFailed([None])
         self.assertEqual("Could not install revisions:\nNone", str(error))
 
+    def test_lock_active(self):
+        error = errors.LockActive("lock description")
+        self.assertEqualDiff("The lock for 'lock description' is in use and "
+            "cannot be broken.",
+            str(error))
+
     def test_knit_header_error(self):
         error = errors.KnitHeaderError('line foo\n', 'path/to/file')
         self.assertEqual("Knit header error: 'line foo\\n' unexpected"



More information about the bazaar-commits mailing list