Rev 3956: one possible fix in lp:///~jameinel/bzr/win32-shelve
John Arbash Meinel
john at arbash-meinel.com
Fri Jan 23 17:49:03 GMT 2009
At lp:///~jameinel/bzr/win32-shelve
------------------------------------------------------------
revno: 3956
revision-id: john at arbash-meinel.com-20090123174855-65tgyycwsc54uis9
parent: pqm at pqm.ubuntu.com-20090123103145-yvo3icrif75vkt20
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: win32-shelve
timestamp: Fri 2009-01-23 11:48:55 -0600
message:
one possible fix
Make ShelfCreator manage the lifetime of the WT lock (unlock during .finalize)
Not a great solution, because the lifetime is a bit wrong during
Shelver's creation and deconstruction.
(After __init__ we have a locked tree that won't be unlocked until run(),
but after run() the tree is unlocked, but still an attribute of ShelfCreator.
-------------- next part --------------
=== modified file 'bzrlib/shelf.py'
--- a/bzrlib/shelf.py 2008-12-02 05:54:11 +0000
+++ b/bzrlib/shelf.py 2009-01-23 17:48:55 +0000
@@ -37,7 +37,8 @@
def __init__(self, work_tree, target_tree, file_list=None):
"""Constructor.
- :param work_tree: The working tree to apply changes to
+ :param work_tree: The working tree to apply changes to,
+ this tree should already be write locked.
:param target_tree: The tree to make the working tree more similar to.
:param file_list: The files to make more similar to the target.
"""
@@ -186,6 +187,7 @@
"""Release all resources used by this ShelfCreator."""
self.work_transform.finalize()
self.shelf_transform.finalize()
+ self.work_tree.unlock()
def transform(self):
"""Shelve changes from working tree."""
=== modified file 'bzrlib/shelf_ui.py'
--- a/bzrlib/shelf_ui.py 2008-12-12 06:09:44 +0000
+++ b/bzrlib/shelf_ui.py 2009-01-23 17:48:55 +0000
@@ -73,6 +73,7 @@
:param directory: The directory containing the working tree.
"""
tree, path = workingtree.WorkingTree.open_containing(directory)
+ tree.lock_write()
target_tree = builtins._get_one_revision_tree('shelf2', revision,
tree.branch, tree)
files = builtins.safe_relpath_files(tree, file_list)
=== modified file 'bzrlib/tests/test_shelf.py'
--- a/bzrlib/tests/test_shelf.py 2008-12-02 05:54:11 +0000
+++ b/bzrlib/tests/test_shelf.py 2009-01-23 17:48:55 +0000
@@ -38,6 +38,7 @@
tree.add(['foo'], ['foo-id'])
tree.commit('foo')
tree.rename_one('foo', 'bar')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
self.assertEqual([('rename', 'foo-id', 'foo', 'bar')],
@@ -56,6 +57,7 @@
tree.add(['foo', 'bar', 'foo/baz'], ['foo-id', 'bar-id', 'baz-id'])
tree.commit('foo')
tree.rename_one('foo/baz', 'bar/baz')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
self.assertEqual([('rename', 'baz-id', 'foo/baz', 'bar/baz')],
@@ -85,6 +87,7 @@
tree.add('foo', 'foo-id')
tree.commit('Committed foo')
self.build_tree_contents([('foo', 'b\na\nc\n')])
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
self.assertEqual([('modify text', 'foo-id')],
@@ -101,6 +104,7 @@
tree.commit('Empty tree')
self.build_tree_contents([('foo', 'a\n'), ('bar/',)])
tree.add(['foo', 'bar'], ['foo-id', 'bar-id'])
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
self.assertEqual([('add file', 'bar-id', 'directory', 'bar'),
@@ -129,6 +133,7 @@
tree.commit('Empty tree')
os.symlink('bar', 'foo')
tree.add('foo', 'foo-id')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
self.assertEqual([('add file', 'foo-id', 'symlink', 'foo')],
@@ -148,6 +153,7 @@
self.build_tree(['foo'])
tree.add('foo', 'foo-id')
os.unlink('foo')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
self.assertEqual([('add file', 'foo-id', None, 'foo')],
@@ -172,6 +178,7 @@
tree.unversion(['foo-id', 'bar-id'])
os.unlink('tree/foo/bar')
os.rmdir('tree/foo')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
self.assertEqual([('delete file', 'bar-id', 'file', 'foo/bar'),
@@ -190,6 +197,7 @@
tree.add('foo', 'foo-id')
tree.commit('Added file and directory')
os.unlink('tree/foo')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
@@ -205,6 +213,7 @@
tree.commit('Added file and directory')
os.unlink('tree/foo')
os.mkdir('tree/foo')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
self.assertEqual([('change kind', 'foo-id', 'file', 'directory',
@@ -222,6 +231,7 @@
tree.add('foo', 'foo-id')
tree.commit('Added file and directory')
tree.unversion(['foo-id'])
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
self.assertEqual([('delete file', 'foo-id', 'file', 'foo')],
@@ -232,6 +242,7 @@
def test_shelve_serialization(self):
tree = self.make_branch_and_tree('.')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
shelf_file = open('shelf', 'wb')
@@ -246,6 +257,7 @@
tree = self.make_branch_and_tree('tree')
self.build_tree(['tree/foo'])
tree.add('foo', 'foo-id')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
list(creator.iter_shelvable())
@@ -278,6 +290,7 @@
tree.lock_write()
self.addCleanup(tree.unlock)
tree.add('foo', 'foo-id')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
list(creator.iter_shelvable())
@@ -301,6 +314,7 @@
tree.add('foo', 'foo-id')
tree.commit('first commit')
self.build_tree_contents([('tree/foo', 'a\nb\nd\n')])
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
list(creator.iter_shelvable())
@@ -320,6 +334,7 @@
tree.lock_write()
self.addCleanup(tree.unlock)
tree.commit('rev1', rev_id='rev1')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
manager = tree.get_shelf_manager()
@@ -447,6 +462,7 @@
self.build_tree_contents([('tree/foo', 'bar')])
self.assertFileEqual('bar', 'tree/foo')
tree.add('foo', 'foo-id')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
self.addCleanup(creator.finalize)
list(creator.iter_shelvable())
@@ -460,7 +476,9 @@
def test_get_metadata(self):
tree = self.make_branch_and_tree('.')
+ tree.lock_write() # ShelfCreator.finalize will unlock for us
creator = shelf.ShelfCreator(tree, tree.basis_tree())
+ self.addCleanup(creator.finalize)
shelf_manager = tree.get_shelf_manager()
shelf_id = shelf_manager.shelve_changes(creator, 'foo')
metadata = shelf_manager.get_metadata(shelf_id)
More information about the bazaar-commits
mailing list