119
119
raise TestNotApplicable("format is not initializable")
120
120
self.bzrdir_format.initialize('.')
121
121
self.assertRaises(errors.AlreadyControlDirError,
122
self.bzrdir_format.initialize, '.')
122
self.bzrdir_format.initialize, '.')
124
124
def test_create_null_workingtree(self):
125
125
dir = self.make_controldir('dir1')
126
126
dir.create_repository()
127
127
dir.create_branch()
129
wt = dir.create_workingtree(revision_id=_mod_revision.NULL_REVISION)
129
wt = dir.create_workingtree(
130
revision_id=_mod_revision.NULL_REVISION)
130
131
except (errors.NotLocalUrl, errors.UnsupportedOperation):
131
132
raise TestSkipped("cannot make working tree with transport %r"
193
196
# This ControlDir format doesn't support ControlDirs without
194
197
# working trees, so this test is irrelevant.
195
198
raise TestNotApplicable("format does not support "
196
"control directories without working tree")
199
"control directories without working tree")
197
200
self.assertRaises(errors.NoWorkingTree, dir.open_workingtree)
199
202
def test_clone_bzrdir_repository_under_shared(self):
200
203
tree = self.make_branch_and_tree('commit_tree')
202
['foo'], transport=tree.controldir.transport.clone('..'))
205
['foo'], transport=tree.controldir.transport.clone('..'))
204
207
rev1 = tree.commit('revision 1')
205
208
dir = self.make_controldir('source')
213
216
self.make_repository('target', shared=True)
214
217
except errors.IncompatibleFormat:
215
218
raise TestNotApplicable(
216
"repository format does not support shared repositories")
219
"repository format does not support shared repositories")
217
220
target = dir.clone(self.get_url('target/child'))
218
221
self.assertNotEqual(dir.transport.base, target.transport.base)
219
222
self.assertRaises(errors.NoRepositoryPresent, target.open_repository)
224
227
shared_repo = self.make_repository('shared', shared=True)
225
228
except errors.IncompatibleFormat:
226
229
raise TestNotApplicable(
227
"repository format does not support shared repositories")
230
"repository format does not support shared repositories")
228
231
if not shared_repo._format.supports_nesting_repositories:
229
232
raise TestNotApplicable(
230
"format does not support nesting repositories")
233
"format does not support nesting repositories")
231
234
# Make a branch, 'commit_tree', and working tree outside of the shared
232
235
# repository, and commit some revisions to it.
233
236
tree = self.make_branch_and_tree('commit_tree')
249
252
# 'source', 'target', and the shared repo all have distinct bzrdirs.
250
253
self.assertNotEqual(dir.transport.base, target.transport.base)
251
254
self.assertNotEqual(
252
dir.transport.base, shared_repo.controldir.transport.base)
255
dir.transport.base, shared_repo.controldir.transport.base)
253
256
# The shared repository will contain revisions from the 'commit_tree'
254
257
# repository, even revisions that are not part of the history of the
255
258
# 'commit_tree' branch.
260
263
shared_repo = self.make_repository('shared', shared=True)
261
264
except errors.IncompatibleFormat:
262
265
raise TestNotApplicable(
263
"repository format does not support shared repositories")
266
"repository format does not support shared repositories")
264
267
if not shared_repo._format.supports_nesting_repositories:
265
268
raise TestNotApplicable(
266
"format does not support nesting repositories")
269
"format does not support nesting repositories")
267
270
tree = self.make_branch_and_tree('commit_tree')
268
271
self.build_tree(['commit_tree/foo'])
431
434
child_transport = self.get_transport('child')
433
436
child = branch.controldir.clone_on_transport(child_transport,
434
stacked_on=branch.base)
437
stacked_on=branch.base)
435
438
except (_mod_branch.UnstackableBranchFormat,
436
439
errors.UnstackableRepositoryFormat):
437
440
raise TestNotApplicable("branch or repository format does "
438
"not support stacking")
441
"not support stacking")
439
442
self.assertEqual(child.open_branch().get_stacked_on_url(), branch.base)
441
444
def test_set_branch_reference(self):
447
450
except errors.IncompatibleFormat:
448
451
# this is ok too, not all formats have to support references.
449
452
raise TestNotApplicable("control directory does not "
450
"support branch references")
451
self.assertEqual(referenced_branch.user_url, dir.get_branch_reference())
453
"support branch references")
454
self.assertEqual(referenced_branch.user_url,
455
dir.get_branch_reference())
453
457
def test_set_branch_reference_on_existing_reference(self):
454
458
"""set_branch_reference creates a branch reference"""
489
493
except errors.IncompatibleFormat:
490
494
# this is ok too, not all formats have to support references.
491
495
raise TestNotApplicable("control directory does not "
492
"support branch references")
496
"support branch references")
493
497
self.assertEqual(referenced_branch.user_url,
494
dir.get_branch_reference())
498
dir.get_branch_reference())
496
500
def test_get_branch_reference_on_non_reference(self):
497
501
"""get_branch_reference should return None for non-reference branches."""
512
516
if dir.has_branch():
513
517
# this format does not support branchless bzrdirs.
514
518
raise TestNotApplicable("format does not support "
515
"branchless control directories")
519
"branchless control directories")
516
520
self.assertRaises(errors.NotBranchError, dir.get_branch_reference)
518
522
def test_sprout_bzrdir_empty(self):
519
523
dir = self.make_controldir('source')
520
524
target = dir.sprout(self.get_url('target'))
521
self.assertNotEqual(dir.control_transport.base, target.control_transport.base)
525
self.assertNotEqual(dir.control_transport.base,
526
target.control_transport.base)
522
527
# creates a new repository branch and tree
523
528
target.open_repository()
524
529
target.open_branch()
572
577
shared_repo = self.make_repository('target', shared=True)
573
578
except errors.IncompatibleFormat:
574
579
raise TestNotApplicable("format does not support "
575
"shared repositories")
580
"shared repositories")
576
581
target = dir.sprout(self.get_url('target/child'))
577
self.assertNotEqual(dir.user_transport.base, target.user_transport.base)
582
self.assertNotEqual(dir.user_transport.base,
583
target.user_transport.base)
578
584
self.assertTrue(shared_repo.has_revision(rev1))
580
586
def test_sprout_bzrdir_repository_branch_both_under_shared(self):
599
605
dir.create_branch()
600
606
target = dir.sprout(self.get_url('shared/target'))
601
607
self.assertNotEqual(dir.transport.base, target.transport.base)
602
self.assertNotEqual(dir.transport.base, shared_repo.controldir.transport.base)
608
self.assertNotEqual(dir.transport.base,
609
shared_repo.controldir.transport.base)
603
610
self.assertTrue(shared_repo.has_revision(rev1))
605
612
def test_sprout_bzrdir_repository_branch_only_source_under_shared(self):
629
636
target = dir.sprout(self.get_url('target'))
630
637
self.assertNotEqual(dir.transport.base, target.transport.base)
631
638
self.assertNotEqual(
633
shared_repo.controldir.transport.base)
640
shared_repo.controldir.transport.base)
634
641
branch = target.open_branch()
635
642
# The sprouted bzrdir has a branch, so only revisions referenced by
636
643
# that branch are copied, rather than the whole repository. It's an
716
723
shared_repo = self.make_repository('target', shared=True)
717
724
except errors.IncompatibleFormat:
718
725
raise TestNotApplicable(
719
"format does not support shared repositories")
726
"format does not support shared repositories")
720
727
target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
721
728
self.assertNotEqual(
722
dir.control_transport.base, target.control_transport.base)
729
dir.control_transport.base, target.control_transport.base)
723
730
self.assertFalse(shared_repo.has_revision(rev1))
725
732
def test_sprout_bzrdir_branch_reference(self):
749
756
dir.set_branch_reference(referenced_tree.branch)
750
757
except errors.IncompatibleFormat:
751
758
raise TestNotApplicable(
752
"format does not support branch references")
759
"format does not support branch references")
753
760
self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
755
762
shared_repo = self.make_repository('target', shared=True)
756
763
except errors.IncompatibleFormat:
757
764
raise TestNotApplicable(
758
"format does not support shared repositories")
765
"format does not support shared repositories")
759
766
target = dir.sprout(self.get_url('target/child'))
760
767
self.assertNotEqual(dir.transport.base, target.transport.base)
761
768
# we want target to have a branch that is in-place.
776
783
except errors.IncompatibleFormat:
777
784
# this is ok too, not all formats have to support references.
778
785
raise TestNotApplicable(
779
"format does not support branch references")
786
"format does not support branch references")
780
787
self.assertRaises(errors.NoRepositoryPresent, dir.open_repository)
782
789
shared_repo = self.make_repository('target', shared=True)
783
790
except errors.IncompatibleFormat:
784
791
raise TestNotApplicable(
785
"format does not support shared repositories")
792
"format does not support shared repositories")
786
793
target = dir.sprout(self.get_url('target/child'), force_new_repo=True)
787
794
self.assertNotEqual(dir.transport.base, target.transport.base)
788
795
# we want target to have a branch that is in-place.
813
820
# when sprouting a branch all revisions named in the tags are copied
815
822
builder = self.make_branch_builder('source')
816
source, rev1, rev2 = fixtures.build_branch_with_non_ancestral_rev(builder)
823
source, rev1, rev2 = fixtures.build_branch_with_non_ancestral_rev(
818
826
source.tags.set_tag('tag-a', rev2)
819
827
except errors.TagsNotSupported:
987
995
tree.commit('revision 2', allow_pointless=True)
988
996
dir = tree.controldir
989
997
target = self.sproutOrSkip(
990
dir, self.get_url('target'), revision_id=rev1)
998
dir, self.get_url('target'), revision_id=rev1)
991
999
self.assertEqual([rev1], target.open_workingtree().get_parent_ids())
993
1001
def test_sprout_takes_accelerator(self):
998
1006
rev2 = tree.commit('revision 2', allow_pointless=True)
999
1007
dir = tree.controldir
1000
1008
target = self.sproutOrSkip(
1001
dir, self.get_url('target'), accelerator_tree=tree)
1009
dir, self.get_url('target'), accelerator_tree=tree)
1002
1010
self.assertEqual([rev2], target.open_workingtree().get_parent_ids())
1004
1012
def test_sprout_branch_no_tree(self):
1052
1060
# in through an unisolated test though - see
1053
1061
# <https://bugs.launchpad.net/bzr/+bug/504102>
1054
1062
self.assertEqual(
1055
getattr(self.bzrdir_format, '_network_name', None),
1063
getattr(self.bzrdir_format, '_network_name', None),
1057
1065
# supported formats must be able to init and open
1058
1066
t = self.get_transport()
1059
1067
readonly_t = self.get_readonly_transport()
1099
1107
raise TestNotApplicable("format is not initializable")
1100
1108
t = self.get_transport('missing/dir')
1101
1109
self.assertRaises(
1102
errors.NoSuchFile, self.assertInitializeEx, t,
1103
create_prefix=False)
1110
errors.NoSuchFile, self.assertInitializeEx, t,
1111
create_prefix=False)
1105
1113
def test_format_initialize_on_transport_ex_force_new_repo_True(self):
1106
1114
t = self.get_transport('repo')
1107
1115
repo_fmt = controldir.format_registry.make_controldir('1.9')
1108
1116
repo_name = repo_fmt.repository_format.network_name()
1109
1117
repo = repo_fmt.initialize_on_transport_ex(
1110
t, repo_format_name=repo_name, shared_repo=True)[0]
1118
t, repo_format_name=repo_name, shared_repo=True)[0]
1111
1119
made_repo, control = self.assertInitializeEx(
1112
t.clone('branch'), force_new_repo=True,
1113
repo_format_name=repo_name)
1120
t.clone('branch'), force_new_repo=True,
1121
repo_format_name=repo_name)
1114
1122
self.assertNotEqual(
1123
repo.controldir.root_transport.base,
1124
made_repo.controldir.root_transport.base)
1126
def test_format_initialize_on_transport_ex_force_new_repo_False(self):
1127
t = self.get_transport('repo')
1128
repo_fmt = controldir.format_registry.make_controldir('1.9')
1129
repo_name = repo_fmt.repository_format.network_name()
1130
repo = repo_fmt.initialize_on_transport_ex(
1131
t, repo_format_name=repo_name, shared_repo=True)[0]
1132
made_repo, control = self.assertInitializeEx(
1133
t.clone('branch'), force_new_repo=False,
1134
repo_format_name=repo_name)
1135
if not control._format.fixed_components:
1115
1137
repo.controldir.root_transport.base,
1116
1138
made_repo.controldir.root_transport.base)
1118
def test_format_initialize_on_transport_ex_force_new_repo_False(self):
1119
t = self.get_transport('repo')
1120
repo_fmt = controldir.format_registry.make_controldir('1.9')
1121
repo_name = repo_fmt.repository_format.network_name()
1122
repo = repo_fmt.initialize_on_transport_ex(
1123
t, repo_format_name=repo_name, shared_repo=True)[0]
1124
made_repo, control = self.assertInitializeEx(
1125
t.clone('branch'), force_new_repo=False,
1126
repo_format_name=repo_name)
1127
if not control._format.fixed_components:
1129
repo.controldir.root_transport.base,
1130
made_repo.controldir.root_transport.base)
1132
1140
def test_format_initialize_on_transport_ex_repo_fmt_name_None(self):
1133
1141
t = self.get_transport('dir')
1134
1142
repo, control = self.assertInitializeEx(t)
1170
1178
expected_format = self.bzrdir_format
1171
1179
if not isinstance(expected_format, RemoteBzrDirFormat):
1172
1180
self.assertEqual(
1173
control._format.network_name(),
1174
expected_format.network_name())
1181
control._format.network_name(),
1182
expected_format.network_name())
1175
1183
self.assertEqual(
1176
control._format.network_name(),
1177
opened._format.network_name())
1184
control._format.network_name(),
1185
opened._format.network_name())
1178
1186
self.assertEqual(control.__class__, opened.__class__)
1179
1187
return repo, control
1236
1244
append_revisions_only=True)
1237
1245
except errors.UpgradeRequired:
1238
1246
raise TestNotApplicable(
1239
"format does not support append_revisions_only setting")
1247
"format does not support append_revisions_only setting")
1240
1248
self.assertIsInstance(made_branch, breezy.branch.Branch)
1241
1249
self.assertEqual(True, made_branch.get_append_revisions_only())
1242
1250
self.assertEqual(made_control, made_branch.controldir)
1393
1401
made_tree = made_control.create_workingtree()
1394
1402
except (errors.NotLocalUrl, errors.UnsupportedOperation):
1395
1403
raise TestSkipped(
1396
"Can't initialize %r on transport %r" % (
1397
self.bzrdir_format, t))
1404
"Can't initialize %r on transport %r" % (
1405
self.bzrdir_format, t))
1398
1406
opened_tree = made_control.open_workingtree()
1399
1407
self.assertEqual(made_control, opened_tree.controldir)
1400
1408
self.assertIsInstance(opened_tree, made_tree.__class__)
1411
1419
except (errors.NotLocalUrl, errors.UnsupportedOperation):
1412
1420
raise TestSkipped("Can't initialize %r on transport %r"
1413
1421
% (self.bzrdir_format, t))
1414
dir = controldir.ControlDir.open(t.base+",branch=foo")
1422
dir = controldir.ControlDir.open(t.base + ",branch=foo")
1415
1423
self.assertEqual(
1416
{"branch": "foo"}, dir.user_transport.get_segment_parameters())
1424
{"branch": "foo"}, dir.user_transport.get_segment_parameters())
1417
1425
self.assertEqual("foo", dir._get_selected_branch())
1419
1427
def test_get_selected_branch_none_selected(self):
1470
1478
except errors.IncompatibleFormat:
1471
1479
# need a shared repository to test this.
1472
1480
raise TestNotApplicable(
1473
"requires format with shared repository support")
1481
"requires format with shared repository support")
1474
1482
if not repo._format.supports_nesting_repositories:
1475
1483
raise TestNotApplicable(
1476
"requires support for nesting repositories")
1484
"requires support for nesting repositories")
1477
1485
url = self.get_url('childbzrdir')
1478
1486
self.get_transport().mkdir('childbzrdir')
1479
1487
made_control = self.bzrdir_format.initialize(url)
1496
1504
except errors.IncompatibleFormat:
1497
1505
# need a shared repository to test this.
1498
1506
raise TestNotApplicable(
1499
"requires support for shared repositories")
1507
"requires support for shared repositories")
1500
1508
if not containing_repo._format.supports_nesting_repositories:
1501
1509
raise TestNotApplicable(
1502
"format does not support nesting repositories")
1510
"format does not support nesting repositories")
1503
1511
child_repo = self.make_repository('childrepo')
1504
1512
opened_control = controldir.ControlDir.open(self.get_url('childrepo'))
1505
1513
found_repo = opened_control.find_repository()
1513
1521
except errors.IncompatibleFormat:
1514
1522
# need a shared repository to test this.
1515
1523
raise TestNotApplicable(
1516
"requires support for shared repositories")
1524
"requires support for shared repositories")
1517
1525
if not containing_repo._format.supports_nesting_repositories:
1518
1526
raise TestNotApplicable(
1519
"requires support for nesting repositories")
1527
"requires support for nesting repositories")
1520
1528
url = self.get_url('childrepo')
1521
1529
self.get_transport().mkdir('childrepo')
1522
1530
child_control = self.bzrdir_format.initialize(url)
1524
1532
opened_control = controldir.ControlDir.open(self.get_url('childrepo'))
1525
1533
found_repo = opened_control.find_repository()
1526
1534
self.assertEqual(
1527
child_repo.controldir.root_transport.base,
1528
found_repo.controldir.root_transport.base)
1535
child_repo.controldir.root_transport.base,
1536
found_repo.controldir.root_transport.base)
1529
1537
self.assertNotEqual(
1530
child_repo.controldir.root_transport.base,
1531
containing_repo.controldir.root_transport.base)
1538
child_repo.controldir.root_transport.base,
1539
containing_repo.controldir.root_transport.base)
1533
1541
def test_find_repository_with_nested_dirs_works(self):
1534
1542
# find repo inside a bzrdir inside a bzrdir inside a shared repo