Rev 4262: Fix _PreviewTree.get_symlink_target for unicode symlinks. in file:///home/vila/src/bzr/bugs/355454-unicode-warning/

Vincent Ladeuil v.ladeuil+lp at free.fr
Fri Apr 17 09:04:37 BST 2009


At file:///home/vila/src/bzr/bugs/355454-unicode-warning/

------------------------------------------------------------
revno: 4262
revision-id: v.ladeuil+lp at free.fr-20090417080436-j1q0a5adj7t20b12
parent: v.ladeuil+lp at free.fr-20090416213135-1ycxrk415pbsse9l
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: 355454-unicode-warning
timestamp: Fri 2009-04-17 10:04:36 +0200
message:
  Fix _PreviewTree.get_symlink_target for unicode symlinks.
  
  * bzrlib/tests/test_shelf.py:
  (TestPrepareShelf._test_shelve_symlink_creation): Factored out and
  add _PreviewTree.get_symlink_target check that reveals the unicode
  bug.
  (TestPrepareShelf.test_shelve_symlink_creation,
  TestPrepareShelf.test_shelve_unicode_symlink_creation): Also test
  unicode symlinks.
  
  * bzrlib/transform.py:
  (_PreviewTree.get_symlink_target): Use osutils.readlink()
-------------- next part --------------
=== modified file 'bzrlib/tests/test_shelf.py'
--- a/bzrlib/tests/test_shelf.py	2009-04-16 14:13:57 +0000
+++ b/bzrlib/tests/test_shelf.py	2009-04-17 08:04:36 +0000
@@ -129,24 +129,34 @@
         self.assertEqual('directory',
             creator.shelf_transform.final_kind(s_bar_trans_id))
 
+    def _test_shelve_symlink_creation(self, link_name, link_target):
+        self.requireFeature(tests.SymlinkFeature)
+        tree = self.make_branch_and_tree('.')
+        tree.lock_write()
+        self.addCleanup(tree.unlock)
+        tree.commit('Empty tree')
+        os.symlink(link_target, link_name)
+        tree.add(link_name, 'foo-id')
+        creator = shelf.ShelfCreator(tree, tree.basis_tree())
+        self.addCleanup(creator.finalize)
+        self.assertEqual([('add file', 'foo-id', 'symlink', link_name)],
+                         list(creator.iter_shelvable()))
+        creator.shelve_creation('foo-id')
+        creator.transform()
+        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
+        self.failIfExists(link_name)
+        limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
+        self.assertEqual(link_target, osutils.readlink(limbo_name))
+        ptree = creator.shelf_transform.get_preview_tree()
+        self.assertEqual(link_target, ptree.get_symlink_target('foo-id'))
+
     def test_shelve_symlink_creation(self):
-        self.requireFeature(tests.SymlinkFeature)
-        tree = self.make_branch_and_tree('.')
-        tree.lock_write()
-        self.addCleanup(tree.unlock)
-        tree.commit('Empty tree')
-        os.symlink('bar', 'foo')
-        tree.add('foo', 'foo-id')
-        creator = shelf.ShelfCreator(tree, tree.basis_tree())
-        self.addCleanup(creator.finalize)
-        self.assertEqual([('add file', 'foo-id', 'symlink', 'foo')],
-                         list(creator.iter_shelvable()))
-        creator.shelve_creation('foo-id')
-        creator.transform()
-        s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
-        self.failIfExists('foo')
-        limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
-        self.assertEqual('bar', os.readlink(limbo_name))
+        self._test_shelve_symlink_creation('foo', 'bar')
+
+    def test_shelve_unicode_symlink_creation(self):
+        self.requireFeature(tests.UnicodeFilenameFeature)
+        self._test_shelve_symlink_creation(u'fo\N{Euro Sign}o',
+                                           u'b\N{Euro Sign}ar')
 
     def _test_shelve_symlink_target_change(self, link_name,
                                            old_target, new_target):
@@ -180,6 +190,8 @@
         s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id')
         limbo_name = creator.shelf_transform._limbo_name(s_trans_id)
         self.assertEqual(new_target, read_link(limbo_name))
+        ptree = creator.shelf_transform.get_preview_tree()
+        self.assertEqual(new_target, ptree.get_symlink_target('foo-id'))
 
     def test_shelve_symlink_target_change(self):
         self._test_shelve_symlink_target_change('foo', 'bar', 'baz')

=== modified file 'bzrlib/transform.py'
--- a/bzrlib/transform.py	2009-04-16 14:13:57 +0000
+++ b/bzrlib/transform.py	2009-04-17 08:04:36 +0000
@@ -1910,8 +1910,7 @@
             return self._transform._tree.get_symlink_target(file_id)
         trans_id = self._transform.trans_id_file_id(file_id)
         name = self._transform._limbo_name(trans_id)
-        # XXX: Looks like we can return arbitrary encoded path below
-        return os.readlink(name)
+        return osutils.readlink(name)
 
     def walkdirs(self, prefix=''):
         pending = [self._transform.root]



More information about the bazaar-commits mailing list