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