Rev 3987: (robertc) Fix bug 319790 - unshelve of deleted paths failing. (Robert in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Mon Feb 9 02:35:05 GMT 2009


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 3987
revision-id: pqm at pqm.ubuntu.com-20090209023502-xwfb7x9jw7h8oqa7
parent: pqm at pqm.ubuntu.com-20090209014051-5mj66o1vx58glvs9
parent: robertc at robertcollins.net-20090206034705-i3xvyq06qi5svxjd
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Mon 2009-02-09 02:35:02 +0000
message:
  (robertc) Fix bug 319790 - unshelve of deleted paths failing. (Robert
  	Collins)
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/shelf.py                prepare_shelf.py-20081005181341-n74qe6gu1e65ad4v-1
  bzrlib/tests/test_shelf.py     test_prepare_shelf.p-20081005181341-n74qe6gu1e65ad4v-2
  bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
    ------------------------------------------------------------
    revno: 3981.1.1
    revision-id: robertc at robertcollins.net-20090206034705-i3xvyq06qi5svxjd
    parent: pqm at pqm.ubuntu.com-20090204125611-m7kqmwruvndk7yrv
    committer: Robert Collins <robertc at robertcollins.net>
    branch nick: bug-319790
    timestamp: Fri 2009-02-06 14:47:05 +1100
    message:
      Fix bug 319790 - unshelve of deleted paths failing.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/shelf.py                prepare_shelf.py-20081005181341-n74qe6gu1e65ad4v-1
      bzrlib/tests/test_shelf.py     test_prepare_shelf.p-20081005181341-n74qe6gu1e65ad4v-2
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
=== modified file 'NEWS'
--- a/NEWS	2009-02-09 00:55:01 +0000
+++ b/NEWS	2009-02-09 02:35:02 +0000
@@ -127,6 +127,8 @@
       handled.
       (John Arbash Meinel, Vincent Ladeuil)
 
+    * Unshelve now handles deleted paths without crashing. (Robert Collins)
+
   DOCUMENTATION:
 
     * Improved plugin developer documentation.  (Martin Pool)

=== modified file 'bzrlib/shelf.py'
--- a/bzrlib/shelf.py	2008-12-02 05:54:11 +0000
+++ b/bzrlib/shelf.py	2009-02-06 03:47:05 +0000
@@ -264,7 +264,6 @@
         tt.deserialize(records)
         return klass(tree, base_tree, tt, metadata.get('message'))
 
-
     def make_merger(self):
         """Return a merger that can unshelve the changes."""
         pb = ui.ui_factory.nested_progress_bar()

=== 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-02-06 03:47:05 +0000
@@ -315,6 +315,35 @@
         unshelver.make_merger().do_merge()
         self.assertFileEqual('z\na\nb\nd\n', 'tree/foo')
 
+    def test_unshelve_deleted(self):
+        tree = self.make_branch_and_tree('tree')
+        tree.lock_write()
+        self.addCleanup(tree.unlock)
+        self.build_tree_contents([('tree/foo/',), ('tree/foo/bar', 'baz')])
+        tree.add(['foo', 'foo/bar'], ['foo-id', 'bar-id'])
+        tree.commit('Added file and directory')
+        tree.unversion(['foo-id', 'bar-id'])
+        os.unlink('tree/foo/bar')
+        os.rmdir('tree/foo')
+        creator = shelf.ShelfCreator(tree, tree.basis_tree())
+        list(creator.iter_shelvable())
+        creator.shelve_deletion('foo-id')
+        creator.shelve_deletion('bar-id')
+        shelf_file = open('shelf', 'w+b')
+        self.addCleanup(shelf_file.close)
+        creator.write_shelf(shelf_file)
+        creator.transform()
+        creator.finalize()
+        # validate the test setup
+        self.assertTrue('foo-id' in tree)
+        self.assertTrue('bar-id' in tree)
+        self.assertFileEqual('baz', 'tree/foo/bar')
+        shelf_file.seek(0)
+        unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file)
+        unshelver.make_merger().do_merge()
+        self.assertFalse('foo-id' in tree)
+        self.assertFalse('bar-id' in tree)
+
     def test_unshelve_base(self):
         tree = self.make_branch_and_tree('tree')
         tree.lock_write()

=== modified file 'bzrlib/transform.py'
--- a/bzrlib/transform.py	2008-12-11 03:18:52 +0000
+++ b/bzrlib/transform.py	2009-02-06 03:47:05 +0000
@@ -121,7 +121,7 @@
         self._non_present_ids = {}
         # Mapping of new file_id -> trans_id
         self._r_new_id = {}
-        # Set of file_ids that will be removed
+        # Set of trans_ids that will be removed
         self._removed_id = set()
         # Mapping of path in old tree -> trans_id
         self._tree_path_ids = {}
@@ -1649,7 +1649,8 @@
     def has_id(self, file_id):
         if file_id in self._transform._r_new_id:
             return True
-        elif file_id in self._transform._removed_id:
+        elif file_id in set([self._transform.tree_file_id(trans_id) for
+            trans_id in self._transform._removed_id]):
             return False
         else:
             return self._transform._tree.has_id(file_id)




More information about the bazaar-commits mailing list