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