373
393
def test_None_file_id(self):
374
394
inv = self.get_empty_inventory()
375
dir1 = inventory.InventoryDirectory(b'dirid', 'dir1', inv.root.file_id)
395
dir1 = inventory.InventoryDirectory(None, 'dir1', inv.root.file_id)
377
396
dir1.revision = b'result'
378
397
delta = [(None, u'dir1', None, dir1)]
379
398
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
382
401
def test_unicode_file_id(self):
383
402
inv = self.get_empty_inventory()
384
dir1 = inventory.InventoryDirectory(b'dirid', 'dir1', inv.root.file_id)
385
dir1.file_id = u'dirid'
403
dir1 = inventory.InventoryDirectory(u'dirid', 'dir1', inv.root.file_id)
386
404
dir1.revision = b'result'
387
405
delta = [(None, u'dir1', dir1.file_id, dir1)]
388
406
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
391
409
def test_repeated_file_id(self):
392
410
inv = self.get_empty_inventory()
393
file1 = inventory.InventoryFile(b'id', 'path1', inv.root.file_id)
411
file1 = inventory.InventoryFile('id', 'path1', inv.root.file_id)
394
412
file1.revision = b'result'
395
413
file1.text_size = 0
396
file1.text_sha1 = b""
397
415
file2 = file1.copy()
398
416
file2.name = 'path2'
399
delta = [(None, u'path1', b'id', file1),
400
(None, u'path2', b'id', file2)]
417
delta = [(None, u'path1', 'id', file1), (None, u'path2', 'id', file2)]
401
418
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
404
421
def test_repeated_new_path(self):
405
422
inv = self.get_empty_inventory()
406
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
423
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
407
424
file1.revision = b'result'
408
425
file1.text_size = 0
409
file1.text_sha1 = b""
410
427
file2 = file1.copy()
411
file2.file_id = b'id2'
412
delta = [(None, u'path', b'id1', file1),
413
(None, u'path', b'id2', file2)]
428
file2.file_id = 'id2'
429
delta = [(None, u'path', 'id1', file1), (None, u'path', 'id2', file2)]
414
430
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
417
433
def test_repeated_old_path(self):
418
434
inv = self.get_empty_inventory()
419
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
435
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
420
436
file1.revision = b'result'
421
437
file1.text_size = 0
422
file1.text_sha1 = b""
423
439
# We can't *create* a source inventory with the same path, but
424
440
# a badly generated partial delta might claim the same source twice.
425
441
# This would be buggy in two ways: the path is repeated in the delta,
426
442
# And the path for one of the file ids doesn't match the source
427
443
# location. Alternatively, we could have a repeated fileid, but that
428
444
# is separately checked for.
429
file2 = inventory.InventoryFile(b'id2', 'path2', inv.root.file_id)
445
file2 = inventory.InventoryFile('id2', 'path2', inv.root.file_id)
430
446
file2.revision = b'result'
431
447
file2.text_size = 0
432
file2.text_sha1 = b""
435
delta = [(u'path', None, b'id1', None), (u'path', None, b'id2', None)]
451
delta = [(u'path', None, 'id1', None), (u'path', None, 'id2', None)]
436
452
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
439
455
def test_mismatched_id_entry_id(self):
440
456
inv = self.get_empty_inventory()
441
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
457
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
442
458
file1.revision = b'result'
443
459
file1.text_size = 0
444
file1.text_sha1 = b""
445
delta = [(None, u'path', b'id', file1)]
461
delta = [(None, u'path', 'id', file1)]
446
462
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
449
465
def test_mismatched_new_path_entry_None(self):
450
466
inv = self.get_empty_inventory()
451
delta = [(None, u'path', b'id', None)]
467
delta = [(None, u'path', 'id', None)]
452
468
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
455
471
def test_mismatched_new_path_None_entry(self):
456
472
inv = self.get_empty_inventory()
457
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
473
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
458
474
file1.revision = b'result'
459
475
file1.text_size = 0
460
file1.text_sha1 = b""
461
delta = [(u"path", None, b'id1', file1)]
477
delta = [(u"path", None, 'id1', file1)]
462
478
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
465
481
def test_parent_is_not_directory(self):
466
482
inv = self.get_empty_inventory()
467
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
483
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
468
484
file1.revision = b'result'
469
485
file1.text_size = 0
470
file1.text_sha1 = b""
471
file2 = inventory.InventoryFile(b'id2', 'path2', b'id1')
487
file2 = inventory.InventoryFile('id2', 'path2', 'id1')
472
488
file2.revision = b'result'
473
489
file2.text_size = 0
474
file2.text_sha1 = b""
476
delta = [(None, u'path/path2', b'id2', file2)]
492
delta = [(None, u'path/path2', 'id2', file2)]
477
493
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
480
496
def test_parent_is_missing(self):
481
497
inv = self.get_empty_inventory()
482
file2 = inventory.InventoryFile(b'id2', 'path2', b'missingparent')
498
file2 = inventory.InventoryFile('id2', 'path2', 'missingparent')
483
499
file2.revision = b'result'
484
500
file2.text_size = 0
485
file2.text_sha1 = b""
486
delta = [(None, u'path/path2', b'id2', file2)]
502
delta = [(None, u'path/path2', 'id2', file2)]
487
503
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
490
506
def test_new_parent_path_has_wrong_id(self):
491
507
inv = self.get_empty_inventory()
492
parent1 = inventory.InventoryDirectory(b'p-1', 'dir', inv.root.file_id)
508
parent1 = inventory.InventoryDirectory('p-1', 'dir', inv.root.file_id)
493
509
parent1.revision = b'result'
494
parent2 = inventory.InventoryDirectory(
495
b'p-2', 'dir2', inv.root.file_id)
510
parent2 = inventory.InventoryDirectory('p-2', 'dir2', inv.root.file_id)
496
511
parent2.revision = b'result'
497
file1 = inventory.InventoryFile(b'id', 'path', b'p-2')
512
file1 = inventory.InventoryFile('id', 'path', 'p-2')
498
513
file1.revision = b'result'
499
514
file1.text_size = 0
500
file1.text_sha1 = b""
503
518
# This delta claims that file1 is at dir/path, but actually its at
504
519
# dir2/path if you follow the inventory parent structure.
505
delta = [(None, u'dir/path', b'id', file1)]
520
delta = [(None, u'dir/path', 'id', file1)]
506
521
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
509
524
def test_old_parent_path_is_wrong(self):
510
525
inv = self.get_empty_inventory()
511
parent1 = inventory.InventoryDirectory(b'p-1', 'dir', inv.root.file_id)
526
parent1 = inventory.InventoryDirectory('p-1', 'dir', inv.root.file_id)
512
527
parent1.revision = b'result'
513
parent2 = inventory.InventoryDirectory(
514
b'p-2', 'dir2', inv.root.file_id)
528
parent2 = inventory.InventoryDirectory('p-2', 'dir2', inv.root.file_id)
515
529
parent2.revision = b'result'
516
file1 = inventory.InventoryFile(b'id', 'path', b'p-2')
530
file1 = inventory.InventoryFile('id', 'path', 'p-2')
517
531
file1.revision = b'result'
518
532
file1.text_size = 0
519
file1.text_sha1 = b""
523
537
# This delta claims that file1 was at dir/path, but actually it was at
524
538
# dir2/path if you follow the inventory parent structure.
525
delta = [(u'dir/path', None, b'id', None)]
539
delta = [(u'dir/path', None, 'id', None)]
526
540
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
529
543
def test_old_parent_path_is_for_other_id(self):
530
544
inv = self.get_empty_inventory()
531
parent1 = inventory.InventoryDirectory(b'p-1', 'dir', inv.root.file_id)
545
parent1 = inventory.InventoryDirectory('p-1', 'dir', inv.root.file_id)
532
546
parent1.revision = b'result'
533
parent2 = inventory.InventoryDirectory(
534
b'p-2', 'dir2', inv.root.file_id)
547
parent2 = inventory.InventoryDirectory('p-2', 'dir2', inv.root.file_id)
535
548
parent2.revision = b'result'
536
file1 = inventory.InventoryFile(b'id', 'path', b'p-2')
549
file1 = inventory.InventoryFile('id', 'path', 'p-2')
537
550
file1.revision = b'result'
538
551
file1.text_size = 0
539
file1.text_sha1 = b""
540
file2 = inventory.InventoryFile(b'id2', 'path', b'p-1')
553
file2 = inventory.InventoryFile('id2', 'path', 'p-1')
541
554
file2.revision = b'result'
542
555
file2.text_size = 0
543
file2.text_sha1 = b""
548
561
# This delta claims that file1 was at dir/path, but actually it was at
549
562
# dir2/path if you follow the inventory parent structure. At dir/path
550
563
# is another entry we should not delete.
551
delta = [(u'dir/path', None, b'id', None)]
564
delta = [(u'dir/path', None, 'id', None)]
552
565
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
555
568
def test_add_existing_id_new_path(self):
556
569
inv = self.get_empty_inventory()
557
parent1 = inventory.InventoryDirectory(
558
b'p-1', 'dir1', inv.root.file_id)
570
parent1 = inventory.InventoryDirectory('p-1', 'dir1', inv.root.file_id)
559
571
parent1.revision = b'result'
560
parent2 = inventory.InventoryDirectory(
561
b'p-1', 'dir2', inv.root.file_id)
572
parent2 = inventory.InventoryDirectory('p-1', 'dir2', inv.root.file_id)
562
573
parent2.revision = b'result'
564
delta = [(None, u'dir2', b'p-1', parent2)]
575
delta = [(None, u'dir2', 'p-1', parent2)]
565
576
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
568
579
def test_add_new_id_existing_path(self):
569
580
inv = self.get_empty_inventory()
570
parent1 = inventory.InventoryDirectory(
571
b'p-1', 'dir1', inv.root.file_id)
581
parent1 = inventory.InventoryDirectory('p-1', 'dir1', inv.root.file_id)
572
582
parent1.revision = b'result'
573
parent2 = inventory.InventoryDirectory(
574
b'p-2', 'dir1', inv.root.file_id)
583
parent2 = inventory.InventoryDirectory('p-2', 'dir1', inv.root.file_id)
575
584
parent2.revision = b'result'
577
delta = [(None, u'dir1', b'p-2', parent2)]
586
delta = [(None, u'dir1', 'p-2', parent2)]
578
587
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
581
590
def test_remove_dir_leaving_dangling_child(self):
582
591
inv = self.get_empty_inventory()
583
dir1 = inventory.InventoryDirectory(b'p-1', 'dir1', inv.root.file_id)
592
dir1 = inventory.InventoryDirectory('p-1', 'dir1', inv.root.file_id)
584
593
dir1.revision = b'result'
585
dir2 = inventory.InventoryDirectory(b'p-2', 'child1', b'p-1')
594
dir2 = inventory.InventoryDirectory('p-2', 'child1', 'p-1')
586
595
dir2.revision = b'result'
587
dir3 = inventory.InventoryDirectory(b'p-3', 'child2', b'p-1')
596
dir3 = inventory.InventoryDirectory('p-3', 'child2', 'p-1')
588
597
dir3.revision = b'result'
592
delta = [(u'dir1', None, b'p-1', None),
593
(u'dir1/child2', None, b'p-3', None)]
601
delta = [(u'dir1', None, 'p-1', None),
602
(u'dir1/child2', None, 'p-3', None)]
594
603
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
597
606
def test_add_file(self):
598
607
inv = self.get_empty_inventory()
599
608
file1 = inventory.InventoryFile(b'file-id', 'path', inv.root.file_id)
600
609
file1.revision = b'result'
601
610
file1.text_size = 0
602
file1.text_sha1 = b''
603
612
delta = [(None, u'path', b'file-id', file1)]
604
613
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
605
614
self.assertEqual(b'file-id', res_inv.get_entry(b'file-id').file_id)
698
703
def test_file_invalid_entry_name(self):
699
704
self.assertRaises(errors.InvalidEntryName, inventory.InventoryFile,
700
b'123', 'a/hello.c', ROOT_ID)
705
'123', 'a/hello.c', ROOT_ID)
702
707
def test_file_backslash(self):
703
file = inventory.InventoryFile(b'123', 'h\\ello.c', ROOT_ID)
708
file = inventory.InventoryFile('123', 'h\\ello.c', ROOT_ID)
704
709
self.assertEquals(file.name, 'h\\ello.c')
706
711
def test_file_kind_character(self):
707
file = inventory.InventoryFile(b'123', 'hello.c', ROOT_ID)
712
file = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
708
713
self.assertEqual(file.kind_character(), '')
710
715
def test_dir_kind_character(self):
711
dir = inventory.InventoryDirectory(b'123', 'hello.c', ROOT_ID)
716
dir = inventory.InventoryDirectory('123', 'hello.c', ROOT_ID)
712
717
self.assertEqual(dir.kind_character(), '/')
714
719
def test_link_kind_character(self):
715
dir = inventory.InventoryLink(b'123', 'hello.c', ROOT_ID)
720
dir = inventory.InventoryLink('123', 'hello.c', ROOT_ID)
716
721
self.assertEqual(dir.kind_character(), '')
718
def test_link_kind_character(self):
719
dir = TreeReference(b'123', 'hello.c', ROOT_ID)
720
self.assertEqual(dir.kind_character(), '+')
722
723
def test_dir_detect_changes(self):
723
left = inventory.InventoryDirectory(b'123', 'hello.c', ROOT_ID)
724
right = inventory.InventoryDirectory(b'123', 'hello.c', ROOT_ID)
724
left = inventory.InventoryDirectory('123', 'hello.c', ROOT_ID)
725
right = inventory.InventoryDirectory('123', 'hello.c', ROOT_ID)
725
726
self.assertEqual((False, False), left.detect_changes(right))
726
727
self.assertEqual((False, False), right.detect_changes(left))
728
729
def test_file_detect_changes(self):
729
left = inventory.InventoryFile(b'123', 'hello.c', ROOT_ID)
730
left = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
730
731
left.text_sha1 = 123
731
right = inventory.InventoryFile(b'123', 'hello.c', ROOT_ID)
732
right = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
732
733
right.text_sha1 = 123
733
734
self.assertEqual((False, False), left.detect_changes(right))
734
735
self.assertEqual((False, False), right.detect_changes(left))
854
855
def read_bytes(self, chk_bytes, key):
855
856
stream = chk_bytes.get_record_stream([key], 'unordered', True)
856
return next(stream).get_bytes_as("fulltext")
857
return stream.next().get_bytes_as("fulltext")
858
859
def test_deserialise_gives_CHKInventory(self):
859
860
inv = Inventory()
860
inv.revision_id = b"revid"
861
inv.root.revision = b"rootrev"
861
inv.revision_id = "revid"
862
inv.root.revision = "rootrev"
862
863
chk_bytes = self.get_chk_bytes()
863
864
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
864
lines = chk_inv.to_lines()
865
new_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
866
self.assertEqual(b"revid", new_inv.revision_id)
865
bytes = ''.join(chk_inv.to_lines())
866
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
867
self.assertEqual("revid", new_inv.revision_id)
867
868
self.assertEqual("directory", new_inv.root.kind)
868
869
self.assertEqual(inv.root.file_id, new_inv.root.file_id)
869
870
self.assertEqual(inv.root.parent_id, new_inv.root.parent_id)
870
871
self.assertEqual(inv.root.name, new_inv.root.name)
871
self.assertEqual(b"rootrev", new_inv.root.revision)
872
self.assertEqual(b'plain', new_inv._search_key_name)
872
self.assertEqual("rootrev", new_inv.root.revision)
873
self.assertEqual('plain', new_inv._search_key_name)
874
875
def test_deserialise_wrong_revid(self):
875
876
inv = Inventory()
876
inv.revision_id = b"revid"
877
inv.root.revision = b"rootrev"
877
inv.revision_id = "revid"
878
inv.root.revision = "rootrev"
878
879
chk_bytes = self.get_chk_bytes()
879
880
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
880
lines = chk_inv.to_lines()
881
bytes = ''.join(chk_inv.to_lines())
881
882
self.assertRaises(ValueError, CHKInventory.deserialise, chk_bytes,
884
885
def test_captures_rev_root_byid(self):
885
886
inv = Inventory()
886
inv.revision_id = b"foo"
887
inv.root.revision = b"bar"
887
inv.revision_id = "foo"
888
inv.root.revision = "bar"
888
889
chk_bytes = self.get_chk_bytes()
889
890
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
890
891
lines = chk_inv.to_lines()
891
892
self.assertEqual([
893
b'revision_id: foo\n',
894
b'root_id: TREE_ROOT\n',
895
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
896
b'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
894
'revision_id: foo\n',
895
'root_id: TREE_ROOT\n',
896
'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
897
'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
898
chk_inv = CHKInventory.deserialise(
899
chk_bytes, lines, (b'foo',))
900
self.assertEqual(b'plain', chk_inv._search_key_name)
899
chk_inv = CHKInventory.deserialise(chk_bytes, ''.join(lines), ('foo',))
900
self.assertEqual('plain', chk_inv._search_key_name)
902
902
def test_captures_parent_id_basename_index(self):
903
903
inv = Inventory()
904
inv.revision_id = b"foo"
905
inv.root.revision = b"bar"
904
inv.revision_id = "foo"
905
inv.root.revision = "bar"
906
906
chk_bytes = self.get_chk_bytes()
907
907
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
908
908
lines = chk_inv.to_lines()
909
909
self.assertEqual([
911
b'revision_id: foo\n',
912
b'root_id: TREE_ROOT\n',
913
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
914
b'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
911
'revision_id: foo\n',
912
'root_id: TREE_ROOT\n',
913
'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
914
'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
916
chk_inv = CHKInventory.deserialise(
917
chk_bytes, lines, (b'foo',))
918
self.assertEqual(b'plain', chk_inv._search_key_name)
916
chk_inv = CHKInventory.deserialise(chk_bytes, ''.join(lines), ('foo',))
917
self.assertEqual('plain', chk_inv._search_key_name)
920
919
def test_captures_search_key_name(self):
921
920
inv = Inventory()
922
inv.revision_id = b"foo"
923
inv.root.revision = b"bar"
921
inv.revision_id = "foo"
922
inv.root.revision = "bar"
924
923
chk_bytes = self.get_chk_bytes()
925
924
chk_inv = CHKInventory.from_inventory(chk_bytes, inv,
926
search_key_name=b'hash-16-way')
925
search_key_name='hash-16-way')
927
926
lines = chk_inv.to_lines()
928
927
self.assertEqual([
930
b'search_key_name: hash-16-way\n',
931
b'root_id: TREE_ROOT\n',
932
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
933
b'revision_id: foo\n',
934
b'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
929
'search_key_name: hash-16-way\n',
930
'root_id: TREE_ROOT\n',
931
'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
932
'revision_id: foo\n',
933
'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
936
chk_inv = CHKInventory.deserialise(
937
chk_bytes, lines, (b'foo',))
938
self.assertEqual(b'hash-16-way', chk_inv._search_key_name)
935
chk_inv = CHKInventory.deserialise(chk_bytes, ''.join(lines), ('foo',))
936
self.assertEqual('hash-16-way', chk_inv._search_key_name)
940
938
def test_directory_children_on_demand(self):
941
939
inv = Inventory()
942
inv.revision_id = b"revid"
943
inv.root.revision = b"rootrev"
944
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
945
inv.get_entry(b"fileid").revision = b"filerev"
946
inv.get_entry(b"fileid").executable = True
947
inv.get_entry(b"fileid").text_sha1 = b"ffff"
948
inv.get_entry(b"fileid").text_size = 1
940
inv.revision_id = "revid"
941
inv.root.revision = "rootrev"
942
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
943
inv.get_entry("fileid").revision = "filerev"
944
inv.get_entry("fileid").executable = True
945
inv.get_entry("fileid").text_sha1 = "ffff"
946
inv.get_entry("fileid").text_size = 1
949
947
chk_bytes = self.get_chk_bytes()
950
948
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
951
lines = chk_inv.to_lines()
952
new_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
949
bytes = ''.join(chk_inv.to_lines())
950
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
953
951
root_entry = new_inv.get_entry(inv.root.file_id)
954
952
self.assertEqual(None, root_entry._children)
955
953
self.assertEqual({'file'}, set(root_entry.children))
956
file_direct = new_inv.get_entry(b"fileid")
954
file_direct = new_inv.get_entry("fileid")
957
955
file_found = root_entry.children['file']
958
956
self.assertEqual(file_direct.kind, file_found.kind)
959
957
self.assertEqual(file_direct.file_id, file_found.file_id)
982
980
def test_iter_all_ids(self):
983
981
inv = Inventory()
984
inv.revision_id = b"revid"
985
inv.root.revision = b"rootrev"
986
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
987
inv.get_entry(b"fileid").revision = b"filerev"
988
inv.get_entry(b"fileid").executable = True
989
inv.get_entry(b"fileid").text_sha1 = b"ffff"
990
inv.get_entry(b"fileid").text_size = 1
982
inv.revision_id = "revid"
983
inv.root.revision = "rootrev"
984
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
985
inv.get_entry("fileid").revision = "filerev"
986
inv.get_entry("fileid").executable = True
987
inv.get_entry("fileid").text_sha1 = "ffff"
988
inv.get_entry("fileid").text_size = 1
991
989
chk_bytes = self.get_chk_bytes()
992
990
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
993
lines = chk_inv.to_lines()
994
new_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
991
bytes = ''.join(chk_inv.to_lines())
992
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
995
993
fileids = sorted(new_inv.iter_all_ids())
996
self.assertEqual([inv.root.file_id, b"fileid"], fileids)
994
self.assertEqual([inv.root.file_id, "fileid"], fileids)
998
996
def test__len__(self):
999
997
inv = Inventory()
1000
inv.revision_id = b"revid"
1001
inv.root.revision = b"rootrev"
1002
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1003
inv.get_entry(b"fileid").revision = b"filerev"
1004
inv.get_entry(b"fileid").executable = True
1005
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1006
inv.get_entry(b"fileid").text_size = 1
998
inv.revision_id = "revid"
999
inv.root.revision = "rootrev"
1000
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
1001
inv.get_entry("fileid").revision = "filerev"
1002
inv.get_entry("fileid").executable = True
1003
inv.get_entry("fileid").text_sha1 = "ffff"
1004
inv.get_entry("fileid").text_size = 1
1007
1005
chk_bytes = self.get_chk_bytes()
1008
1006
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1009
1007
self.assertEqual(2, len(chk_inv))
1091
1089
inv.add(fileentry)
1092
1090
inv.get_entry(b"fileid").revision = b"filerev"
1093
1091
inv.get_entry(b"fileid").executable = True
1094
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1092
inv.get_entry(b"fileid").text_sha1 = "ffff"
1095
1093
inv.get_entry(b"fileid").text_size = 1
1096
1094
inv.get_entry(b"dirid").revision = b"filerev"
1097
1095
chk_bytes = self.get_chk_bytes()
1098
1096
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1099
lines = chk_inv.to_lines()
1100
new_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1097
bytes = ''.join(chk_inv.to_lines())
1098
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1101
1099
self.assertEqual(inv.root.file_id, new_inv.path2id(''))
1102
1100
self.assertEqual(b'dirid', new_inv.path2id('dir'))
1103
1101
self.assertEqual(b'fileid', new_inv.path2id('dir/file'))
1105
1103
def test_create_by_apply_delta_sets_root(self):
1106
1104
inv = Inventory()
1107
inv.root.revision = b"myrootrev"
1108
inv.revision_id = b"revid"
1105
inv.revision_id = "revid"
1109
1106
chk_bytes = self.get_chk_bytes()
1110
1107
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1111
inv.add_path("", "directory", b"myrootid", None)
1112
inv.revision_id = b"expectedid"
1113
inv.root.revision = b"myrootrev"
1108
inv.add_path("", "directory", "myrootid", None)
1109
inv.revision_id = "expectedid"
1114
1110
reference_inv = CHKInventory.from_inventory(chk_bytes, inv)
1115
1111
delta = [("", None, base_inv.root.file_id, None),
1116
(None, "", b"myrootid", inv.root)]
1117
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1112
(None, "", "myrootid", inv.root)]
1113
new_inv = base_inv.create_by_apply_delta(delta, "expectedid")
1118
1114
self.assertEqual(reference_inv.root, new_inv.root)
1120
1116
def test_create_by_apply_delta_empty_add_child(self):
1121
1117
inv = Inventory()
1122
inv.revision_id = b"revid"
1123
inv.root.revision = b"rootrev"
1118
inv.revision_id = "revid"
1119
inv.root.revision = "rootrev"
1124
1120
chk_bytes = self.get_chk_bytes()
1125
1121
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1126
a_entry = InventoryFile(b"A-id", "A", inv.root.file_id)
1127
a_entry.revision = b"filerev"
1122
a_entry = InventoryFile("A-id", "A", inv.root.file_id)
1123
a_entry.revision = "filerev"
1128
1124
a_entry.executable = True
1129
a_entry.text_sha1 = b"ffff"
1125
a_entry.text_sha1 = "ffff"
1130
1126
a_entry.text_size = 1
1131
1127
inv.add(a_entry)
1132
inv.revision_id = b"expectedid"
1128
inv.revision_id = "expectedid"
1133
1129
reference_inv = CHKInventory.from_inventory(chk_bytes, inv)
1134
delta = [(None, "A", b"A-id", a_entry)]
1135
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1130
delta = [(None, "A", "A-id", a_entry)]
1131
new_inv = base_inv.create_by_apply_delta(delta, "expectedid")
1136
1132
# new_inv should be the same as reference_inv.
1137
1133
self.assertEqual(reference_inv.revision_id, new_inv.revision_id)
1138
1134
self.assertEqual(reference_inv.root_id, new_inv.root_id)
1139
1135
reference_inv.id_to_entry._ensure_root()
1140
1136
new_inv.id_to_entry._ensure_root()
1141
1137
self.assertEqual(reference_inv.id_to_entry._root_node._key,
1142
new_inv.id_to_entry._root_node._key)
1138
new_inv.id_to_entry._root_node._key)
1144
1140
def test_create_by_apply_delta_empty_add_child_updates_parent_id(self):
1145
1141
inv = Inventory()
1146
inv.revision_id = b"revid"
1147
inv.root.revision = b"rootrev"
1142
inv.revision_id = "revid"
1143
inv.root.revision = "rootrev"
1148
1144
chk_bytes = self.get_chk_bytes()
1149
1145
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1150
a_entry = InventoryFile(b"A-id", "A", inv.root.file_id)
1151
a_entry.revision = b"filerev"
1146
a_entry = InventoryFile("A-id", "A", inv.root.file_id)
1147
a_entry.revision = "filerev"
1152
1148
a_entry.executable = True
1153
a_entry.text_sha1 = b"ffff"
1149
a_entry.text_sha1 = "ffff"
1154
1150
a_entry.text_size = 1
1155
1151
inv.add(a_entry)
1156
inv.revision_id = b"expectedid"
1152
inv.revision_id = "expectedid"
1157
1153
reference_inv = CHKInventory.from_inventory(chk_bytes, inv)
1158
delta = [(None, "A", b"A-id", a_entry)]
1159
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1154
delta = [(None, "A", "A-id", a_entry)]
1155
new_inv = base_inv.create_by_apply_delta(delta, "expectedid")
1160
1156
reference_inv.id_to_entry._ensure_root()
1161
1157
reference_inv.parent_id_basename_to_file_id._ensure_root()
1162
1158
new_inv.id_to_entry._ensure_root()
1165
1161
self.assertEqual(reference_inv.revision_id, new_inv.revision_id)
1166
1162
self.assertEqual(reference_inv.root_id, new_inv.root_id)
1167
1163
self.assertEqual(reference_inv.id_to_entry._root_node._key,
1168
new_inv.id_to_entry._root_node._key)
1164
new_inv.id_to_entry._root_node._key)
1169
1165
self.assertEqual(reference_inv.parent_id_basename_to_file_id._root_node._key,
1170
new_inv.parent_id_basename_to_file_id._root_node._key)
1166
new_inv.parent_id_basename_to_file_id._root_node._key)
1172
1168
def test_iter_changes(self):
1173
1169
# Low level bootstrapping smoke test; comprehensive generic tests via
1174
1170
# InterTree are coming.
1175
1171
inv = Inventory()
1176
inv.revision_id = b"revid"
1177
inv.root.revision = b"rootrev"
1178
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1179
inv.get_entry(b"fileid").revision = b"filerev"
1180
inv.get_entry(b"fileid").executable = True
1181
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1182
inv.get_entry(b"fileid").text_size = 1
1172
inv.revision_id = "revid"
1173
inv.root.revision = "rootrev"
1174
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
1175
inv.get_entry("fileid").revision = "filerev"
1176
inv.get_entry("fileid").executable = True
1177
inv.get_entry("fileid").text_sha1 = "ffff"
1178
inv.get_entry("fileid").text_size = 1
1183
1179
inv2 = Inventory()
1184
inv2.revision_id = b"revid2"
1185
inv2.root.revision = b"rootrev"
1186
inv2.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1187
inv2.get_entry(b"fileid").revision = b"filerev2"
1188
inv2.get_entry(b"fileid").executable = False
1189
inv2.get_entry(b"fileid").text_sha1 = b"bbbb"
1190
inv2.get_entry(b"fileid").text_size = 2
1180
inv2.revision_id = "revid2"
1181
inv2.root.revision = "rootrev"
1182
inv2.add(InventoryFile("fileid", "file", inv.root.file_id))
1183
inv2.get_entry("fileid").revision = "filerev2"
1184
inv2.get_entry("fileid").executable = False
1185
inv2.get_entry("fileid").text_sha1 = "bbbb"
1186
inv2.get_entry("fileid").text_size = 2
1191
1187
# get fresh objects.
1192
1188
chk_bytes = self.get_chk_bytes()
1193
1189
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1194
lines = chk_inv.to_lines()
1195
inv_1 = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1190
bytes = ''.join(chk_inv.to_lines())
1191
inv_1 = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1196
1192
chk_inv2 = CHKInventory.from_inventory(chk_bytes, inv2)
1197
lines = chk_inv2.to_lines()
1198
inv_2 = CHKInventory.deserialise(chk_bytes, lines, (b"revid2",))
1199
self.assertEqual([(b'fileid', (u'file', u'file'), True, (True, True),
1200
(b'TREE_ROOT', b'TREE_ROOT'), (u'file',
1201
u'file'), ('file', 'file'),
1203
list(inv_1.iter_changes(inv_2)))
1193
bytes = ''.join(chk_inv2.to_lines())
1194
inv_2 = CHKInventory.deserialise(chk_bytes, bytes, ("revid2",))
1195
self.assertEqual([('fileid', (u'file', u'file'), True, (True, True),
1196
('TREE_ROOT', 'TREE_ROOT'), (u'file', u'file'), ('file', 'file'),
1198
list(inv_1.iter_changes(inv_2)))
1205
1200
def test_parent_id_basename_to_file_id_index_enabled(self):
1206
1201
inv = Inventory()
1207
inv.revision_id = b"revid"
1208
inv.root.revision = b"rootrev"
1209
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1210
inv.get_entry(b"fileid").revision = b"filerev"
1211
inv.get_entry(b"fileid").executable = True
1212
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1213
inv.get_entry(b"fileid").text_size = 1
1202
inv.revision_id = "revid"
1203
inv.root.revision = "rootrev"
1204
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
1205
inv.get_entry("fileid").revision = "filerev"
1206
inv.get_entry("fileid").executable = True
1207
inv.get_entry("fileid").text_sha1 = "ffff"
1208
inv.get_entry("fileid").text_size = 1
1214
1209
# get fresh objects.
1215
1210
chk_bytes = self.get_chk_bytes()
1216
1211
tmp_inv = CHKInventory.from_inventory(chk_bytes, inv)
1217
lines = tmp_inv.to_lines()
1218
chk_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1219
self.assertIsInstance(
1220
chk_inv.parent_id_basename_to_file_id, chk_map.CHKMap)
1212
bytes = ''.join(tmp_inv.to_lines())
1213
chk_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1214
self.assertIsInstance(chk_inv.parent_id_basename_to_file_id, chk_map.CHKMap)
1221
1215
self.assertEqual(
1222
{(b'', b''): b'TREE_ROOT', (b'TREE_ROOT', b'file'): b'fileid'},
1216
{('', ''): 'TREE_ROOT', ('TREE_ROOT', 'file'): 'fileid'},
1223
1217
dict(chk_inv.parent_id_basename_to_file_id.iteritems()))
1225
1219
def test_file_entry_to_bytes(self):
1226
1220
inv = CHKInventory(None)
1227
ie = inventory.InventoryFile(b'file-id', 'filename', b'parent-id')
1221
ie = inventory.InventoryFile(b'file-id', 'filename', 'parent-id')
1228
1222
ie.executable = True
1229
1223
ie.revision = b'file-rev-id'
1230
ie.text_sha1 = b'abcdefgh'
1224
ie.text_sha1 = 'abcdefgh'
1231
1225
ie.text_size = 100
1232
1226
bytes = inv._entry_to_bytes(ie)
1233
1227
self.assertEqual(b'file: file-id\nparent-id\nfilename\n'
1234
1228
b'file-rev-id\nabcdefgh\n100\nY', bytes)
1235
1229
ie2 = inv._bytes_to_entry(bytes)
1236
1230
self.assertEqual(ie, ie2)
1237
self.assertIsInstance(ie2.name, text_type)
1238
self.assertEqual((b'filename', b'file-id', b'file-rev-id'),
1231
self.assertIsInstance(ie2.name, unicode)
1232
self.assertEqual(('filename', b'file-id', b'file-rev-id'),
1239
1233
inv._bytes_to_utf8name_key(bytes))
1241
1235
def test_file2_entry_to_bytes(self):
1277
1271
b'dir-rev-id', bytes)
1278
1272
ie2 = inv._bytes_to_entry(bytes)
1279
1273
self.assertEqual(ie, ie2)
1280
self.assertIsInstance(ie2.name, text_type)
1274
self.assertIsInstance(ie2.name, unicode)
1281
1275
self.assertIs(ie2.parent_id, None)
1282
self.assertEqual((b'dir\xce\xa9name', b'dir-id', b'dir-rev-id'),
1276
self.assertEqual(('dir\xce\xa9name', b'dir-id', b'dir-rev-id'),
1283
1277
inv._bytes_to_utf8name_key(bytes))
1285
1279
def test_symlink_entry_to_bytes(self):
1286
1280
inv = CHKInventory(None)
1287
ie = inventory.InventoryLink(b'link-id', 'linkname', b'parent-id')
1288
ie.revision = b'link-rev-id'
1281
ie = inventory.InventoryLink('link-id', 'linkname', 'parent-id')
1282
ie.revision = 'link-rev-id'
1289
1283
ie.symlink_target = u'target/path'
1290
1284
bytes = inv._entry_to_bytes(ie)
1291
self.assertEqual(b'symlink: link-id\nparent-id\nlinkname\n'
1292
b'link-rev-id\ntarget/path', bytes)
1285
self.assertEqual('symlink: link-id\nparent-id\nlinkname\n'
1286
'link-rev-id\ntarget/path', bytes)
1293
1287
ie2 = inv._bytes_to_entry(bytes)
1294
1288
self.assertEqual(ie, ie2)
1295
self.assertIsInstance(ie2.name, text_type)
1296
self.assertIsInstance(ie2.symlink_target, text_type)
1297
self.assertEqual((b'linkname', b'link-id', b'link-rev-id'),
1289
self.assertIsInstance(ie2.name, unicode)
1290
self.assertIsInstance(ie2.symlink_target, unicode)
1291
self.assertEqual(('linkname', 'link-id', 'link-rev-id'),
1298
1292
inv._bytes_to_utf8name_key(bytes))
1300
1294
def test_symlink2_entry_to_bytes(self):
1301
1295
inv = CHKInventory(None)
1302
ie = inventory.InventoryLink(
1303
b'link-id', u'link\u03a9name', b'parent-id')
1304
ie.revision = b'link-rev-id'
1296
ie = inventory.InventoryLink('link-id', u'link\u03a9name', 'parent-id')
1297
ie.revision = 'link-rev-id'
1305
1298
ie.symlink_target = u'target/\u03a9path'
1306
1299
bytes = inv._entry_to_bytes(ie)
1307
self.assertEqual(b'symlink: link-id\nparent-id\nlink\xce\xa9name\n'
1308
b'link-rev-id\ntarget/\xce\xa9path', bytes)
1300
self.assertEqual('symlink: link-id\nparent-id\nlink\xce\xa9name\n'
1301
'link-rev-id\ntarget/\xce\xa9path', bytes)
1309
1302
ie2 = inv._bytes_to_entry(bytes)
1310
1303
self.assertEqual(ie, ie2)
1311
self.assertIsInstance(ie2.name, text_type)
1312
self.assertIsInstance(ie2.symlink_target, text_type)
1313
self.assertEqual((b'link\xce\xa9name', b'link-id', b'link-rev-id'),
1304
self.assertIsInstance(ie2.name, unicode)
1305
self.assertIsInstance(ie2.symlink_target, unicode)
1306
self.assertEqual(('link\xce\xa9name', 'link-id', 'link-rev-id'),
1314
1307
inv._bytes_to_utf8name_key(bytes))
1316
1309
def test_tree_reference_entry_to_bytes(self):
1317
1310
inv = CHKInventory(None)
1318
ie = inventory.TreeReference(b'tree-root-id', u'tree\u03a9name',
1320
ie.revision = b'tree-rev-id'
1311
ie = inventory.TreeReference('tree-root-id', u'tree\u03a9name',
1313
ie.revision = 'tree-rev-id'
1321
1314
ie.reference_revision = b'ref-rev-id'
1322
1315
bytes = inv._entry_to_bytes(ie)
1323
self.assertEqual(b'tree: tree-root-id\nparent-id\ntree\xce\xa9name\n'
1324
b'tree-rev-id\nref-rev-id', bytes)
1316
self.assertEqual('tree: tree-root-id\nparent-id\ntree\xce\xa9name\n'
1317
'tree-rev-id\nref-rev-id', bytes)
1325
1318
ie2 = inv._bytes_to_entry(bytes)
1326
1319
self.assertEqual(ie, ie2)
1327
self.assertIsInstance(ie2.name, text_type)
1328
self.assertEqual((b'tree\xce\xa9name', b'tree-root-id', b'tree-rev-id'),
1320
self.assertIsInstance(ie2.name, unicode)
1321
self.assertEqual(('tree\xce\xa9name', 'tree-root-id', 'tree-rev-id'),
1329
1322
inv._bytes_to_utf8name_key(bytes))
1331
1324
def make_basic_utf8_inventory(self):
1332
1325
inv = Inventory()
1333
inv.revision_id = b"revid"
1334
inv.root.revision = b"rootrev"
1326
inv.revision_id = "revid"
1327
inv.root.revision = "rootrev"
1335
1328
root_id = inv.root.file_id
1336
inv.add(InventoryFile(b"fileid", u'f\xefle', root_id))
1337
inv.get_entry(b"fileid").revision = b"filerev"
1338
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1339
inv.get_entry(b"fileid").text_size = 0
1340
inv.add(InventoryDirectory(b"dirid", u'dir-\N{EURO SIGN}', root_id))
1341
inv.get_entry(b"dirid").revision = b"dirrev"
1342
inv.add(InventoryFile(b"childid", u'ch\xefld', b"dirid"))
1343
inv.get_entry(b"childid").revision = b"filerev"
1344
inv.get_entry(b"childid").text_sha1 = b"ffff"
1345
inv.get_entry(b"childid").text_size = 0
1329
inv.add(InventoryFile("fileid", u'f\xefle', root_id))
1330
inv.get_entry("fileid").revision = "filerev"
1331
inv.get_entry("fileid").text_sha1 = "ffff"
1332
inv.get_entry("fileid").text_size = 0
1333
inv.add(InventoryDirectory("dirid", u'dir-\N{EURO SIGN}', root_id))
1334
inv.add(InventoryFile("childid", u'ch\xefld', "dirid"))
1335
inv.get_entry("childid").revision = "filerev"
1336
inv.get_entry("childid").text_sha1 = "ffff"
1337
inv.get_entry("childid").text_size = 0
1346
1338
chk_bytes = self.get_chk_bytes()
1347
1339
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1348
lines = chk_inv.to_lines()
1349
return CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1340
bytes = ''.join(chk_inv.to_lines())
1341
return CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1351
1343
def test__preload_handles_utf8(self):
1352
1344
new_inv = self.make_basic_utf8_inventory()
1354
1346
self.assertFalse(new_inv._fully_cached)
1355
1347
new_inv._preload_cache()
1356
1348
self.assertEqual(
1357
sorted([new_inv.root_id, b"fileid", b"dirid", b"childid"]),
1349
sorted([new_inv.root_id, "fileid", "dirid", "childid"]),
1358
1350
sorted(new_inv._fileid_to_entry_cache.keys()))
1359
1351
ie_root = new_inv._fileid_to_entry_cache[new_inv.root_id]
1360
1352
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1361
1353
sorted(ie_root._children.keys()))
1362
ie_dir = new_inv._fileid_to_entry_cache[b'dirid']
1354
ie_dir = new_inv._fileid_to_entry_cache['dirid']
1363
1355
self.assertEqual([u'ch\xefld'], sorted(ie_dir._children.keys()))
1365
1357
def test__preload_populates_cache(self):
1366
1358
inv = Inventory()
1367
inv.revision_id = b"revid"
1368
inv.root.revision = b"rootrev"
1359
inv.revision_id = "revid"
1360
inv.root.revision = "rootrev"
1369
1361
root_id = inv.root.file_id
1370
inv.add(InventoryFile(b"fileid", "file", root_id))
1371
inv.get_entry(b"fileid").revision = b"filerev"
1372
inv.get_entry(b"fileid").executable = True
1373
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1374
inv.get_entry(b"fileid").text_size = 1
1375
inv.add(InventoryDirectory(b"dirid", "dir", root_id))
1376
inv.get_entry(b"dirid").revision = b"dirrev"
1377
inv.add(InventoryFile(b"childid", "child", b"dirid"))
1378
inv.get_entry(b"childid").revision = b"filerev"
1379
inv.get_entry(b"childid").executable = False
1380
inv.get_entry(b"childid").text_sha1 = b"dddd"
1381
inv.get_entry(b"childid").text_size = 1
1362
inv.add(InventoryFile("fileid", "file", root_id))
1363
inv.get_entry("fileid").revision = "filerev"
1364
inv.get_entry("fileid").executable = True
1365
inv.get_entry("fileid").text_sha1 = "ffff"
1366
inv.get_entry("fileid").text_size = 1
1367
inv.add(InventoryDirectory("dirid", "dir", root_id))
1368
inv.add(InventoryFile("childid", "child", "dirid"))
1369
inv.get_entry("childid").revision = "filerev"
1370
inv.get_entry("childid").executable = False
1371
inv.get_entry("childid").text_sha1 = "dddd"
1372
inv.get_entry("childid").text_size = 1
1382
1373
chk_bytes = self.get_chk_bytes()
1383
1374
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1384
lines = chk_inv.to_lines()
1385
new_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1375
bytes = ''.join(chk_inv.to_lines())
1376
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1386
1377
self.assertEqual({}, new_inv._fileid_to_entry_cache)
1387
1378
self.assertFalse(new_inv._fully_cached)
1388
1379
new_inv._preload_cache()
1389
1380
self.assertEqual(
1390
sorted([root_id, b"fileid", b"dirid", b"childid"]),
1381
sorted([root_id, "fileid", "dirid", "childid"]),
1391
1382
sorted(new_inv._fileid_to_entry_cache.keys()))
1392
1383
self.assertTrue(new_inv._fully_cached)
1393
1384
ie_root = new_inv._fileid_to_entry_cache[root_id]
1394
1385
self.assertEqual(['dir', 'file'], sorted(ie_root._children.keys()))
1395
ie_dir = new_inv._fileid_to_entry_cache[b'dirid']
1386
ie_dir = new_inv._fileid_to_entry_cache['dirid']
1396
1387
self.assertEqual(['child'], sorted(ie_dir._children.keys()))
1398
1389
def test__preload_handles_partially_evaluated_inventory(self):
1409
1400
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1410
1401
sorted(ie._children.keys()))
1411
ie_dir = new_inv.get_entry(b"dirid")
1402
ie_dir = new_inv.get_entry("dirid")
1412
1403
self.assertEqual([u'ch\xefld'],
1413
1404
sorted(ie_dir._children.keys()))
1415
1406
def test_filter_change_in_renamed_subfolder(self):
1416
inv = Inventory(b'tree-root')
1417
inv.root.revision = b'rootrev'
1418
src_ie = inv.add_path('src', 'directory', b'src-id')
1419
src_ie.revision = b'srcrev'
1420
sub_ie = inv.add_path('src/sub/', 'directory', b'sub-id')
1421
sub_ie.revision = b'subrev'
1422
a_ie = inv.add_path('src/sub/a', 'file', b'a-id')
1423
a_ie.revision = b'filerev'
1424
a_ie.text_sha1 = osutils.sha_string(b'content\n')
1425
a_ie.text_size = len(b'content\n')
1407
inv = Inventory('tree-root')
1408
src_ie = inv.add_path('src', 'directory', 'src-id')
1409
inv.add_path('src/sub/', 'directory', 'sub-id')
1410
a_ie = inv.add_path('src/sub/a', 'file', 'a-id')
1411
a_ie.text_sha1 = osutils.sha_string('content\n')
1412
a_ie.text_size = len('content\n')
1426
1413
chk_bytes = self.get_chk_bytes()
1427
1414
inv = CHKInventory.from_inventory(chk_bytes, inv)
1428
1415
inv = inv.create_by_apply_delta([
1429
("src/sub/a", "src/sub/a", b"a-id", a_ie),
1430
("src", "src2", b"src-id", src_ie),
1432
new_inv = inv.filter([b'a-id', b'src-id'])
1416
("src/sub/a", "src/sub/a", "a-id", a_ie),
1417
("src", "src2", "src-id", src_ie),
1419
new_inv = inv.filter(['a-id', 'src-id'])
1433
1420
self.assertEqual([
1436
('src/sub', b'sub-id'),
1437
('src/sub/a', b'a-id'),
1423
('src/sub', 'sub-id'),
1424
('src/sub/a', 'a-id'),
1438
1425
], [(path, ie.file_id) for path, ie in new_inv.iter_entries()])
1441
1427
class TestCHKInventoryExpand(tests.TestCaseWithMemoryTransport):
1443
1429
def get_chk_bytes(self):
1472
1453
# dir2/ dir2-id
1473
1454
# sub2-file1 sub2-file1-id
1475
self.make_dir(inv, 'dir1', b'TREE_ROOT', b'dirrev')
1476
self.make_dir(inv, 'dir2', b'TREE_ROOT', b'dirrev')
1477
self.make_dir(inv, 'sub-dir1', b'dir1-id', b'dirrev')
1478
self.make_file(inv, 'top', b'TREE_ROOT', b'filerev')
1479
self.make_file(inv, 'sub-file1', b'dir1-id', b'filerev')
1480
self.make_file(inv, 'sub-file2', b'dir1-id', b'filerev')
1481
self.make_file(inv, 'subsub-file1', b'sub-dir1-id', b'filerev')
1482
self.make_file(inv, 'sub2-file1', b'dir2-id', b'filerev')
1456
self.make_dir(inv, 'dir1', 'TREE_ROOT')
1457
self.make_dir(inv, 'dir2', 'TREE_ROOT')
1458
self.make_dir(inv, 'sub-dir1', 'dir1-id')
1459
self.make_file(inv, 'top', 'TREE_ROOT')
1460
self.make_file(inv, 'sub-file1', 'dir1-id')
1461
self.make_file(inv, 'sub-file2', 'dir1-id')
1462
self.make_file(inv, 'subsub-file1', 'sub-dir1-id')
1463
self.make_file(inv, 'sub2-file1', 'dir2-id')
1483
1464
chk_bytes = self.get_chk_bytes()
1484
1465
# use a small maximum_size to force internal paging structures
1485
1466
chk_inv = CHKInventory.from_inventory(chk_bytes, inv,
1487
search_key_name=b'hash-255-way')
1488
lines = chk_inv.to_lines()
1489
return CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1468
search_key_name='hash-255-way')
1469
bytes = ''.join(chk_inv.to_lines())
1470
return CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1491
1472
def assert_Getitems(self, expected_fileids, inv, file_ids):
1492
1473
self.assertEqual(sorted(expected_fileids),
1513
1494
for path, entry in inv.iter_entries_by_dir():
1514
1495
layout.append((path, entry.file_id))
1515
1496
self.assertEqual([
1517
('dir1', b'dir1-id'),
1518
('dir2', b'dir2-id'),
1520
('dir1/sub-dir1', b'sub-dir1-id'),
1521
('dir1/sub-file1', b'sub-file1-id'),
1522
('dir1/sub-file2', b'sub-file2-id'),
1523
('dir1/sub-dir1/subsub-file1', b'subsub-file1-id'),
1524
('dir2/sub2-file1', b'sub2-file1-id'),
1498
('dir1', 'dir1-id'),
1499
('dir2', 'dir2-id'),
1501
('dir1/sub-dir1', 'sub-dir1-id'),
1502
('dir1/sub-file1', 'sub-file1-id'),
1503
('dir1/sub-file2', 'sub-file2-id'),
1504
('dir1/sub-dir1/subsub-file1', 'subsub-file1-id'),
1505
('dir2/sub2-file1', 'sub2-file1-id'),
1527
1508
def test__getitems(self):
1528
1509
inv = self.make_simple_inventory()
1529
1510
# Reading from disk
1530
self.assert_Getitems([b'dir1-id'], inv, [b'dir1-id'])
1531
self.assertTrue(b'dir1-id' in inv._fileid_to_entry_cache)
1532
self.assertFalse(b'sub-file2-id' in inv._fileid_to_entry_cache)
1511
self.assert_Getitems(['dir1-id'], inv, ['dir1-id'])
1512
self.assertTrue('dir1-id' in inv._fileid_to_entry_cache)
1513
self.assertFalse('sub-file2-id' in inv._fileid_to_entry_cache)
1534
self.assert_Getitems([b'dir1-id'], inv, [b'dir1-id'])
1515
self.assert_Getitems(['dir1-id'], inv, ['dir1-id'])
1536
self.assert_Getitems([b'dir1-id', b'sub-file2-id'], inv,
1537
[b'dir1-id', b'sub-file2-id'])
1538
self.assertTrue(b'dir1-id' in inv._fileid_to_entry_cache)
1539
self.assertTrue(b'sub-file2-id' in inv._fileid_to_entry_cache)
1517
self.assert_Getitems(['dir1-id', 'sub-file2-id'], inv,
1518
['dir1-id', 'sub-file2-id'])
1519
self.assertTrue('dir1-id' in inv._fileid_to_entry_cache)
1520
self.assertTrue('sub-file2-id' in inv._fileid_to_entry_cache)
1541
1522
def test_single_file(self):
1542
1523
inv = self.make_simple_inventory()
1543
self.assertExpand([b'TREE_ROOT', b'top-id'], inv, [b'top-id'])
1524
self.assertExpand(['TREE_ROOT', 'top-id'], inv, ['top-id'])
1545
1526
def test_get_all_parents(self):
1546
1527
inv = self.make_simple_inventory()
1547
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1549
], inv, [b'subsub-file1-id'])
1528
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1530
], inv, ['subsub-file1-id'])
1551
1532
def test_get_children(self):
1552
1533
inv = self.make_simple_inventory()
1553
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1554
b'sub-file1-id', b'sub-file2-id', b'subsub-file1-id',
1555
], inv, [b'dir1-id'])
1534
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1535
'sub-file1-id', 'sub-file2-id', 'subsub-file1-id',
1536
], inv, ['dir1-id'])
1557
1538
def test_from_root(self):
1558
1539
inv = self.make_simple_inventory()
1559
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'dir2-id', b'sub-dir1-id',
1560
b'sub-file1-id', b'sub-file2-id', b'sub2-file1-id',
1561
b'subsub-file1-id', b'top-id'], inv, [b'TREE_ROOT'])
1540
self.assertExpand(['TREE_ROOT', 'dir1-id', 'dir2-id', 'sub-dir1-id',
1541
'sub-file1-id', 'sub-file2-id', 'sub2-file1-id',
1542
'subsub-file1-id', 'top-id'], inv, ['TREE_ROOT'])
1563
1544
def test_top_level_file(self):
1564
1545
inv = self.make_simple_inventory()
1565
self.assertExpand([b'TREE_ROOT', b'top-id'], inv, [b'top-id'])
1546
self.assertExpand(['TREE_ROOT', 'top-id'], inv, ['top-id'])
1567
1548
def test_subsub_file(self):
1568
1549
inv = self.make_simple_inventory()
1569
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1570
b'subsub-file1-id'], inv, [b'subsub-file1-id'])
1550
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1551
'subsub-file1-id'], inv, ['subsub-file1-id'])
1572
1553
def test_sub_and_root(self):
1573
1554
inv = self.make_simple_inventory()
1574
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id', b'top-id',
1575
b'subsub-file1-id'], inv, [b'top-id', b'subsub-file1-id'])
1555
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id', 'top-id',
1556
'subsub-file1-id'], inv, ['top-id', 'subsub-file1-id'])
1578
1559
class TestMutableInventoryFromTree(TestCaseWithTransport):