80
81
_committed_inv_v5 = """<inventory>
81
82
<file file_id="bar-20050901064931-73b4b1138abc9cd2"
82
83
name="bar" parent_id="TREE_ROOT"
83
revision="mbp@foo-123123"/>
84
revision="mbp@foo-123123"
85
text_sha1="A" text_size="1"/>
84
86
<directory name="subdir"
85
87
file_id="foo-20050801201819-4139aa4a272f4250"
86
88
parent_id="TREE_ROOT"
87
89
revision="mbp@foo-00"/>
88
90
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134"
89
91
name="bar" parent_id="foo-20050801201819-4139aa4a272f4250"
90
revision="mbp@foo-00"/>
93
text_sha1="B" text_size="0"/>
121
124
# DO NOT REFLOW THIS. Its the exact inventory we want.
122
125
_expected_inv_v5 = """<inventory format="5">
123
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" revision="mbp@foo-123123" />
126
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" revision="mbp@foo-123123" text_sha1="A" text_size="1" />
124
127
<directory file_id="foo-20050801201819-4139aa4a272f4250" name="subdir" revision="mbp@foo-00" />
125
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" />
128
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" text_sha1="B" text_size="0" />
130
133
_expected_inv_v5_root = """<inventory file_id="f<" format="5" revision_id="mother!">
131
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" parent_id="f<" revision="mbp@foo-123123" />
134
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" parent_id="f<" revision="mbp@foo-123123" text_sha1="A" text_size="1" />
132
135
<directory file_id="foo-20050801201819-4139aa4a272f4250" name="subdir" parent_id="f<" revision="mbp@foo-00" />
133
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" />
136
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" text_sha1="B" text_size="0" />
137
<symlink file_id="link-1" name="link" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" symlink_target="a" />
137
141
_expected_inv_v7 = """<inventory format="7" revision_id="rev_outer">
138
142
<directory file_id="tree-root-321" name="" revision="rev_outer" />
139
143
<directory file_id="dir-id" name="dir" parent_id="tree-root-321" revision="rev_outer" />
140
<file file_id="file-id" name="file" parent_id="tree-root-321" revision="rev_outer" />
141
<symlink file_id="link-id" name="link" parent_id="tree-root-321" revision="rev_outer" />
144
<file file_id="file-id" name="file" parent_id="tree-root-321" revision="rev_outer" text_sha1="A" text_size="1" />
145
<symlink file_id="link-id" name="link" parent_id="tree-root-321" revision="rev_outer" symlink_target="a" />
142
146
<tree-reference file_id="nested-id" name="nested" parent_id="tree-root-321" revision="rev_outer" reference_revision="rev_inner" />
178
# Before revision_id was always stored as an attribute
179
_inventory_v5a = """<inventory format="5">
183
# Before revision_id was always stored as an attribute
184
_inventory_v5b = """<inventory format="5" revision_id="a-rev-id">
175
189
class TestSerializer(TestCase):
176
190
"""Test XML serialization"""
177
192
def test_canned_inventory(self):
178
193
"""Test unpacked a canned inventory v4 file."""
179
194
inp = StringIO(_working_inventory_v4)
242
257
eq(ie.name, 'bar')
243
258
eq(inv[ie.parent_id].kind, 'directory')
260
def test_unpack_inventory_5a(self):
261
inv = bzrlib.xml5.serializer_v5.read_inventory_from_string(
262
_inventory_v5a, revision_id='test-rev-id')
263
self.assertEqual('test-rev-id', inv.root.revision)
265
def test_unpack_inventory_5b(self):
266
inv = bzrlib.xml5.serializer_v5.read_inventory_from_string(
267
_inventory_v5b, revision_id='test-rev-id')
268
self.assertEqual('a-rev-id', inv.root.revision)
245
270
def test_repack_inventory_5(self):
246
271
inp = StringIO(_committed_inv_v5)
247
272
inv = bzrlib.xml5.serializer_v5.read_inventory(inp)
257
282
outp = StringIO()
258
283
bzrlib.xml5.serializer_v5.write_inventory(inv, outp)
259
284
self.assertEqualDiff(xml_string, outp.getvalue())
285
lines = bzrlib.xml5.serializer_v5.write_inventory_to_lines(inv)
287
self.assertEqual(outp.readlines(), lines)
260
288
inv2 = bzrlib.xml5.serializer_v5.read_inventory(StringIO(outp.getvalue()))
261
289
self.assertEqual(inv, inv2)
313
341
inv['tree-root-321'].revision = 'rev_outer'
314
342
inv['dir-id'].revision = 'rev_outer'
315
343
inv['file-id'].revision = 'rev_outer'
344
inv['file-id'].text_sha1 = 'A'
345
inv['file-id'].text_size = 1
316
346
inv['link-id'].revision = 'rev_outer'
347
inv['link-id'].symlink_target = 'a'
317
348
txt = xml7.serializer_v7.write_inventory_to_string(inv)
349
lines = xml7.serializer_v7.write_inventory_to_lines(inv)
350
self.assertEqual(bzrlib.osutils.split_lines(txt), lines)
318
351
self.assertEqualDiff(_expected_inv_v7, txt)
319
352
inv2 = xml7.serializer_v7.read_inventory_from_string(txt)
320
353
self.assertEqual(5, len(inv2))
334
367
s_v5 = bzrlib.xml5.serializer_v5
335
368
s_v6 = bzrlib.xml6.serializer_v6
336
369
s_v7 = xml7.serializer_v7
337
inv = Inventory('tree-root-321')
370
inv = Inventory('tree-root-321', revision_id='rev-outer')
371
inv.root.revision = 'root-rev'
338
372
inv.add(inventory.TreeReference('nested-id', 'nested', 'tree-root-321',
339
373
'rev-outer', 'rev-inner'))
340
self.assertRaises(errors.UnsupportedInventoryKind,
374
self.assertRaises(errors.UnsupportedInventoryKind,
341
375
s_v5.write_inventory_to_string, inv)
342
self.assertRaises(errors.UnsupportedInventoryKind,
376
self.assertRaises(errors.UnsupportedInventoryKind,
343
377
s_v6.write_inventory_to_string, inv)
344
378
txt = s_v7.write_inventory_to_string(inv)
379
lines = s_v7.write_inventory_to_lines(inv)
380
self.assertEqual(bzrlib.osutils.split_lines(txt), lines)
345
381
inv2 = s_v7.read_inventory_from_string(txt)
346
382
self.assertEqual('tree-root-321', inv2['nested-id'].parent_id)
347
383
self.assertEqual('rev-outer', inv2['nested-id'].revision)
373
409
fid_bar1 = u'b\xe5r-01'.encode('utf8')
374
410
fid_sub = u's\xb5bdir-01'.encode('utf8')
375
411
fid_bar2 = u'b\xe5r-02'.encode('utf8')
376
expected = [(u'', fid_root, None, None),
412
expected = [(u'', fid_root, None, rev_id_2),
377
413
(u'b\xe5r', fid_bar1, fid_root, rev_id_1),
378
414
(u's\xb5bdir', fid_sub, fid_root, rev_id_1),
379
415
(u's\xb5bdir/b\xe5r', fid_bar2, fid_sub, rev_id_2),
398
434
self.assertEqual(len(expected), len(actual))
436
def test_registry(self):
437
self.assertIs(serializer_v4,
438
xml_serializer.format_registry.get('4'))
439
self.assertIs(bzrlib.xml5.serializer_v5,
440
xml_serializer.format_registry.get('5'))
441
self.assertIs(bzrlib.xml6.serializer_v6,
442
xml_serializer.format_registry.get('6'))
443
self.assertIs(bzrlib.xml7.serializer_v7,
444
xml_serializer.format_registry.get('7'))
401
447
class TestEncodeAndEscape(TestCase):
402
448
"""Whitebox testing of the _encode_and_escape function."""