355
355
self.wt = self.make_branch_and_tree('.')
356
356
self.b = self.wt.branch
357
357
self.build_tree_contents([
358
('file1', b'file1 contents at rev 1\n'),
359
('file2', b'file2 contents at rev 1\n')
358
('file1', 'file1 contents at rev 1\n'),
359
('file2', 'file2 contents at rev 1\n')
361
361
self.wt.add(['file1', 'file2'])
363
363
message='Revision 1',
364
364
timestamp=1143849600, # 2006-04-01 00:00:00 UTC
367
self.build_tree_contents([('file1', b'file1 contents at rev 2\n')])
367
self.build_tree_contents([('file1', 'file1 contents at rev 2\n')])
369
369
message='Revision 2',
370
370
timestamp=1143936000, # 2006-04-02 00:00:00 UTC
373
self.build_tree_contents([('file2', b'file2 contents at rev 3\n')])
373
self.build_tree_contents([('file2', 'file2 contents at rev 3\n')])
375
375
message='Revision 3',
376
376
timestamp=1144022400, # 2006-04-03 00:00:00 UTC
379
379
self.wt.remove(['file2'])
381
381
message='Revision 4',
382
382
timestamp=1144108800, # 2006-04-04 00:00:00 UTC
385
385
self.build_tree_contents([
386
('file1', b'file1 contents in working tree\n')
386
('file1', 'file1 contents in working tree\n')
388
388
# set the date stamps for files in the working tree to known values
389
389
os.utime('file1', (1144195200, 1144195200)) # 2006-04-05 00:00:00 UTC
483
483
def test_modified_file(self):
484
484
"""Test when a file is modified."""
485
485
tree = self.make_branch_and_tree('tree')
486
self.build_tree_contents([('tree/file', b'contents\n')])
487
tree.add(['file'], [b'file-id'])
488
tree.commit('one', rev_id=b'rev-1')
486
self.build_tree_contents([('tree/file', 'contents\n')])
487
tree.add(['file'], ['file-id'])
488
tree.commit('one', rev_id='rev-1')
490
self.build_tree_contents([('tree/file', b'new contents\n')])
490
self.build_tree_contents([('tree/file', 'new contents\n')])
491
491
d = get_diff_as_string(tree.basis_tree(), tree)
492
492
self.assertContainsRe(d, "=== modified file 'file'\n")
493
493
self.assertContainsRe(d, '--- old/file\t')
499
499
"""Test when a file is modified in a renamed directory."""
500
500
tree = self.make_branch_and_tree('tree')
501
501
self.build_tree(['tree/dir/'])
502
self.build_tree_contents([('tree/dir/file', b'contents\n')])
503
tree.add(['dir', 'dir/file'], [b'dir-id', b'file-id'])
504
tree.commit('one', rev_id=b'rev-1')
502
self.build_tree_contents([('tree/dir/file', 'contents\n')])
503
tree.add(['dir', 'dir/file'], ['dir-id', 'file-id'])
504
tree.commit('one', rev_id='rev-1')
506
506
tree.rename_one('dir', 'other')
507
self.build_tree_contents([('tree/other/file', b'new contents\n')])
507
self.build_tree_contents([('tree/other/file', 'new contents\n')])
508
508
d = get_diff_as_string(tree.basis_tree(), tree)
509
509
self.assertContainsRe(d, "=== renamed directory 'dir' => 'other'\n")
510
510
self.assertContainsRe(d, "=== modified file 'other/file'\n")
519
519
"""Test when only a directory is only renamed."""
520
520
tree = self.make_branch_and_tree('tree')
521
521
self.build_tree(['tree/dir/'])
522
self.build_tree_contents([('tree/dir/file', b'contents\n')])
523
tree.add(['dir', 'dir/file'], [b'dir-id', b'file-id'])
524
tree.commit('one', rev_id=b'rev-1')
522
self.build_tree_contents([('tree/dir/file', 'contents\n')])
523
tree.add(['dir', 'dir/file'], ['dir-id', 'file-id'])
524
tree.commit('one', rev_id='rev-1')
526
526
tree.rename_one('dir', 'newdir')
527
527
d = get_diff_as_string(tree.basis_tree(), tree)
532
532
def test_renamed_file(self):
533
533
"""Test when a file is only renamed."""
534
534
tree = self.make_branch_and_tree('tree')
535
self.build_tree_contents([('tree/file', b'contents\n')])
536
tree.add(['file'], [b'file-id'])
537
tree.commit('one', rev_id=b'rev-1')
535
self.build_tree_contents([('tree/file', 'contents\n')])
536
tree.add(['file'], ['file-id'])
537
tree.commit('one', rev_id='rev-1')
539
539
tree.rename_one('file', 'newname')
540
540
d = get_diff_as_string(tree.basis_tree(), tree)
546
546
def test_renamed_and_modified_file(self):
547
547
"""Test when a file is only renamed."""
548
548
tree = self.make_branch_and_tree('tree')
549
self.build_tree_contents([('tree/file', b'contents\n')])
550
tree.add(['file'], [b'file-id'])
551
tree.commit('one', rev_id=b'rev-1')
549
self.build_tree_contents([('tree/file', 'contents\n')])
550
tree.add(['file'], ['file-id'])
551
tree.commit('one', rev_id='rev-1')
553
553
tree.rename_one('file', 'newname')
554
self.build_tree_contents([('tree/newname', b'new contents\n')])
554
self.build_tree_contents([('tree/newname', 'new contents\n')])
555
555
d = get_diff_as_string(tree.basis_tree(), tree)
556
556
self.assertContainsRe(d, "=== renamed file 'file' => 'newname'\n")
557
557
self.assertContainsRe(d, '--- old/file\t')
630
630
autf8, outf8 = alpha.encode('utf8'), omega.encode('utf8')
632
632
tree = self.make_branch_and_tree('tree')
633
self.build_tree_contents([('tree/ren_'+alpha, b'contents\n')])
634
tree.add(['ren_'+alpha], [b'file-id-2'])
635
self.build_tree_contents([('tree/del_'+alpha, b'contents\n')])
636
tree.add(['del_'+alpha], [b'file-id-3'])
637
self.build_tree_contents([('tree/mod_'+alpha, b'contents\n')])
638
tree.add(['mod_'+alpha], [b'file-id-4'])
633
self.build_tree_contents([('tree/ren_'+alpha, 'contents\n')])
634
tree.add(['ren_'+alpha], ['file-id-2'])
635
self.build_tree_contents([('tree/del_'+alpha, 'contents\n')])
636
tree.add(['del_'+alpha], ['file-id-3'])
637
self.build_tree_contents([('tree/mod_'+alpha, 'contents\n')])
638
tree.add(['mod_'+alpha], ['file-id-4'])
640
tree.commit('one', rev_id=b'rev-1')
640
tree.commit('one', rev_id='rev-1')
642
642
tree.rename_one('ren_'+alpha, 'ren_'+omega)
643
643
tree.remove('del_'+alpha)
644
self.build_tree_contents([('tree/add_'+alpha, b'contents\n')])
645
tree.add(['add_'+alpha], [b'file-id'])
646
self.build_tree_contents([('tree/mod_'+alpha, b'contents_mod\n')])
644
self.build_tree_contents([('tree/add_'+alpha, 'contents\n')])
645
tree.add(['add_'+alpha], ['file-id'])
646
self.build_tree_contents([('tree/mod_'+alpha, 'contents_mod\n')])
648
648
d = get_diff_as_string(tree.basis_tree(), tree)
649
649
self.assertContainsRe(d,
720
720
def test_diff_text(self):
721
721
self.build_tree_contents([('old-tree/olddir/',),
722
('old-tree/olddir/oldfile', b'old\n')])
722
('old-tree/olddir/oldfile', 'old\n')])
723
723
self.old_tree.add('olddir')
724
self.old_tree.add('olddir/oldfile', b'file-id')
724
self.old_tree.add('olddir/oldfile', 'file-id')
725
725
self.build_tree_contents([('new-tree/newdir/',),
726
('new-tree/newdir/newfile', b'new\n')])
726
('new-tree/newdir/newfile', 'new\n')])
727
727
self.new_tree.add('newdir')
728
self.new_tree.add('newdir/newfile', b'file-id')
728
self.new_tree.add('newdir/newfile', 'file-id')
729
729
differ = diff.DiffText(self.old_tree, self.new_tree, BytesIO())
730
730
differ.diff_text('olddir/oldfile', None, 'old label',
731
'new label', b'file-id', None)
731
'new label', 'file-id', None)
732
732
self.assertEqual(
733
733
'--- old label\n+++ new label\n@@ -1,1 +0,0 @@\n-old\n\n',
734
734
differ.to_file.getvalue())
735
735
differ.to_file.seek(0)
736
736
differ.diff_text(None, 'newdir/newfile',
737
'old label', 'new label', None, b'file-id')
737
'old label', 'new label', None, 'file-id')
738
738
self.assertEqual(
739
739
'--- old label\n+++ new label\n@@ -0,0 +1,1 @@\n+new\n\n',
740
740
differ.to_file.getvalue())
741
741
differ.to_file.seek(0)
742
742
differ.diff_text('olddir/oldfile', 'newdir/newfile',
743
'old label', 'new label', b'file-id', b'file-id')
743
'old label', 'new label', 'file-id', 'file-id')
744
744
self.assertEqual(
745
745
'--- old label\n+++ new label\n@@ -1,1 +1,1 @@\n-old\n+new\n\n',
746
746
differ.to_file.getvalue())
748
748
def test_diff_deletion(self):
749
self.build_tree_contents([('old-tree/file', b'contents'),
750
('new-tree/file', b'contents')])
751
self.old_tree.add('file', b'file-id')
752
self.new_tree.add('file', b'file-id')
749
self.build_tree_contents([('old-tree/file', 'contents'),
750
('new-tree/file', 'contents')])
751
self.old_tree.add('file', 'file-id')
752
self.new_tree.add('file', 'file-id')
753
753
os.unlink('new-tree/file')
754
754
self.differ.show_diff(None)
755
755
self.assertContainsRe(self.differ.to_file.getvalue(), '-contents')
757
757
def test_diff_creation(self):
758
self.build_tree_contents([('old-tree/file', b'contents'),
759
('new-tree/file', b'contents')])
760
self.old_tree.add('file', b'file-id')
761
self.new_tree.add('file', b'file-id')
758
self.build_tree_contents([('old-tree/file', 'contents'),
759
('new-tree/file', 'contents')])
760
self.old_tree.add('file', 'file-id')
761
self.new_tree.add('file', 'file-id')
762
762
os.unlink('old-tree/file')
763
763
self.differ.show_diff(None)
764
764
self.assertContainsRe(self.differ.to_file.getvalue(), r'\+contents')
782
782
def test_diff(self):
783
783
self.build_tree_contents([('old-tree/olddir/',),
784
('old-tree/olddir/oldfile', b'old\n')])
784
('old-tree/olddir/oldfile', 'old\n')])
785
785
self.old_tree.add('olddir')
786
self.old_tree.add('olddir/oldfile', b'file-id')
786
self.old_tree.add('olddir/oldfile', 'file-id')
787
787
self.build_tree_contents([('new-tree/newdir/',),
788
('new-tree/newdir/newfile', b'new\n')])
788
('new-tree/newdir/newfile', 'new\n')])
789
789
self.new_tree.add('newdir')
790
self.new_tree.add('newdir/newfile', b'file-id')
790
self.new_tree.add('newdir/newfile', 'file-id')
791
791
self.differ.diff('file-id', 'olddir/oldfile', 'newdir/newfile')
792
792
self.assertContainsRe(
793
793
self.differ.to_file.getvalue(),
797
797
def test_diff_kind_change(self):
798
798
self.requireFeature(features.SymlinkFeature)
799
799
self.build_tree_contents([('old-tree/olddir/',),
800
('old-tree/olddir/oldfile', b'old\n')])
800
('old-tree/olddir/oldfile', 'old\n')])
801
801
self.old_tree.add('olddir')
802
self.old_tree.add('olddir/oldfile', b'file-id')
802
self.old_tree.add('olddir/oldfile', 'file-id')
803
803
self.build_tree(['new-tree/newdir/'])
804
804
os.symlink('new', 'new-tree/newdir/newfile')
805
805
self.new_tree.add('newdir')
806
self.new_tree.add('newdir/newfile', b'file-id')
806
self.new_tree.add('newdir/newfile', 'file-id')
807
807
self.differ.diff('file-id', 'olddir/oldfile', 'newdir/newfile')
808
808
self.assertContainsRe(
809
809
self.differ.to_file.getvalue(),
815
815
def test_diff_directory(self):
816
816
self.build_tree(['new-tree/new-dir/'])
817
self.new_tree.add('new-dir', b'new-dir-id')
818
self.differ.diff(b'new-dir-id', None, 'new-dir')
817
self.new_tree.add('new-dir', 'new-dir-id')
818
self.differ.diff('new-dir-id', None, 'new-dir')
819
819
self.assertEqual(self.differ.to_file.getvalue(), '')
821
821
def create_old_new(self):
822
822
self.build_tree_contents([('old-tree/olddir/',),
823
('old-tree/olddir/oldfile', b'old\n')])
823
('old-tree/olddir/oldfile', 'old\n')])
824
824
self.old_tree.add('olddir')
825
self.old_tree.add('olddir/oldfile', b'file-id')
825
self.old_tree.add('olddir/oldfile', 'file-id')
826
826
self.build_tree_contents([('new-tree/newdir/',),
827
('new-tree/newdir/newfile', b'new\n')])
827
('new-tree/newdir/newfile', 'new\n')])
828
828
self.new_tree.add('newdir')
829
self.new_tree.add('newdir/newfile', b'file-id')
829
self.new_tree.add('newdir/newfile', 'file-id')
831
831
def test_register_diff(self):
832
832
self.create_old_new()
1474
1474
def test_prepare_files(self):
1475
1475
output = BytesIO()
1476
1476
tree = self.make_branch_and_tree('tree')
1477
self.build_tree_contents([('tree/oldname', b'oldcontent')])
1478
self.build_tree_contents([('tree/oldname2', b'oldcontent2')])
1479
tree.add('oldname', b'file-id')
1480
tree.add('oldname2', b'file2-id')
1477
self.build_tree_contents([('tree/oldname', 'oldcontent')])
1478
self.build_tree_contents([('tree/oldname2', 'oldcontent2')])
1479
tree.add('oldname', 'file-id')
1480
tree.add('oldname2', 'file2-id')
1481
1481
# Earliest allowable date on FAT32 filesystems is 1980-01-01
1482
1482
tree.commit('old tree', timestamp=315532800)
1483
1483
tree.rename_one('oldname', 'newname')
1484
1484
tree.rename_one('oldname2', 'newname2')
1485
self.build_tree_contents([('tree/newname', b'newcontent')])
1486
self.build_tree_contents([('tree/newname2', b'newcontent2')])
1485
self.build_tree_contents([('tree/newname', 'newcontent')])
1486
self.build_tree_contents([('tree/newname2', 'newcontent2')])
1487
1487
old_tree = tree.basis_tree()
1488
1488
old_tree.lock_read()
1489
1489
self.addCleanup(old_tree.unlock)
1573
1573
def test_with_rev_specs(self):
1574
1574
tree = self.make_branch_and_tree('tree')
1575
self.build_tree_contents([('tree/file', b'oldcontent')])
1576
tree.add('file', b'file-id')
1577
tree.commit('old tree', timestamp=0, rev_id=b"old-id")
1578
self.build_tree_contents([('tree/file', b'newcontent')])
1575
self.build_tree_contents([('tree/file', 'oldcontent')])
1576
tree.add('file', 'file-id')
1577
tree.commit('old tree', timestamp=0, rev_id="old-id")
1578
self.build_tree_contents([('tree/file', 'newcontent')])
1579
1579
tree.commit('new tree', timestamp=0, rev_id="new-id")
1581
1581
revisions = [revisionspec.RevisionSpec.from_string('1'),