95
95
# DO NOT REFLOW THIS. Its the exact revision we want.
96
_expected_rev_v5 = b"""<revision committer="Martin Pool <mbp@sourcefrog.net>" format="5" inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41" revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9" timestamp="1125907235.212" timezone="36000">
96
_expected_rev_v5 = """<revision committer="Martin Pool <mbp@sourcefrog.net>" format="5" inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41" revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9" timestamp="1125907235.212" timezone="36000">
97
97
<message>- start splitting code for xml (de)serialization away from objects
98
98
preparatory to supporting multiple formats by a single library
107
107
# DO NOT REFLOW THIS. Its the exact inventory we want.
108
_expected_inv_v5 = b"""<inventory format="5">
108
_expected_inv_v5 = """<inventory format="5">
109
109
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" revision="mbp@foo-123123" text_sha1="A" text_size="1" />
110
110
<directory file_id="foo-20050801201819-4139aa4a272f4250" name="subdir" revision="mbp@foo-00" />
111
111
<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" />
116
_expected_inv_v5_root = b"""<inventory file_id="f<" format="5" revision_id="mother!">
116
_expected_inv_v5_root = """<inventory file_id="f<" format="5" revision_id="mother!">
117
117
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" parent_id="f<" revision="mbp@foo-123123" text_sha1="A" text_size="1" />
118
118
<directory file_id="foo-20050801201819-4139aa4a272f4250" name="subdir" parent_id="f<" revision="mbp@foo-00" />
119
119
<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" />
124
_expected_inv_v6 = b"""<inventory format="6" revision_id="rev_outer">
124
_expected_inv_v6 = """<inventory format="6" revision_id="rev_outer">
125
125
<directory file_id="tree-root-321" name="" revision="rev_outer" />
126
126
<directory file_id="dir-id" name="dir" parent_id="tree-root-321" revision="rev_outer" />
127
127
<file file_id="file-id" name="file" parent_id="tree-root-321" revision="rev_outer" text_sha1="A" text_size="1" />
132
_expected_inv_v7 = b"""<inventory format="7" revision_id="rev_outer">
132
_expected_inv_v7 = """<inventory format="7" revision_id="rev_outer">
133
133
<directory file_id="tree-root-321" name="" revision="rev_outer" />
134
134
<directory file_id="dir-id" name="dir" parent_id="tree-root-321" revision="rev_outer" />
135
135
<file file_id="file-id" name="file" parent_id="tree-root-321" revision="rev_outer" text_sha1="A" text_size="1" />
141
_expected_rev_v8 = b"""<revision committer="Martin Pool <mbp@sourcefrog.net>" format="8" inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41" revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9" timestamp="1125907235.212" timezone="36000">
141
_expected_rev_v8 = """<revision committer="Martin Pool <mbp@sourcefrog.net>" format="8" inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41" revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9" timestamp="1125907235.212" timezone="36000">
142
142
<message>- start splitting code for xml (de)serialization away from objects
143
143
preparatory to supporting multiple formats by a single library
151
_expected_inv_v8 = b"""<inventory format="8" revision_id="rev_outer">
151
_expected_inv_v8 = """<inventory format="8" revision_id="rev_outer">
152
152
<directory file_id="tree-root-321" name="" revision="rev_outer" />
153
153
<directory file_id="dir-id" name="dir" parent_id="tree-root-321" revision="rev_outer" />
154
154
<file file_id="file-id" name="file" parent_id="tree-root-321" revision="rev_outer" text_sha1="A" text_size="1" />
187
187
# Before revision_id was always stored as an attribute
188
_inventory_v5a = b"""<inventory format="5">
188
_inventory_v5a = """<inventory format="5">
192
192
# Before revision_id was always stored as an attribute
193
_inventory_v5b = b"""<inventory format="5" revision_id="a-rev-id">
193
_inventory_v5b = """<inventory format="5" revision_id="a-rev-id">
227
227
inv = breezy.bzr.xml5.serializer_v5.read_inventory(inp)
228
228
eq = self.assertEqual
230
ie = inv.get_entry('bar-20050824000535-6bc48cfad47ed134')
230
ie = inv['bar-20050824000535-6bc48cfad47ed134']
231
231
eq(ie.kind, 'file')
232
232
eq(ie.revision, 'mbp@foo-00')
233
233
eq(ie.name, 'bar')
234
eq(inv.get_entry(ie.parent_id).kind, 'directory')
234
eq(inv[ie.parent_id].kind, 'directory')
236
236
def test_unpack_basis_inventory_5(self):
237
237
"""Unpack canned new-style inventory"""
240
240
eq = self.assertEqual
242
242
eq(inv.revision_id, 'mbp@sourcefrog.net-20050905063503-43948f59fa127d92')
243
ie = inv.get_entry('bar-20050824000535-6bc48cfad47ed134')
243
ie = inv['bar-20050824000535-6bc48cfad47ed134']
244
244
eq(ie.kind, 'file')
245
245
eq(ie.revision, 'mbp@foo-00')
246
246
eq(ie.name, 'bar')
247
eq(inv.get_entry(ie.parent_id).kind, 'directory')
247
eq(inv[ie.parent_id].kind, 'directory')
249
249
def test_unpack_inventory_5a(self):
250
250
inv = breezy.bzr.xml5.serializer_v5.read_inventory_from_string(
352
352
self.assertEqual(props, new_rev.properties)
354
354
def get_sample_inventory(self):
355
inv = Inventory(b'tree-root-321', revision_id=b'rev_outer')
356
inv.add(inventory.InventoryFile(b'file-id', 'file', b'tree-root-321'))
357
inv.add(inventory.InventoryDirectory(b'dir-id', 'dir',
359
inv.add(inventory.InventoryLink(b'link-id', 'link', b'tree-root-321'))
360
inv.get_entry(b'tree-root-321').revision = b'rev_outer'
361
inv.get_entry(b'dir-id').revision = b'rev_outer'
362
inv.get_entry(b'file-id').revision = b'rev_outer'
363
inv.get_entry(b'file-id').text_sha1 = 'A'
364
inv.get_entry(b'file-id').text_size = 1
365
inv.get_entry(b'link-id').revision = b'rev_outer'
366
inv.get_entry(b'link-id').symlink_target = 'a'
355
inv = Inventory('tree-root-321', revision_id='rev_outer')
356
inv.add(inventory.InventoryFile('file-id', 'file', 'tree-root-321'))
357
inv.add(inventory.InventoryDirectory('dir-id', 'dir',
359
inv.add(inventory.InventoryLink('link-id', 'link', 'tree-root-321'))
360
inv['tree-root-321'].revision = 'rev_outer'
361
inv['dir-id'].revision = 'rev_outer'
362
inv['file-id'].revision = 'rev_outer'
363
inv['file-id'].text_sha1 = 'A'
364
inv['file-id'].text_size = 1
365
inv['link-id'].revision = 'rev_outer'
366
inv['link-id'].symlink_target = 'a'
369
369
def test_roundtrip_inventory_v7(self):
370
370
inv = self.get_sample_inventory()
371
inv.add(inventory.TreeReference(b'nested-id', 'nested', b'tree-root-321',
372
b'rev_outer', b'rev_inner'))
371
inv.add(inventory.TreeReference('nested-id', 'nested', 'tree-root-321',
372
'rev_outer', 'rev_inner'))
373
373
txt = xml7.serializer_v7.write_inventory_to_string(inv)
374
374
lines = xml7.serializer_v7.write_inventory_to_lines(inv)
375
375
self.assertEqual(breezy.osutils.split_lines(txt), lines)
377
377
inv2 = xml7.serializer_v7.read_inventory_from_string(txt)
378
378
self.assertEqual(5, len(inv2))
379
379
for path, ie in inv.iter_entries():
380
self.assertEqual(ie, inv2.get_entry(ie.file_id))
380
self.assertEqual(ie, inv2[ie.file_id])
382
382
def test_roundtrip_inventory_v6(self):
383
383
inv = self.get_sample_inventory()
388
388
inv2 = xml6.serializer_v6.read_inventory_from_string(txt)
389
389
self.assertEqual(4, len(inv2))
390
390
for path, ie in inv.iter_entries():
391
self.assertEqual(ie, inv2.get_entry(ie.file_id))
391
self.assertEqual(ie, inv2[ie.file_id])
393
393
def test_wrong_format_v7(self):
394
394
"""Can't accidentally open a file with wrong serializer"""
403
403
s_v5 = breezy.bzr.xml5.serializer_v5
404
404
s_v6 = breezy.bzr.xml6.serializer_v6
405
405
s_v7 = xml7.serializer_v7
406
inv = Inventory(b'tree-root-321', revision_id=b'rev-outer')
407
inv.root.revision = b'root-rev'
408
inv.add(inventory.TreeReference(b'nested-id', 'nested', b'tree-root-321',
409
b'rev-outer', b'rev-inner'))
406
inv = Inventory('tree-root-321', revision_id='rev-outer')
407
inv.root.revision = 'root-rev'
408
inv.add(inventory.TreeReference('nested-id', 'nested', 'tree-root-321',
409
'rev-outer', 'rev-inner'))
410
410
self.assertRaises(errors.UnsupportedInventoryKind,
411
411
s_v5.write_inventory_to_string, inv)
412
412
self.assertRaises(errors.UnsupportedInventoryKind,
415
415
lines = s_v7.write_inventory_to_lines(inv)
416
416
self.assertEqual(breezy.osutils.split_lines(txt), lines)
417
417
inv2 = s_v7.read_inventory_from_string(txt)
418
self.assertEqual(b'tree-root-321', inv2.get_entry(b'nested-id').parent_id)
419
self.assertEqual(b'rev-outer', inv2.get_entry(b'nested-id').revision)
420
self.assertEqual(b'rev-inner', inv2.get_entry(b'nested-id').reference_revision)
418
self.assertEqual('tree-root-321', inv2['nested-id'].parent_id)
419
self.assertEqual('rev-outer', inv2['nested-id'].revision)
420
self.assertEqual('rev-inner', inv2['nested-id'].reference_revision)
422
422
def test_roundtrip_inventory_v8(self):
423
423
inv = self.get_sample_inventory()
425
425
inv2 = xml8.serializer_v8.read_inventory_from_string(txt)
426
426
self.assertEqual(4, len(inv2))
427
427
for path, ie in inv.iter_entries():
428
self.assertEqual(ie, inv2.get_entry(ie.file_id))
428
self.assertEqual(ie, inv2[ie.file_id])
430
430
def test_inventory_text_v8(self):
431
431
inv = self.get_sample_inventory()