Rev 2299: Fix Inventory.iter_entries_by_dir to return Unicode paths, in http://bzr.arbash-meinel.com/branches/bzr/0.15-dev/utf8_file_ids

John Arbash Meinel john at arbash-meinel.com
Sat Feb 17 21:48:44 GMT 2007


At http://bzr.arbash-meinel.com/branches/bzr/0.15-dev/utf8_file_ids

------------------------------------------------------------
revno: 2299
revision-id: john at arbash-meinel.com-20070217214837-fcv01ahawwq8u687
parent: john at arbash-meinel.com-20070217211722-yxx3xjxtxeijc8d7
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: utf8_file_ids
timestamp: Sat 2007-02-17 15:48:37 -0600
message:
  Fix Inventory.iter_entries_by_dir to return Unicode paths,
  update xml5 serializer tests to ensure that we get unicode paths and file ids
  and utf8 revision ids.
modified:
  bzrlib/inventory.py            inventory.py-20050309040759-6648b84ca2005b37
  bzrlib/tests/test_xml.py       test_xml.py-20050905091053-80b45588931a9b35
-------------- next part --------------
=== modified file 'bzrlib/inventory.py'
--- a/bzrlib/inventory.py	2007-02-06 14:52:16 +0000
+++ b/bzrlib/inventory.py	2007-02-17 21:48:37 +0000
@@ -875,7 +875,7 @@
         an id of None.
         """
         if root_id is not None:
-            self._set_root(InventoryDirectory(root_id, '', None))
+            self._set_root(InventoryDirectory(root_id, u'', None))
         else:
             self.root = None
             self._byid = {}
@@ -970,7 +970,7 @@
             from_dir = self.root
             if (specific_file_ids is None or 
                 self.root.file_id in specific_file_ids):
-                yield '', self.root
+                yield u'', self.root
         elif isinstance(from_dir, basestring):
             from_dir = self._byid[from_dir]
 

=== modified file 'bzrlib/tests/test_xml.py'
--- a/bzrlib/tests/test_xml.py	2007-02-09 23:15:53 +0000
+++ b/bzrlib/tests/test_xml.py	2007-02-17 21:48:37 +0000
@@ -130,6 +130,35 @@
 """
 
 
+_revision_utf8_v5 = """<revision committer="Erik B&#229;gfors &lt;erik at foo.net&gt;"
+    inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41"
+    revision_id="erik at b&#229;gfors-02"
+    timestamp="1125907235.212"
+    timezone="36000">
+<message>Include &#181;nicode characters
+</message>
+<parents>
+<revision_ref revision_id="erik at b&#229;gfors-01"/>
+</parents>
+</revision>
+"""
+
+_inventory_utf8_v5 = """<inventory file_id="TRE&#233;_ROOT" format="5"
+                                   revision_id="erik at b&#229;gfors-02">
+<file file_id="b&#229;r-01"
+      name="b&#229;r" parent_id="TREE_ROOT"
+      revision="erik at b&#229;gfors-01"/>
+<directory name="s&#181;bdir"
+           file_id="s&#181;bdir-01"
+           parent_id="TREE_ROOT"
+           revision="erik at b&#229;gfors-01"/>
+<file executable="yes" file_id="b&#229;r-02"
+      name="b&#229;r" parent_id="s&#181;bdir-01"
+      revision="erik at b&#229;gfors-02"/>
+</inventory>
+"""
+
+
 class TestSerializer(TestCase):
     """Test XML serialization"""
     def test_canned_inventory(self):
@@ -263,17 +292,39 @@
     def test_revision_ids_are_utf8(self):
         """Parsed revision_ids should all be utf-8 strings, not unicode."""
         s_v5 = bzrlib.xml5.serializer_v5
-        rev = s_v5.read_revision_from_string(_revision_v5)
+        rev = s_v5.read_revision_from_string(_revision_utf8_v5)
+        self.assertEqual('erik at b\xc3\xa5gfors-02', rev.revision_id)
         self.assertIsInstance(rev.revision_id, str)
+        self.assertEqual(['erik at b\xc3\xa5gfors-01'], rev.parent_ids)
         for parent_id in rev.parent_ids:
             self.assertIsInstance(parent_id, str)
+        self.assertEqual(u'Include \xb5nicode characters\n', rev.message)
+        self.assertIsInstance(rev.message, unicode)
 
         # ie.revision should either be None or a utf-8 revision id
-        inv = s_v5.read_inventory_from_string(_committed_inv_v5)
-        for path, ie in inv.iter_entries():
-            if ie.revision is None:
-                continue
-            self.assertIsInstance(ie.revision, str)
+        inv = s_v5.read_inventory_from_string(_inventory_utf8_v5)
+        rev_id_1 = u'erik at b\xe5gfors-01'.encode('utf8')
+        rev_id_2 = u'erik at b\xe5gfors-02'.encode('utf8')
+        expected = [(u'', u'TRE\xe9_ROOT', None),
+                    (u'b\xe5r', u'b\xe5r-01', rev_id_1),
+                    (u's\xb5bdir', u's\xb5bdir-01', rev_id_1),
+                    (u's\xb5bdir/b\xe5r', u'b\xe5r-02', rev_id_2),
+                   ]
+        self.assertEqual(rev_id_2, inv.revision_id)
+        self.assertIsInstance(inv.revision_id, str)
+
+        actual = list(inv.iter_entries_by_dir())
+        for (exp_path, exp_file_id, exp_rev_id), (act_path, act_ie) in \
+                                                    zip(expected, actual):
+            self.assertEqual(exp_path, act_path)
+            self.assertIsInstance(act_path, unicode)
+            self.assertEqual(exp_file_id, act_ie.file_id)
+            self.assertIsInstance(act_ie.file_id, unicode)
+            self.assertEqual(exp_rev_id, act_ie.revision)
+            if exp_rev_id is not None:
+                self.assertIsInstance(act_ie.revision, str)
+
+        self.assertEqual(len(expected), len(actual))
 
 
 class TestEncodeAndEscape(TestCase):



More information about the bazaar-commits mailing list