104
105
target.get(path).read(),
105
106
"text for file %r differs:\n" % path)
108
def skipIfNoWorkingTree(self, a_bzrdir):
109
"""Raises TestSkipped if a_bzrdir doesn't have a working tree.
111
If the bzrdir does have a workingtree, this is a no-op.
114
a_bzrdir.open_workingtree()
115
except (errors.NotLocalUrl, errors.NoWorkingTree):
116
raise TestSkipped("bzrdir on transport %r has no working tree"
117
% a_bzrdir.transport)
119
def createWorkingTreeOrSkip(self, a_bzrdir):
120
"""Create a working tree on a_bzrdir, or raise TestSkipped.
122
A simple wrapper for create_workingtree that translates NotLocalUrl into
123
TestSkipped. Returns the newly created working tree.
126
return a_bzrdir.create_workingtree()
127
except errors.NotLocalUrl:
128
raise TestSkipped("cannot make working tree with transport %r"
129
% a_bzrdir.transport)
131
def sproutOrSkip(self, from_bzrdir, to_url, revision_id=None, basis=None,
132
force_new_repo=False):
133
"""Sprout from_bzrdir into to_url, or raise TestSkipped.
135
A simple wrapper for from_bzrdir.sprout that translates NotLocalUrl into
136
TestSkipped. Returns the newly sprouted bzrdir.
139
target = from_bzrdir.sprout(to_url, revision_id=revision_id,
141
force_new_repo=force_new_repo)
142
except errors.NotLocalUrl:
143
raise TestSkipped('Cannot sprout to remote bzrdirs.')
146
def test_create_null_workingtree(self):
147
dir = self.make_bzrdir('dir1')
148
dir.create_repository()
150
wt = dir.create_workingtree(revision_id=bzrlib.revision.NULL_REVISION)
151
self.assertIs(wt.last_revision(), None)
107
153
def test_clone_bzrdir_empty(self):
108
154
dir = self.make_bzrdir('source')
109
155
target = dir.clone(self.get_url('target'))
162
208
tree.commit('revision 1', rev_id='1')
163
209
tree.bzrdir.open_branch().set_revision_history([])
164
tree.set_last_revision(None)
210
tree.set_parent_trees([])
165
211
tree.commit('revision 2', rev_id='2')
166
212
tree.bzrdir.open_repository().copy_content_into(shared_repo)
167
213
dir = self.make_bzrdir('shared/source')
182
228
tree.commit('revision 1', rev_id='1')
183
229
tree.bzrdir.open_branch().set_revision_history([])
184
tree.set_last_revision(None)
230
tree.set_parent_trees([])
185
231
tree.commit('revision 2', rev_id='2')
186
232
tree.bzrdir.open_repository().copy_content_into(shared_repo)
187
233
shared_repo.set_make_working_trees(False)
227
273
tree.commit('revision 1', rev_id='1')
228
274
tree.bzrdir.open_branch().set_revision_history([])
229
tree.set_last_revision(None)
275
tree.set_parent_trees([])
230
276
tree.commit('revision 2', rev_id='2')
231
277
source = self.make_repository('source')
232
278
tree.bzrdir.open_repository().copy_content_into(source)
332
378
tree.commit('revision 1')
333
379
dir = tree.bzrdir
334
380
target = dir.clone(self.get_url('target'))
381
self.skipIfNoWorkingTree(target)
335
382
self.assertNotEqual(dir.transport.base, target.transport.base)
336
383
self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
337
384
['./.bzr/stat-cache',
348
395
tree.commit('revision 1')
349
396
dir = tree.bzrdir
350
397
target = dir.clone(self.get_url('target'))
398
self.skipIfNoWorkingTree(target)
351
399
self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
352
400
['./.bzr/stat-cache',
353
401
'./.bzr/checkout/stat-cache',
373
421
except errors.IncompatibleFormat:
374
422
# this is ok too, not all formats have to support references.
376
dir.create_workingtree()
424
self.createWorkingTreeOrSkip(dir)
377
425
target = dir.clone(self.get_url('target'))
426
self.skipIfNoWorkingTree(target)
378
427
self.assertNotEqual(dir.transport.base, target.transport.base)
379
428
self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
380
429
['./.bzr/stat-cache',
382
431
'./.bzr/repository/inventory.knit',
386
434
def test_clone_bzrdir_tree_revision(self):
387
435
# test for revision limiting, [smoke test, not corner case checks].
388
436
# make a tree with a revision with a last-revision
396
444
tree.commit('revision 2', rev_id='2', allow_pointless=True)
397
445
dir = tree.bzrdir
398
446
target = dir.clone(self.get_url('target'), revision_id='1')
447
self.skipIfNoWorkingTree(target)
399
448
self.assertEqual('1', target.open_workingtree().last_revision())
401
450
def test_clone_bzrdir_incomplete_source_with_basis(self):
414
463
dir = source.bzrdir
415
464
target = dir.clone(self.get_url('target'), basis=tree.bzrdir)
416
465
self.assertEqual('2', target.open_branch().last_revision())
417
self.assertEqual('2', target.open_workingtree().last_revision())
467
self.assertEqual('2', target.open_workingtree().last_revision())
468
except errors.NoWorkingTree:
469
# It should have a working tree if it's able to have one, so if
470
# we're here make sure it really can't have one.
471
self.assertRaises(errors.NotLocalUrl, target.create_workingtree)
418
472
self.assertTrue(target.open_branch().repository.has_revision('2'))
420
474
def test_sprout_bzrdir_empty(self):
421
475
dir = self.make_bzrdir('source')
422
target = dir.sprout(self.get_url('target'))
476
target = self.sproutOrSkip(dir, self.get_url('target'))
423
477
self.assertNotEqual(dir.transport.base, target.transport.base)
424
478
# creates a new repository branch and tree
425
479
target.open_repository()
433
487
self.make_repository('target', shared=True)
434
488
except errors.IncompatibleFormat:
436
target = dir.sprout(self.get_url('target/child'))
490
target = self.sproutOrSkip(dir, self.get_url('target/child'))
437
491
self.assertRaises(errors.NoRepositoryPresent, target.open_repository)
438
492
target.open_branch()
439
493
target.open_workingtree()
441
def test_sprout_bzrdir_empty_under_shared_repo(self):
495
def test_sprout_bzrdir_empty_under_shared_repo_force_new(self):
442
496
# the force_new_repo parameter should force use of a new repo in an empty
443
497
# bzrdir's sprout logic
444
498
dir = self.make_bzrdir('source')
446
500
self.make_repository('target', shared=True)
447
501
except errors.IncompatibleFormat:
449
target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
503
target = self.sproutOrSkip(dir, self.get_url('target/child'),
450
505
target.open_repository()
451
506
target.open_branch()
452
507
target.open_workingtree()
460
515
repo = dir.create_repository()
461
516
repo.fetch(tree.branch.repository)
462
517
self.assertTrue(repo.has_revision('1'))
463
target = dir.sprout(self.get_url('target'))
518
target = self.sproutOrSkip(dir, self.get_url('target'))
464
519
self.assertNotEqual(dir.transport.base, target.transport.base)
465
520
self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
466
521
['./.bzr/repository/inventory.knit',
473
528
tree.commit('revision 1', rev_id='1')
474
529
tree.bzrdir.open_branch().set_revision_history([])
475
tree.set_last_revision(None)
530
tree.set_parent_trees([])
476
531
tree.commit('revision 2', rev_id='2')
477
532
source = self.make_repository('source')
478
533
tree.bzrdir.open_repository().copy_content_into(source)
481
536
shared_repo = self.make_repository('target', shared=True)
482
537
except errors.IncompatibleFormat:
484
target = dir.sprout(self.get_url('target/child'))
539
target = self.sproutOrSkip(dir, self.get_url('target/child'))
485
540
self.assertNotEqual(dir.transport.base, target.transport.base)
486
541
self.assertTrue(shared_repo.has_revision('1'))
496
551
tree.commit('revision 1', rev_id='1')
497
552
tree.bzrdir.open_branch().set_revision_history([])
498
tree.set_last_revision(None)
553
tree.set_parent_trees([])
499
554
tree.commit('revision 2', rev_id='2')
500
555
tree.bzrdir.open_repository().copy_content_into(shared_repo)
501
556
dir = self.make_bzrdir('shared/source')
502
557
dir.create_branch()
503
target = dir.sprout(self.get_url('shared/target'))
558
target = self.sproutOrSkip(dir, self.get_url('shared/target'))
504
559
self.assertNotEqual(dir.transport.base, target.transport.base)
505
560
self.assertNotEqual(dir.transport.base, shared_repo.bzrdir.transport.base)
506
561
self.assertTrue(shared_repo.has_revision('1'))
516
571
tree.commit('revision 1', rev_id='1')
517
572
tree.bzrdir.open_branch().set_revision_history([])
518
tree.set_last_revision(None)
573
tree.set_parent_trees([])
519
574
tree.commit('revision 2', rev_id='2')
520
575
tree.bzrdir.open_repository().copy_content_into(shared_repo)
521
576
shared_repo.set_make_working_trees(False)
523
578
self.assertTrue(shared_repo.has_revision('1'))
524
579
dir = self.make_bzrdir('shared/source')
525
580
dir.create_branch()
526
target = dir.sprout(self.get_url('target'))
581
target = self.sproutOrSkip(dir, self.get_url('target'))
527
582
self.assertNotEqual(dir.transport.base, target.transport.base)
528
583
self.assertNotEqual(dir.transport.base, shared_repo.bzrdir.transport.base)
529
584
branch = target.open_branch()
538
593
tree.commit('revision 1', rev_id='1')
539
594
tree.bzrdir.open_branch().set_revision_history([])
540
tree.set_last_revision(None)
595
tree.set_parent_trees([])
541
596
tree.commit('revision 2', rev_id='2')
542
597
source = self.make_repository('source')
543
598
tree.bzrdir.open_repository().copy_content_into(source)
546
601
shared_repo = self.make_repository('target', shared=True)
547
602
except errors.IncompatibleFormat:
549
target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
604
target = self.sproutOrSkip(dir, self.get_url('target/child'),
550
606
self.assertNotEqual(dir.transport.base, target.transport.base)
551
607
self.assertFalse(shared_repo.has_revision('1'))
561
617
tree.commit('revision 1', rev_id='1')
562
618
tree.bzrdir.open_branch().set_revision_history([])
563
tree.set_last_revision(None)
619
tree.set_parent_trees([])
564
620
tree.commit('revision 2', rev_id='2')
565
621
source = self.make_repository('source')
566
622
tree.bzrdir.open_repository().copy_content_into(source)
567
623
dir = source.bzrdir
568
target = dir.sprout(self.get_url('target'), revision_id='2')
624
target = self.sproutOrSkip(dir, self.get_url('target'), revision_id='2')
569
625
raise TestSkipped('revision limiting not strict yet')
571
627
def test_sprout_bzrdir_branch_and_repo(self):
577
633
tree.bzrdir.open_repository().copy_content_into(source.repository)
578
634
tree.bzrdir.open_branch().copy_content_into(source)
579
635
dir = source.bzrdir
580
target = dir.sprout(self.get_url('target'))
636
target = self.sproutOrSkip(dir, self.get_url('target'))
581
637
self.assertNotEqual(dir.transport.base, target.transport.base)
582
638
self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
583
639
['./.bzr/stat-cache',
602
658
shared_repo = self.make_repository('target', shared=True)
603
659
except errors.IncompatibleFormat:
605
target = dir.sprout(self.get_url('target/child'))
661
target = self.sproutOrSkip(dir, self.get_url('target/child'))
606
662
self.assertTrue(shared_repo.has_revision('1'))
608
664
def test_sprout_bzrdir_branch_and_repo_shared_force_new_repo(self):
620
676
shared_repo = self.make_repository('target', shared=True)
621
677
except errors.IncompatibleFormat:
623
target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
679
target = self.sproutOrSkip(dir, self.get_url('target/child'),
624
681
self.assertNotEqual(dir.transport.base, target.transport.base)
625
682
self.assertFalse(shared_repo.has_revision('1'))
635
692
# this is ok too, not all formats have to support references.
637
694
self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
638
target = dir.sprout(self.get_url('target'))
695
target = self.sproutOrSkip(dir, self.get_url('target'))
639
696
self.assertNotEqual(dir.transport.base, target.transport.base)
640
697
# we want target to have a branch that is in-place.
641
698
self.assertEqual(target, target.open_branch().bzrdir)
659
716
shared_repo = self.make_repository('target', shared=True)
660
717
except errors.IncompatibleFormat:
662
target = dir.sprout(self.get_url('target/child'))
719
target = self.sproutOrSkip(dir, self.get_url('target/child'))
663
720
self.assertNotEqual(dir.transport.base, target.transport.base)
664
721
# we want target to have a branch that is in-place.
665
722
self.assertEqual(target, target.open_branch().bzrdir)
685
742
shared_repo = self.make_repository('target', shared=True)
686
743
except errors.IncompatibleFormat:
688
target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
745
target = self.sproutOrSkip(dir, self.get_url('target/child'),
689
747
self.assertNotEqual(dir.transport.base, target.transport.base)
690
748
# we want target to have a branch that is in-place.
691
749
self.assertEqual(target, target.open_branch().bzrdir)
708
766
tree.bzrdir.open_repository().copy_content_into(source.repository)
709
767
tree.bzrdir.open_branch().copy_content_into(source)
710
768
dir = source.bzrdir
711
target = dir.sprout(self.get_url('target'), revision_id='1')
769
target = self.sproutOrSkip(dir, self.get_url('target'), revision_id='1')
712
770
self.assertEqual('1', target.open_branch().last_revision())
714
772
def test_sprout_bzrdir_tree_branch_repo(self):
718
776
tree.commit('revision 1')
719
777
dir = tree.bzrdir
720
target = dir.sprout(self.get_url('target'))
778
target = self.sproutOrSkip(dir, self.get_url('target'))
721
779
self.assertNotEqual(dir.transport.base, target.transport.base)
722
780
self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
723
781
['./.bzr/stat-cache',
739
797
# this is ok too, not all formats have to support references.
741
799
self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
742
tree = dir.create_workingtree()
800
tree = self.createWorkingTreeOrSkip(dir)
743
801
tree.bzrdir.root_transport.mkdir('subdir')
744
802
tree.add('subdir')
745
target = dir.sprout(self.get_url('target'))
803
target = self.sproutOrSkip(dir, self.get_url('target'))
746
804
self.assertNotEqual(dir.transport.base, target.transport.base)
747
805
# we want target to have a branch that is in-place.
748
806
self.assertEqual(target, target.open_branch().bzrdir)
765
823
# this is ok too, not all formats have to support references.
767
825
self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
768
tree = dir.create_workingtree()
826
tree = self.createWorkingTreeOrSkip(dir)
769
827
self.build_tree(['foo'], transport=dir.root_transport)
771
829
tree.commit('revision 1', rev_id='1')
772
830
tree.commit('revision 2', rev_id='2', allow_pointless=True)
773
831
target = dir.sprout(self.get_url('target'), revision_id='1')
832
self.skipIfNoWorkingTree(target)
774
833
self.assertNotEqual(dir.transport.base, target.transport.base)
775
834
# we want target to have a branch that is in-place.
776
835
self.assertEqual(target, target.open_branch().bzrdir)
793
852
tree.commit('revision 1', rev_id='1')
794
853
tree.commit('revision 2', rev_id='2', allow_pointless=True)
795
854
dir = tree.bzrdir
796
target = dir.sprout(self.get_url('target'), revision_id='1')
855
target = self.sproutOrSkip(dir, self.get_url('target'), revision_id='1')
797
856
self.assertEqual('1', target.open_workingtree().last_revision())
799
858
def test_sprout_bzrdir_incomplete_source_with_basis(self):
810
869
tree.copy_content_into(source)
811
870
self.assertFalse(source.branch.repository.has_revision('2'))
812
871
dir = source.bzrdir
813
target = dir.sprout(self.get_url('target'), basis=tree.bzrdir)
872
target = self.sproutOrSkip(dir, self.get_url('target'),
814
874
self.assertEqual('2', target.open_branch().last_revision())
815
875
self.assertEqual('2', target.open_workingtree().last_revision())
816
876
self.assertTrue(target.open_branch().repository.has_revision('2'))
936
996
# because the default open will not open them and
937
997
# they may not be initializable.
939
# this has to be tested with local access as we still support creating
941
t = get_transport('.')
999
t = self.get_transport()
942
1000
made_control = self.bzrdir_format.initialize(t.base)
943
1001
made_repo = made_control.create_repository()
944
1002
made_branch = made_control.create_branch()
945
made_tree = made_control.create_workingtree()
1003
made_tree = self.createWorkingTreeOrSkip(made_control)
946
1004
self.failUnless(isinstance(made_tree, workingtree.WorkingTree))
947
1005
self.assertEqual(made_control, made_tree.bzrdir)
949
1007
def test_create_workingtree_revision(self):
950
1008
# a bzrdir can construct a working tree for itself @ a specific revision.
1009
t = self.get_transport()
951
1010
source = self.make_branch_and_tree('source')
952
1011
source.commit('a', rev_id='a', allow_pointless=True)
953
1012
source.commit('b', rev_id='b', allow_pointless=True)
954
1013
self.build_tree(['new/'])
955
made_control = self.bzrdir_format.initialize('new')
1014
t_new = t.clone('new')
1015
made_control = self.bzrdir_format.initialize_on_transport(t_new)
956
1016
source.branch.repository.clone(made_control)
957
1017
source.branch.clone(made_control)
958
made_tree = made_control.create_workingtree(revision_id='a')
1019
made_tree = made_control.create_workingtree(revision_id='a')
1020
except errors.NotLocalUrl:
1021
raise TestSkipped("Can't make working tree on transport %r" % t)
959
1022
self.assertEqual('a', made_tree.last_revision())
961
1024
def test_open_workingtree(self):
994
1057
except errors.IncompatibleFormat:
995
1058
found_transport = dir.get_branch_transport(identifiable_format)
996
1059
self.assertTrue(isinstance(found_transport, transport.Transport))
997
# and the dir which has been initialized for us must be statable.
998
found_transport.stat('.')
1060
# and the dir which has been initialized for us must exist.
1061
found_transport.list_dir('.')
1000
1063
def test_get_repository_transport(self):
1001
1064
dir = self.make_bzrdir('.')
1015
1078
except errors.IncompatibleFormat:
1016
1079
found_transport = dir.get_repository_transport(identifiable_format)
1017
1080
self.assertTrue(isinstance(found_transport, transport.Transport))
1018
# and the dir which has been initialized for us must be statable.
1019
found_transport.stat('.')
1081
# and the dir which has been initialized for us must exist.
1082
found_transport.list_dir('.')
1021
1084
def test_get_workingtree_transport(self):
1022
1085
dir = self.make_bzrdir('.')
1036
1099
except errors.IncompatibleFormat:
1037
1100
found_transport = dir.get_workingtree_transport(identifiable_format)
1038
1101
self.assertTrue(isinstance(found_transport, transport.Transport))
1039
# and the dir which has been initialized for us must be statable.
1040
found_transport.stat('.')
1102
# and the dir which has been initialized for us must exist.
1103
found_transport.list_dir('.')
1042
1105
def test_root_transport(self):
1043
1106
dir = self.make_bzrdir('.')
1171
1234
dir.needs_format_conversion(None)
1173
1236
def test_upgrade_new_instance(self):
1174
"""Does an available updater work ?."""
1237
"""Does an available updater work?"""
1175
1238
dir = self.make_bzrdir('.')
1176
# for now, check is not ready for partial bzrdirs.
1239
# for now, upgrade is not ready for partial bzrdirs.
1177
1240
dir.create_repository()
1178
1241
dir.create_branch()
1179
dir.create_workingtree()
1242
self.createWorkingTreeOrSkip(dir)
1180
1243
if dir.can_convert_format():
1181
1244
# if its default updatable there must be an updater
1182
1245
# (we change the default to match the lastest known format