255
244
self.get_branch().repository.get_revision,
258
def test_nicks_bzr(self):
259
"""Test the behaviour of branch nicks specific to bzr branches.
248
# compare the gpg-to-sign info for a commit with a ghost and
249
# an identical tree without a ghost
250
# fetch missing should rewrite the TOC of weaves to list newly available parents.
252
def test_sign_existing_revision(self):
253
wt = self.make_branch_and_tree('.')
255
wt.commit("base", allow_pointless=True, rev_id='A')
256
from bzrlib.testament import Testament
257
strategy = gpg.LoopbackGPGStrategy(None)
258
branch.repository.lock_write()
259
branch.repository.start_write_group()
260
branch.repository.sign_revision('A', strategy)
261
branch.repository.commit_write_group()
262
branch.repository.unlock()
263
self.assertEqual('-----BEGIN PSEUDO-SIGNED CONTENT-----\n' +
264
Testament.from_revision(branch.repository,
265
'A').as_short_text() +
266
'-----END PSEUDO-SIGNED CONTENT-----\n',
267
branch.repository.get_signature_text('A'))
269
def test_store_signature(self):
270
wt = self.make_branch_and_tree('.')
274
branch.repository.start_write_group()
276
branch.repository.store_revision_signature(
277
gpg.LoopbackGPGStrategy(None), 'FOO', 'A')
279
branch.repository.abort_write_group()
282
branch.repository.commit_write_group()
285
# A signature without a revision should not be accessible.
286
self.assertRaises(errors.NoSuchRevision,
287
branch.repository.has_signature_for_revision_id,
289
wt.commit("base", allow_pointless=True, rev_id='A')
290
self.assertEqual('-----BEGIN PSEUDO-SIGNED CONTENT-----\n'
291
'FOO-----END PSEUDO-SIGNED CONTENT-----\n',
292
branch.repository.get_signature_text('A'))
294
def test_branch_keeps_signatures(self):
295
wt = self.make_branch_and_tree('source')
296
wt.commit('A', allow_pointless=True, rev_id='A')
297
repo = wt.branch.repository
299
repo.start_write_group()
300
repo.sign_revision('A', gpg.LoopbackGPGStrategy(None))
301
repo.commit_write_group()
303
#FIXME: clone should work to urls,
304
# wt.clone should work to disks.
305
self.build_tree(['target/'])
306
d2 = repo.bzrdir.clone(urlutils.local_path_to_url('target'))
307
self.assertEqual(repo.get_signature_text('A'),
308
d2.open_repository().get_signature_text('A'))
310
def test_missing_revisions(self):
311
t1 = self.make_branch_and_tree('b1')
312
rev1 = t1.commit('one')
313
t2 = t1.bzrdir.sprout('b2').open_workingtree()
314
rev2 = t1.commit('two')
315
rev3 = t1.commit('three')
317
self.assertEqual([rev2, rev3],
318
self.applyDeprecated(deprecated_in((1, 6, 0)),
319
t2.branch.missing_revisions, t1.branch))
322
self.applyDeprecated(deprecated_in((1, 6, 0)),
323
t2.branch.missing_revisions, t1.branch, stop_revision=1))
324
self.assertEqual([rev2],
325
self.applyDeprecated(deprecated_in((1, 6, 0)),
326
t2.branch.missing_revisions, t1.branch, stop_revision=2))
327
self.assertEqual([rev2, rev3],
328
self.applyDeprecated(deprecated_in((1, 6, 0)),
329
t2.branch.missing_revisions, t1.branch, stop_revision=3))
331
self.assertRaises(errors.NoSuchRevision,
332
self.applyDeprecated, deprecated_in((1, 6, 0)),
333
t2.branch.missing_revisions, t1.branch, stop_revision=4)
335
rev4 = t2.commit('four')
336
self.assertRaises(errors.DivergedBranches,
337
self.applyDeprecated, deprecated_in((1, 6, 0)),
338
t2.branch.missing_revisions, t1.branch)
340
def test_nicks(self):
341
"""Test explicit and implicit branch nicknames.
261
343
Nicknames are implicitly the name of the branch's directory, unless an
262
344
explicit nickname is set. That is, an explicit nickname always
263
345
overrides the implicit one.
266
t = self.get_transport()
347
t = get_transport(self.get_url())
267
348
branch = self.make_branch('bzr.dev')
268
if not isinstance(branch, _mod_branch.BzrBranch):
269
raise tests.TestNotApplicable("not a bzr branch format")
270
349
# The nick will be 'bzr.dev', because there is no explicit nick set.
271
350
self.assertEqual(branch.nick, 'bzr.dev')
272
351
# Move the branch to a different directory, 'bzr.ab'. Now that branch
273
352
# will report its nick as 'bzr.ab'.
274
353
t.move('bzr.dev', 'bzr.ab')
275
branch = _mod_branch.Branch.open(self.get_url('bzr.ab'))
354
branch = Branch.open(self.get_url('bzr.ab'))
276
355
self.assertEqual(branch.nick, 'bzr.ab')
277
356
# Set the branch nick explicitly. This will ensure there's a branch
278
357
# config file in the branch.
279
358
branch.nick = "Aaron's branch"
280
359
if not isinstance(branch, remote.RemoteBranch):
281
self.assertTrue(branch._transport.has("branch.conf"))
360
self.failUnless(branch._transport.has("branch.conf"))
282
361
# Because the nick has been set explicitly, the nick is now always
283
362
# "Aaron's branch", regardless of directory name.
284
363
self.assertEqual(branch.nick, "Aaron's branch")
285
364
t.move('bzr.ab', 'integration')
286
branch = _mod_branch.Branch.open(self.get_url('integration'))
287
self.assertEqual(branch.nick, "Aaron's branch")
288
branch.nick = u"\u1234"
289
self.assertEqual(branch.nick, u"\u1234")
291
def test_nicks(self):
292
"""Test explicit and implicit branch nicknames.
294
A nickname is always available, whether set explicitly or not.
296
t = self.get_transport()
297
branch = self.make_branch('bzr.dev')
298
# An implicit nick name is set; what it is exactly depends on the
300
self.assertIsInstance(branch.nick, basestring)
301
# Set the branch nick explicitly.
302
branch.nick = "Aaron's branch"
303
# Because the nick has been set explicitly, the nick is now always
365
branch = Branch.open(self.get_url('integration'))
305
366
self.assertEqual(branch.nick, "Aaron's branch")
306
367
branch.nick = u"\u1234"
307
368
self.assertEqual(branch.nick, u"\u1234")
316
377
self.assertEqual(committed.properties["branch-nick"],
317
378
"My happy branch")
319
def test_create_colocated(self):
321
repo = self.make_repository('.', shared=True)
322
except errors.IncompatibleFormat:
324
if repo.bzrdir._format.colocated_branches:
325
raise tests.TestNotApplicable(
326
"control dir does not support colocated branches")
327
self.assertEqual(0, len(repo.bzrdir.list_branches()))
328
if not self.bzrdir_format.colocated_branches:
329
raise tests.TestNotApplicable("control dir format does not support "
330
"colocated branches")
332
child_branch1 = self.branch_format.initialize(repo.bzrdir,
334
except errors.UninitializableFormat:
335
# branch references are not default init'able and
336
# not all bzrdirs support colocated branches.
338
self.assertEqual(1, len(repo.bzrdir.list_branches()))
339
self.branch_format.initialize(repo.bzrdir, name='branch2')
340
self.assertEqual(2, len(repo.bzrdir.list_branches()))
342
def test_create_append_revisions_only(self):
344
repo = self.make_repository('.', shared=True)
345
except errors.IncompatibleFormat:
347
for val in (True, False):
349
branch = self.branch_format.initialize(repo.bzrdir,
350
append_revisions_only=True)
351
except (errors.UninitializableFormat, errors.UpgradeRequired):
352
# branch references are not default init'able and
353
# not all branches support append_revisions_only
355
self.assertEqual(True, branch.get_append_revisions_only())
356
repo.bzrdir.destroy_branch()
358
def test_get_set_append_revisions_only(self):
359
branch = self.make_branch('.')
360
if branch._format.supports_set_append_revisions_only():
361
branch.set_append_revisions_only(True)
362
self.assertTrue(branch.get_append_revisions_only())
363
branch.set_append_revisions_only(False)
364
self.assertFalse(branch.get_append_revisions_only())
366
self.assertRaises(errors.UpgradeRequired,
367
branch.set_append_revisions_only, True)
368
self.assertFalse(branch.get_append_revisions_only())
370
380
def test_create_open_branch_uses_repository(self):
372
382
repo = self.make_repository('.', shared=True)
373
383
except errors.IncompatibleFormat:
374
raise tests.TestNotApplicable("requires shared repository support")
375
385
child_transport = repo.bzrdir.root_transport.clone('child')
376
386
child_transport.mkdir('.')
378
child_dir = self.bzrdir_format.initialize_on_transport(child_transport)
379
except errors.UninitializableFormat:
380
raise tests.TestNotApplicable("control dir format not initializable")
387
child_dir = self.bzrdir_format.initialize_on_transport(child_transport)
382
389
child_branch = self.branch_format.initialize(child_dir)
383
390
except errors.UninitializableFormat:
467
463
tree_a = self.make_branch_and_tree('a')
468
464
rev_id = tree_a.commit('put some content in the branch')
469
465
# open the branch via a readonly transport
470
url = self.get_readonly_url(
471
osutils.basename(tree_a.branch.base.rstrip('/')))
472
t = transport.get_transport_from_url(url)
473
if not tree_a.branch.bzrdir._format.supports_transport(t):
474
raise tests.TestNotApplicable("format does not support transport")
475
source_branch = _mod_branch.Branch.open(url)
466
source_branch = bzrlib.branch.Branch.open(self.get_readonly_url('a'))
476
467
# sanity check that the test will be valid
477
468
self.assertRaises((errors.LockError, errors.TransportNotPossible),
478
469
source_branch.lock_write)
479
470
checkout = source_branch.create_checkout('c')
480
471
self.assertEqual(rev_id, checkout.last_revision())
482
def test_heads_to_fetch(self):
483
# heads_to_fetch is a method that returns a collection of revids that
484
# need to be fetched to copy this branch into another repo. At a
485
# minimum this will include the tip.
486
# (In native formats, this is the tip + tags, but other formats may
487
# have other revs needed)
488
tree = self.make_branch_and_tree('a')
489
tree.commit('first commit', rev_id='rev1')
490
tree.commit('second commit', rev_id='rev2')
491
must_fetch, should_fetch = tree.branch.heads_to_fetch()
492
self.assertTrue('rev2' in must_fetch)
494
def test_heads_to_fetch_not_null_revision(self):
495
# NULL_REVISION does not appear in the result of heads_to_fetch, even
496
# for an empty branch.
497
tree = self.make_branch_and_tree('a')
498
must_fetch, should_fetch = tree.branch.heads_to_fetch()
499
self.assertFalse(revision.NULL_REVISION in must_fetch)
500
self.assertFalse(revision.NULL_REVISION in should_fetch)
503
class TestBranchFormat(per_branch.TestCaseWithBranch):
505
def test_branch_format_network_name(self):
506
br = self.make_branch('.')
508
network_name = format.network_name()
509
self.assertIsInstance(network_name, str)
510
# We want to test that the network_name matches the actual format on
511
# disk. For local branches that means that using network_name as a key
512
# in the registry gives back the same format. For remote branches we
513
# check that the network_name of the RemoteBranchFormat we have locally
514
# matches the actual format present on disk.
515
if isinstance(format, remote.RemoteBranchFormat):
517
real_branch = br._real_branch
518
self.assertEqual(real_branch._format.network_name(), network_name)
520
registry = _mod_branch.network_format_registry
521
looked_up_format = registry.get(network_name)
522
self.assertEqual(format.__class__, looked_up_format.__class__)
524
def test_get_config_calls(self):
525
# Smoke test that all branch succeed getting a config
526
br = self.make_branch('.')
528
br.get_config_stack()
531
class ChrootedTests(per_branch.TestCaseWithBranch):
473
def test_set_revision_history(self):
474
tree = self.make_branch_and_tree('a')
475
tree.commit('a commit', rev_id='rev1')
477
br.set_revision_history(["rev1"])
478
self.assertEquals(br.revision_history(), ["rev1"])
479
br.set_revision_history([])
480
self.assertEquals(br.revision_history(), [])
483
class ChrootedTests(TestCaseWithBranch):
532
484
"""A support class that provides readonly urls outside the local namespace.
534
486
This is done by checking if self.transport_server is a MemoryServer. if it
827
717
tree3.merge_from_branch(tree2.branch)
828
718
tree3.commit('empty commit 6')
829
719
tree2.pull(tree3.branch)
832
class TestIgnoreFallbacksParameter(per_branch.TestCaseWithBranch):
834
def make_branch_with_fallback(self):
835
fallback = self.make_branch('fallback')
836
if not fallback._format.supports_stacking():
837
raise tests.TestNotApplicable("format does not support stacking")
838
stacked = self.make_branch('stacked')
839
stacked.set_stacked_on_url(fallback.base)
842
def test_fallbacks_not_opened(self):
843
stacked = self.make_branch_with_fallback()
844
self.get_transport('').rename('fallback', 'moved')
845
reopened_dir = controldir.ControlDir.open(stacked.base)
846
reopened = reopened_dir.open_branch(ignore_fallbacks=True)
847
self.assertEqual([], reopened.repository._fallback_repositories)
849
def test_fallbacks_are_opened(self):
850
stacked = self.make_branch_with_fallback()
851
reopened_dir = controldir.ControlDir.open(stacked.base)
852
reopened = reopened_dir.open_branch(ignore_fallbacks=False)
853
self.assertLength(1, reopened.repository._fallback_repositories)
856
class TestReferenceLocation(per_branch.TestCaseWithBranch):
858
def test_reference_parent(self):
859
tree = self.make_branch_and_tree('tree')
860
subtree = self.make_branch_and_tree('tree/subtree')
861
subtree.set_root_id('subtree-id')
863
tree.add_reference(subtree)
864
except errors.UnsupportedOperation:
865
raise tests.TestNotApplicable('Tree cannot hold references.')
866
reference_parent = tree.branch.reference_parent(
868
urlutils.relative_url(tree.branch.user_url, subtree.branch.user_url))
869
self.assertEqual(subtree.branch.base, reference_parent.base)
871
def test_reference_parent_accepts_possible_transports(self):
872
tree = self.make_branch_and_tree('tree')
873
subtree = self.make_branch_and_tree('tree/subtree')
874
subtree.set_root_id('subtree-id')
876
tree.add_reference(subtree)
877
except errors.UnsupportedOperation:
878
raise tests.TestNotApplicable('Tree cannot hold references.')
879
reference_parent = tree.branch.reference_parent('subtree-id',
880
urlutils.relative_url(
881
tree.branch.user_url, subtree.branch.user_url),
882
possible_transports=[subtree.bzrdir.root_transport])
884
def test_get_reference_info(self):
885
branch = self.make_branch('branch')
887
path, loc = branch.get_reference_info('file-id')
888
except errors.UnsupportedOperation:
889
raise tests.TestNotApplicable('Branch cannot hold references.')
890
self.assertIs(None, path)
891
self.assertIs(None, loc)
893
def test_set_reference_info(self):
894
branch = self.make_branch('branch')
896
branch.set_reference_info('file-id', 'path/to/location',
898
except errors.UnsupportedOperation:
899
raise tests.TestNotApplicable('Branch cannot hold references.')
901
def test_set_get_reference_info(self):
902
branch = self.make_branch('branch')
904
branch.set_reference_info('file-id', 'path/to/file',
906
except errors.UnsupportedOperation:
907
raise tests.TestNotApplicable('Branch cannot hold references.')
908
# Create a new instance to ensure storage is permanent
909
branch = _mod_branch.Branch.open('branch')
910
tree_path, branch_location = branch.get_reference_info('file-id')
911
self.assertEqual('path/to/location', branch_location)
913
def test_set_null_reference_info(self):
914
branch = self.make_branch('branch')
916
branch.set_reference_info('file-id', 'path/to/file',
918
except errors.UnsupportedOperation:
919
raise tests.TestNotApplicable('Branch cannot hold references.')
920
branch.set_reference_info('file-id', None, None)
921
tree_path, branch_location = branch.get_reference_info('file-id')
922
self.assertIs(None, tree_path)
923
self.assertIs(None, branch_location)
925
def test_set_null_reference_info_when_null(self):
926
branch = self.make_branch('branch')
928
tree_path, branch_location = branch.get_reference_info('file-id')
929
except errors.UnsupportedOperation:
930
raise tests.TestNotApplicable('Branch cannot hold references.')
931
self.assertIs(None, tree_path)
932
self.assertIs(None, branch_location)
933
branch.set_reference_info('file-id', None, None)
935
def test_set_null_requires_two_nones(self):
936
branch = self.make_branch('branch')
938
e = self.assertRaises(ValueError, branch.set_reference_info,
939
'file-id', 'path', None)
940
except errors.UnsupportedOperation:
941
raise tests.TestNotApplicable('Branch cannot hold references.')
942
self.assertEqual('tree_path must be None when branch_location is'
944
e = self.assertRaises(ValueError, branch.set_reference_info,
945
'file-id', None, 'location')
946
self.assertEqual('branch_location must be None when tree_path is'
949
def make_branch_with_reference(self, location, reference_location,
951
branch = self.make_branch(location)
953
branch.set_reference_info(file_id, 'path/to/file',
955
except errors.UnsupportedOperation:
956
raise tests.TestNotApplicable('Branch cannot hold references.')
959
def test_reference_parent_from_reference_info_(self):
960
referenced_branch = self.make_branch('reference_branch')
961
branch = self.make_branch_with_reference('branch',
962
referenced_branch.base)
963
parent = branch.reference_parent('file-id', 'path/to/file')
964
self.assertEqual(parent.base, referenced_branch.base)
966
def test_branch_relative_reference_location(self):
967
branch = self.make_branch('branch')
969
branch.set_reference_info('file-id', 'path/to/file',
970
'../reference_branch')
971
except errors.UnsupportedOperation:
972
raise tests.TestNotApplicable('Branch cannot hold references.')
973
referenced_branch = self.make_branch('reference_branch')
974
parent = branch.reference_parent('file-id', 'path/to/file')
975
self.assertEqual(parent.base, referenced_branch.base)
977
def test_sprout_copies_reference_location(self):
978
branch = self.make_branch_with_reference('branch', '../reference')
979
new_branch = branch.bzrdir.sprout('new-branch').open_branch()
980
self.assertEqual('../reference',
981
new_branch.get_reference_info('file-id')[1])
983
def test_clone_copies_reference_location(self):
984
branch = self.make_branch_with_reference('branch', '../reference')
985
new_branch = branch.bzrdir.clone('new-branch').open_branch()
986
self.assertEqual('../reference',
987
new_branch.get_reference_info('file-id')[1])
989
def test_copied_locations_are_rebased(self):
990
branch = self.make_branch_with_reference('branch', 'reference')
991
new_branch = branch.bzrdir.sprout('branch/new-branch').open_branch()
992
self.assertEqual('../reference',
993
new_branch.get_reference_info('file-id')[1])
995
def test_update_references_retains_old_references(self):
996
branch = self.make_branch_with_reference('branch', 'reference')
997
new_branch = self.make_branch_with_reference(
998
'new_branch', 'reference', 'file-id2')
999
new_branch.update_references(branch)
1000
self.assertEqual('reference',
1001
branch.get_reference_info('file-id')[1])
1003
def test_update_references_retains_known_references(self):
1004
branch = self.make_branch_with_reference('branch', 'reference')
1005
new_branch = self.make_branch_with_reference(
1006
'new_branch', 'reference2')
1007
new_branch.update_references(branch)
1008
self.assertEqual('reference',
1009
branch.get_reference_info('file-id')[1])
1011
def test_update_references_skips_known_references(self):
1012
branch = self.make_branch_with_reference('branch', 'reference')
1013
new_branch = branch.bzrdir.sprout('branch/new-branch').open_branch()
1014
new_branch.set_reference_info('file-id', '../foo', '../foo')
1015
new_branch.update_references(branch)
1016
self.assertEqual('reference',
1017
branch.get_reference_info('file-id')[1])
1019
def test_pull_updates_references(self):
1020
branch = self.make_branch_with_reference('branch', 'reference')
1021
new_branch = branch.bzrdir.sprout('branch/new-branch').open_branch()
1022
new_branch.set_reference_info('file-id2', '../foo', '../foo')
1023
branch.pull(new_branch)
1024
self.assertEqual('foo',
1025
branch.get_reference_info('file-id2')[1])
1027
def test_push_updates_references(self):
1028
branch = self.make_branch_with_reference('branch', 'reference')
1029
new_branch = branch.bzrdir.sprout('branch/new-branch').open_branch()
1030
new_branch.set_reference_info('file-id2', '../foo', '../foo')
1031
new_branch.push(branch)
1032
self.assertEqual('foo',
1033
branch.get_reference_info('file-id2')[1])
1035
def test_merge_updates_references(self):
1036
branch = self.make_branch_with_reference('branch', 'reference')
1037
tree = self.make_branch_and_tree('tree')
1039
branch.pull(tree.branch)
1040
checkout = branch.create_checkout('checkout', lightweight=True)
1041
checkout.commit('bar')
1043
self.addCleanup(tree.unlock)
1044
merger = merge.Merger.from_revision_ids(None, tree,
1045
branch.last_revision(),
1046
other_branch=branch)
1047
merger.merge_type = merge.Merge3Merger
1049
self.assertEqual('../branch/reference',
1050
tree.branch.get_reference_info('file-id')[1])
1053
class TestBranchControlComponent(per_branch.TestCaseWithBranch):
1054
"""Branch implementations adequately implement ControlComponent."""
1056
def test_urls(self):
1057
br = self.make_branch('branch')
1058
self.assertIsInstance(br.user_url, str)
1059
self.assertEqual(br.user_url, br.user_transport.base)
1060
# for all current bzrdir implementations the user dir must be
1061
# above the control dir but we might need to relax that?
1062
self.assertEqual(br.control_url.find(br.user_url), 0)
1063
self.assertEqual(br.control_url, br.control_transport.base)
1066
class FakeShelfCreator(object):
1068
def __init__(self, branch):
1069
self.branch = branch
1071
def write_shelf(self, shelf_file, message=None):
1072
tree = self.branch.repository.revision_tree(revision.NULL_REVISION)
1073
with transform.TransformPreview(tree) as tt:
1074
shelf.ShelfCreator._write_shelf(
1075
shelf_file, tt, revision.NULL_REVISION)
1078
@contextlib.contextmanager
1079
def skip_if_storing_uncommitted_unsupported():
1082
except errors.StoringUncommittedNotSupported:
1083
raise tests.TestNotApplicable('Cannot store uncommitted changes.')
1086
class TestUncommittedChanges(per_branch.TestCaseWithBranch):
1088
def bind(self, branch, master):
1091
except errors.UpgradeRequired:
1092
raise tests.TestNotApplicable('Branch cannot be bound.')
1094
def test_store_uncommitted(self):
1095
tree = self.make_branch_and_tree('b')
1096
branch = tree.branch
1097
creator = FakeShelfCreator(branch)
1098
with skip_if_storing_uncommitted_unsupported():
1099
self.assertIs(None, branch.get_unshelver(tree))
1100
branch.store_uncommitted(creator)
1101
self.assertIsNot(None, branch.get_unshelver(tree))
1103
def test_store_uncommitted_bound(self):
1104
tree = self.make_branch_and_tree('b')
1105
branch = tree.branch
1106
master = self.make_branch('master')
1107
self.bind(branch, master)
1108
creator = FakeShelfCreator(tree.branch)
1109
self.assertIs(None, tree.branch.get_unshelver(tree))
1110
self.assertIs(None, master.get_unshelver(tree))
1111
tree.branch.store_uncommitted(creator)
1112
self.assertIsNot(None, master.get_unshelver(tree))
1114
def test_store_uncommitted_already_stored(self):
1115
branch = self.make_branch('b')
1116
with skip_if_storing_uncommitted_unsupported():
1117
branch.store_uncommitted(FakeShelfCreator(branch))
1118
self.assertRaises(errors.ChangesAlreadyStored,
1119
branch.store_uncommitted, FakeShelfCreator(branch))
1121
def test_store_uncommitted_none(self):
1122
branch = self.make_branch('b')
1123
with skip_if_storing_uncommitted_unsupported():
1124
branch.store_uncommitted(FakeShelfCreator(branch))
1125
branch.store_uncommitted(None)
1126
self.assertIs(None, branch.get_unshelver(None))
1128
def test_get_unshelver(self):
1129
tree = self.make_branch_and_tree('tree')
1131
self.build_tree_contents([('tree/file', 'contents1')])
1133
with skip_if_storing_uncommitted_unsupported():
1134
tree.store_uncommitted()
1135
unshelver = tree.branch.get_unshelver(tree)
1136
self.assertIsNot(None, unshelver)
1138
def test_get_unshelver_bound(self):
1139
tree = self.make_branch_and_tree('tree')
1141
self.build_tree_contents([('tree/file', 'contents1')])
1143
with skip_if_storing_uncommitted_unsupported():
1144
tree.store_uncommitted()
1145
branch = self.make_branch('branch')
1146
self.bind(branch, tree.branch)
1147
unshelver = branch.get_unshelver(tree)
1148
self.assertIsNot(None, unshelver)