Rev 3479: Assert that we properly encode inv_entry.symlink_target, (bug #135320) in http://bzr.arbash-meinel.com/branches/bzr/1.6-dev/symlink_unicode_135320

John Arbash Meinel john at arbash-meinel.com
Thu Jun 5 22:19:30 BST 2008


At http://bzr.arbash-meinel.com/branches/bzr/1.6-dev/symlink_unicode_135320

------------------------------------------------------------
revno: 3479
revision-id: john at arbash-meinel.com-20080605211911-2xtal2ehwcqkcymy
parent: john at arbash-meinel.com-20080605210642-zoc3nelx84xmsxuf
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: symlink_unicode_135320
timestamp: Thu 2008-06-05 16:19:11 -0500
message:
  Assert that we properly encode inv_entry.symlink_target, (bug #135320)
-------------- next part --------------
=== modified file 'bzrlib/dirstate.py'
--- a/bzrlib/dirstate.py	2008-05-08 04:12:06 +0000
+++ b/bzrlib/dirstate.py	2008-06-05 21:19:11 +0000
@@ -1825,7 +1825,8 @@
             raise
         return result
 
-    def _inv_entry_to_details(self, inv_entry):
+    @staticmethod
+    def _inv_entry_to_details(inv_entry):
         """Convert an inventory entry (from a revision tree) to state details.
 
         :param inv_entry: An inventory entry whose sha1 and link targets can be
@@ -1841,7 +1842,13 @@
             size = 0
             executable = False
         elif kind == 'symlink':
-            fingerprint = inv_entry.symlink_target or ''
+            fingerprint = inv_entry.symlink_target
+            if fingerprint is None:
+                fingerprint = ''
+            else:
+                assert isinstance(fingerprint, unicode)
+                # Do we need a 'isinstance(fingerprint, unicode)' check here?
+                fingerprint = fingerprint.encode('UTF-8')
             size = 0
             executable = False
         elif kind == 'file':

=== modified file 'bzrlib/tests/test_dirstate.py'
--- a/bzrlib/tests/test_dirstate.py	2008-04-24 07:22:53 +0000
+++ b/bzrlib/tests/test_dirstate.py	2008-06-05 21:19:11 +0000
@@ -23,6 +23,7 @@
 from bzrlib import (
     dirstate,
     errors,
+    inventory,
     osutils,
     )
 from bzrlib.memorytree import MemoryTree
@@ -2514,3 +2515,21 @@
         state._discard_merge_parents()
         state._validate()
         self.assertEqual(exp_dirblocks, state._dirblocks)
+
+
+class Test_InvEntryToDetails(TestCaseWithDirState):
+
+    def assertDetails(self, expected, inv_entry):
+        details = dirstate.DirState._inv_entry_to_details(inv_entry)
+        self.assertEqual(expected, details)
+
+    def test_unicode_symlink(self):
+        uni_link_target = u'Non-\xe5scii'
+        utf8_link_target = 'Non-\xc3\xa5scii'
+        self.assertEqual(utf8_link_target, uni_link_target.encode('UTF-8'))
+        inv_entry = inventory.InventoryLink('link-file-id', 'name',
+                                            'link-parent-id')
+        inv_entry.revision = 'link-revision-id'
+        inv_entry.symlink_target = uni_link_target
+        self.assertDetails(('l', utf8_link_target, 0, False,
+                           'link-revision-id'), inv_entry)



More information about the bazaar-commits mailing list