104
104
target.get(path).read(),
105
105
"text for file %r differs:\n" % path)
107
def skipIfNoWorkingTree(self, a_bzrdir):
108
"""Raises TestSkipped if a_bzrdir doesn't have a working tree.
110
If the bzrdir does have a workingtree, this is a no-op.
113
a_bzrdir.open_workingtree()
114
except (errors.NotLocalUrl, errors.NoWorkingTree):
115
raise TestSkipped("bzrdir on transport %r has no working tree"
116
% a_bzrdir.transport)
118
def createWorkingTreeOrSkip(self, a_bzrdir):
119
"""Create a working tree on a_bzrdir, or raise TestSkipped.
121
A simple wrapper for create_workingtree that translates NotLocalUrl into
122
TestSkipped. Returns the newly created working tree.
125
return a_bzrdir.create_workingtree()
126
except errors.NotLocalUrl:
127
raise TestSkipped("cannot make working tree with transport %r"
128
% a_bzrdir.transport)
130
def sproutOrSkip(self, from_bzrdir, to_url, revision_id=None, basis=None,
131
force_new_repo=False):
132
"""Sprout from_bzrdir into to_url, or raise TestSkipped.
134
A simple wrapper for from_bzrdir.sprout that translates NotLocalUrl into
135
TestSkipped. Returns the newly sprouted bzrdir.
138
target = from_bzrdir.sprout(to_url, revision_id=revision_id,
140
force_new_repo=force_new_repo)
141
except errors.NotLocalUrl:
142
raise TestSkipped('Cannot sprout to remote bzrdirs.')
107
145
def test_clone_bzrdir_empty(self):
108
146
dir = self.make_bzrdir('source')
109
147
target = dir.clone(self.get_url('target'))
332
370
tree.commit('revision 1')
333
371
dir = tree.bzrdir
334
372
target = dir.clone(self.get_url('target'))
373
self.skipIfNoWorkingTree(target)
335
374
self.assertNotEqual(dir.transport.base, target.transport.base)
336
375
self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
337
376
['./.bzr/stat-cache',
348
387
tree.commit('revision 1')
349
388
dir = tree.bzrdir
350
389
target = dir.clone(self.get_url('target'))
390
self.skipIfNoWorkingTree(target)
351
391
self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
352
392
['./.bzr/stat-cache',
353
393
'./.bzr/checkout/stat-cache',
373
413
except errors.IncompatibleFormat:
374
414
# this is ok too, not all formats have to support references.
376
dir.create_workingtree()
416
self.createWorkingTreeOrSkip(dir)
377
417
target = dir.clone(self.get_url('target'))
418
self.skipIfNoWorkingTree(target)
378
419
self.assertNotEqual(dir.transport.base, target.transport.base)
379
420
self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
380
421
['./.bzr/stat-cache',
382
423
'./.bzr/repository/inventory.knit',
386
426
def test_clone_bzrdir_tree_revision(self):
387
427
# test for revision limiting, [smoke test, not corner case checks].
388
428
# make a tree with a revision with a last-revision
396
436
tree.commit('revision 2', rev_id='2', allow_pointless=True)
397
437
dir = tree.bzrdir
398
438
target = dir.clone(self.get_url('target'), revision_id='1')
439
self.skipIfNoWorkingTree(target)
399
440
self.assertEqual('1', target.open_workingtree().last_revision())
401
442
def test_clone_bzrdir_incomplete_source_with_basis(self):
414
455
dir = source.bzrdir
415
456
target = dir.clone(self.get_url('target'), basis=tree.bzrdir)
416
457
self.assertEqual('2', target.open_branch().last_revision())
417
self.assertEqual('2', target.open_workingtree().last_revision())
459
self.assertEqual('2', target.open_workingtree().last_revision())
460
except errors.NoWorkingTree:
461
# It should have a working tree if it's able to have one, so if
462
# we're here make sure it really can't have one.
463
self.assertRaises(errors.NotLocalUrl, target.create_workingtree)
418
464
self.assertTrue(target.open_branch().repository.has_revision('2'))
420
466
def test_sprout_bzrdir_empty(self):
421
467
dir = self.make_bzrdir('source')
422
target = dir.sprout(self.get_url('target'))
468
target = self.sproutOrSkip(dir, self.get_url('target'))
423
469
self.assertNotEqual(dir.transport.base, target.transport.base)
424
470
# creates a new repository branch and tree
425
471
target.open_repository()
433
479
self.make_repository('target', shared=True)
434
480
except errors.IncompatibleFormat:
436
target = dir.sprout(self.get_url('target/child'))
482
target = self.sproutOrSkip(dir, self.get_url('target/child'))
437
483
self.assertRaises(errors.NoRepositoryPresent, target.open_repository)
438
484
target.open_branch()
439
485
target.open_workingtree()
441
def test_sprout_bzrdir_empty_under_shared_repo(self):
487
def test_sprout_bzrdir_empty_under_shared_repo_force_new(self):
442
488
# the force_new_repo parameter should force use of a new repo in an empty
443
489
# bzrdir's sprout logic
444
490
dir = self.make_bzrdir('source')
446
492
self.make_repository('target', shared=True)
447
493
except errors.IncompatibleFormat:
449
target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
495
target = self.sproutOrSkip(dir, self.get_url('target/child'),
450
497
target.open_repository()
451
498
target.open_branch()
452
499
target.open_workingtree()
460
507
repo = dir.create_repository()
461
508
repo.fetch(tree.branch.repository)
462
509
self.assertTrue(repo.has_revision('1'))
463
target = dir.sprout(self.get_url('target'))
510
target = self.sproutOrSkip(dir, self.get_url('target'))
464
511
self.assertNotEqual(dir.transport.base, target.transport.base)
465
512
self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
466
513
['./.bzr/repository/inventory.knit',
481
528
shared_repo = self.make_repository('target', shared=True)
482
529
except errors.IncompatibleFormat:
484
target = dir.sprout(self.get_url('target/child'))
531
target = self.sproutOrSkip(dir, self.get_url('target/child'))
485
532
self.assertNotEqual(dir.transport.base, target.transport.base)
486
533
self.assertTrue(shared_repo.has_revision('1'))
500
547
tree.bzrdir.open_repository().copy_content_into(shared_repo)
501
548
dir = self.make_bzrdir('shared/source')
502
549
dir.create_branch()
503
target = dir.sprout(self.get_url('shared/target'))
550
target = self.sproutOrSkip(dir, self.get_url('shared/target'))
504
551
self.assertNotEqual(dir.transport.base, target.transport.base)
505
552
self.assertNotEqual(dir.transport.base, shared_repo.bzrdir.transport.base)
506
553
self.assertTrue(shared_repo.has_revision('1'))
523
570
self.assertTrue(shared_repo.has_revision('1'))
524
571
dir = self.make_bzrdir('shared/source')
525
572
dir.create_branch()
526
target = dir.sprout(self.get_url('target'))
573
target = self.sproutOrSkip(dir, self.get_url('target'))
527
574
self.assertNotEqual(dir.transport.base, target.transport.base)
528
575
self.assertNotEqual(dir.transport.base, shared_repo.bzrdir.transport.base)
529
576
branch = target.open_branch()
546
593
shared_repo = self.make_repository('target', shared=True)
547
594
except errors.IncompatibleFormat:
549
target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
596
target = self.sproutOrSkip(dir, self.get_url('target/child'),
550
598
self.assertNotEqual(dir.transport.base, target.transport.base)
551
599
self.assertFalse(shared_repo.has_revision('1'))
565
613
source = self.make_repository('source')
566
614
tree.bzrdir.open_repository().copy_content_into(source)
567
615
dir = source.bzrdir
568
target = dir.sprout(self.get_url('target'), revision_id='2')
616
target = self.sproutOrSkip(dir, self.get_url('target'), revision_id='2')
569
617
raise TestSkipped('revision limiting not strict yet')
571
619
def test_sprout_bzrdir_branch_and_repo(self):
577
625
tree.bzrdir.open_repository().copy_content_into(source.repository)
578
626
tree.bzrdir.open_branch().copy_content_into(source)
579
627
dir = source.bzrdir
580
target = dir.sprout(self.get_url('target'))
628
target = self.sproutOrSkip(dir, self.get_url('target'))
581
629
self.assertNotEqual(dir.transport.base, target.transport.base)
582
630
self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
583
631
['./.bzr/stat-cache',
602
650
shared_repo = self.make_repository('target', shared=True)
603
651
except errors.IncompatibleFormat:
605
target = dir.sprout(self.get_url('target/child'))
653
target = self.sproutOrSkip(dir, self.get_url('target/child'))
606
654
self.assertTrue(shared_repo.has_revision('1'))
608
656
def test_sprout_bzrdir_branch_and_repo_shared_force_new_repo(self):
620
668
shared_repo = self.make_repository('target', shared=True)
621
669
except errors.IncompatibleFormat:
623
target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
671
target = self.sproutOrSkip(dir, self.get_url('target/child'),
624
673
self.assertNotEqual(dir.transport.base, target.transport.base)
625
674
self.assertFalse(shared_repo.has_revision('1'))
635
684
# this is ok too, not all formats have to support references.
637
686
self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
638
target = dir.sprout(self.get_url('target'))
687
target = self.sproutOrSkip(dir, self.get_url('target'))
639
688
self.assertNotEqual(dir.transport.base, target.transport.base)
640
689
# we want target to have a branch that is in-place.
641
690
self.assertEqual(target, target.open_branch().bzrdir)
659
708
shared_repo = self.make_repository('target', shared=True)
660
709
except errors.IncompatibleFormat:
662
target = dir.sprout(self.get_url('target/child'))
711
target = self.sproutOrSkip(dir, self.get_url('target/child'))
663
712
self.assertNotEqual(dir.transport.base, target.transport.base)
664
713
# we want target to have a branch that is in-place.
665
714
self.assertEqual(target, target.open_branch().bzrdir)
685
734
shared_repo = self.make_repository('target', shared=True)
686
735
except errors.IncompatibleFormat:
688
target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
737
target = self.sproutOrSkip(dir, self.get_url('target/child'),
689
739
self.assertNotEqual(dir.transport.base, target.transport.base)
690
740
# we want target to have a branch that is in-place.
691
741
self.assertEqual(target, target.open_branch().bzrdir)
708
758
tree.bzrdir.open_repository().copy_content_into(source.repository)
709
759
tree.bzrdir.open_branch().copy_content_into(source)
710
760
dir = source.bzrdir
711
target = dir.sprout(self.get_url('target'), revision_id='1')
761
target = self.sproutOrSkip(dir, self.get_url('target'), revision_id='1')
712
762
self.assertEqual('1', target.open_branch().last_revision())
714
764
def test_sprout_bzrdir_tree_branch_repo(self):
718
768
tree.commit('revision 1')
719
769
dir = tree.bzrdir
720
target = dir.sprout(self.get_url('target'))
770
target = self.sproutOrSkip(dir, self.get_url('target'))
721
771
self.assertNotEqual(dir.transport.base, target.transport.base)
722
772
self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
723
773
['./.bzr/stat-cache',
739
789
# this is ok too, not all formats have to support references.
741
791
self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
742
tree = dir.create_workingtree()
792
tree = self.createWorkingTreeOrSkip(dir)
743
793
tree.bzrdir.root_transport.mkdir('subdir')
744
794
tree.add('subdir')
745
target = dir.sprout(self.get_url('target'))
795
target = self.sproutOrSkip(dir, self.get_url('target'))
746
796
self.assertNotEqual(dir.transport.base, target.transport.base)
747
797
# we want target to have a branch that is in-place.
748
798
self.assertEqual(target, target.open_branch().bzrdir)
765
815
# this is ok too, not all formats have to support references.
767
817
self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
768
tree = dir.create_workingtree()
818
tree = self.createWorkingTreeOrSkip(dir)
769
819
self.build_tree(['foo'], transport=dir.root_transport)
771
821
tree.commit('revision 1', rev_id='1')
772
822
tree.commit('revision 2', rev_id='2', allow_pointless=True)
773
823
target = dir.sprout(self.get_url('target'), revision_id='1')
824
self.skipIfNoWorkingTree(target)
774
825
self.assertNotEqual(dir.transport.base, target.transport.base)
775
826
# we want target to have a branch that is in-place.
776
827
self.assertEqual(target, target.open_branch().bzrdir)
793
844
tree.commit('revision 1', rev_id='1')
794
845
tree.commit('revision 2', rev_id='2', allow_pointless=True)
795
846
dir = tree.bzrdir
796
target = dir.sprout(self.get_url('target'), revision_id='1')
847
target = self.sproutOrSkip(dir, self.get_url('target'), revision_id='1')
797
848
self.assertEqual('1', target.open_workingtree().last_revision())
799
850
def test_sprout_bzrdir_incomplete_source_with_basis(self):
810
861
tree.copy_content_into(source)
811
862
self.assertFalse(source.branch.repository.has_revision('2'))
812
863
dir = source.bzrdir
813
target = dir.sprout(self.get_url('target'), basis=tree.bzrdir)
864
target = self.sproutOrSkip(dir, self.get_url('target'),
814
866
self.assertEqual('2', target.open_branch().last_revision())
815
867
self.assertEqual('2', target.open_workingtree().last_revision())
816
868
self.assertTrue(target.open_branch().repository.has_revision('2'))
936
988
# because the default open will not open them and
937
989
# they may not be initializable.
939
# this has to be tested with local access as we still support creating
941
t = get_transport('.')
991
t = self.get_transport()
942
992
made_control = self.bzrdir_format.initialize(t.base)
943
993
made_repo = made_control.create_repository()
944
994
made_branch = made_control.create_branch()
945
made_tree = made_control.create_workingtree()
995
made_tree = self.createWorkingTreeOrSkip(made_control)
946
996
self.failUnless(isinstance(made_tree, workingtree.WorkingTree))
947
997
self.assertEqual(made_control, made_tree.bzrdir)
949
999
def test_create_workingtree_revision(self):
950
1000
# a bzrdir can construct a working tree for itself @ a specific revision.
1001
t = self.get_transport()
951
1002
source = self.make_branch_and_tree('source')
952
1003
source.commit('a', rev_id='a', allow_pointless=True)
953
1004
source.commit('b', rev_id='b', allow_pointless=True)
954
1005
self.build_tree(['new/'])
955
made_control = self.bzrdir_format.initialize('new')
1006
t_new = t.clone('new')
1007
made_control = self.bzrdir_format.initialize_on_transport(t_new)
956
1008
source.branch.repository.clone(made_control)
957
1009
source.branch.clone(made_control)
958
made_tree = made_control.create_workingtree(revision_id='a')
1011
made_tree = made_control.create_workingtree(revision_id='a')
1012
except errors.NotLocalUrl:
1013
raise TestSkipped("Can't make working tree on transport %r" % t)
959
1014
self.assertEqual('a', made_tree.last_revision())
961
1016
def test_open_workingtree(self):
994
1049
except errors.IncompatibleFormat:
995
1050
found_transport = dir.get_branch_transport(identifiable_format)
996
1051
self.assertTrue(isinstance(found_transport, transport.Transport))
997
# and the dir which has been initialized for us must be statable.
998
found_transport.stat('.')
1052
# and the dir which has been initialized for us must exist.
1053
found_transport.list_dir('.')
1000
1055
def test_get_repository_transport(self):
1001
1056
dir = self.make_bzrdir('.')
1015
1070
except errors.IncompatibleFormat:
1016
1071
found_transport = dir.get_repository_transport(identifiable_format)
1017
1072
self.assertTrue(isinstance(found_transport, transport.Transport))
1018
# and the dir which has been initialized for us must be statable.
1019
found_transport.stat('.')
1073
# and the dir which has been initialized for us must exist.
1074
found_transport.list_dir('.')
1021
1076
def test_get_workingtree_transport(self):
1022
1077
dir = self.make_bzrdir('.')
1036
1091
except errors.IncompatibleFormat:
1037
1092
found_transport = dir.get_workingtree_transport(identifiable_format)
1038
1093
self.assertTrue(isinstance(found_transport, transport.Transport))
1039
# and the dir which has been initialized for us must be statable.
1040
found_transport.stat('.')
1094
# and the dir which has been initialized for us must exist.
1095
found_transport.list_dir('.')
1042
1097
def test_root_transport(self):
1043
1098
dir = self.make_bzrdir('.')
1171
1226
dir.needs_format_conversion(None)
1173
1228
def test_upgrade_new_instance(self):
1174
"""Does an available updater work ?."""
1229
"""Does an available updater work?"""
1175
1230
dir = self.make_bzrdir('.')
1176
# for now, check is not ready for partial bzrdirs.
1231
# for now, upgrade is not ready for partial bzrdirs.
1177
1232
dir.create_repository()
1178
1233
dir.create_branch()
1179
dir.create_workingtree()
1234
self.createWorkingTreeOrSkip(dir)
1180
1235
if dir.can_convert_format():
1181
1236
# if its default updatable there must be an updater
1182
1237
# (we change the default to match the lastest known format