24
24
from bzrlib.revision import NULL_REVISION
25
25
from bzrlib.smart import server
26
26
from bzrlib.tests import TestNotApplicable, KnownFailure, transport_util
27
from bzrlib.tests.branch_implementations import TestCaseWithBranch
27
from bzrlib.tests.per_branch import TestCaseWithBranch
28
28
from bzrlib.transport import get_transport
79
79
self.assertEqual('../target', branch.get_stacked_on_url())
81
def test_set_stacked_on_same_branch_raises(self):
82
# Stacking on the same branch silently raises and doesn't execute the
83
# change. Reported in bug 376243.
84
branch = self.make_branch('branch')
86
self.assertRaises(errors.UnstackableLocationError,
87
branch.set_stacked_on_url, '../branch')
88
except unstackable_format_errors:
89
# if the set failed, so must the get
90
self.assertRaises(unstackable_format_errors, branch.get_stacked_on_url)
92
self.assertRaises(errors.NotStacked, branch.get_stacked_on_url)
94
def test_set_stacked_on_same_branch_after_being_stacked_raises(self):
95
# Stacking on the same branch silently raises and doesn't execute the
97
branch = self.make_branch('branch')
98
target = self.make_branch('target')
100
branch.set_stacked_on_url('../target')
101
except unstackable_format_errors:
102
# if the set failed, so must the get
103
self.assertRaises(unstackable_format_errors, branch.get_stacked_on_url)
105
self.assertRaises(errors.UnstackableLocationError,
106
branch.set_stacked_on_url, '../branch')
107
self.assertEqual('../target', branch.get_stacked_on_url())
81
109
def assertRevisionInRepository(self, repo_path, revid):
82
110
"""Check that a revision is in a repository, disregarding stacking."""
83
111
repo = bzrdir.BzrDir.open(repo_path).open_repository()
156
184
trunk_revid = trunk_tree.commit('revision on mainline')
157
185
# and make branch from it which is stacked
159
new_dir = trunk_tree.bzrdir.sprout('newbranch', stacked=True)
187
new_dir = trunk_tree.bzrdir.sprout(self.get_url('newbranch'),
160
189
except unstackable_format_errors, e:
161
190
raise TestNotApplicable(e)
162
191
# stacked repository
163
192
self.assertRevisionNotInRepository('newbranch', trunk_revid)
193
# TODO: we'd like to commit in the stacked repository; that requires
194
# some care (maybe a BranchBuilder) if it's remote and has no
196
##newbranch_revid = new_dir.open_workingtree().commit('revision in '
164
198
# now when we unstack that should implicitly fetch, to make sure that
165
199
# the branch will still work
166
200
new_branch = new_dir.open_branch()
421
455
# Ensure that opening the branch doesn't raise.
422
456
branch.Branch.open(transport.base)
458
def test_revision_history_of_stacked(self):
459
# See <https://launchpad.net/bugs/380314>.
460
stack_on = self.make_branch_and_tree('stack-on')
461
stack_on.commit('first commit', rev_id='rev1')
463
stacked_dir = stack_on.bzrdir.sprout(
464
self.get_url('stacked'), stacked=True)
465
except unstackable_format_errors, e:
466
raise TestNotApplicable('Format does not support stacking.')
468
stacked = stacked_dir.open_workingtree()
469
except errors.NoWorkingTree:
470
stacked = stacked_dir.open_branch().create_checkout(
471
'stacked-checkout', lightweight=True)
472
stacked.commit('second commit', rev_id='rev2')
473
# Sanity check: stacked's repo should not contain rev1, otherwise this
474
# test isn't testing what it's supposed to.
475
repo = stacked.branch.repository.bzrdir.open_repository()
477
self.addCleanup(repo.unlock)
478
self.assertEqual({}, repo.get_parent_map(['rev1']))
479
# revision_history should work, even though the history is spread over
480
# multiple repositories.
481
self.assertLength(2, stacked.branch.revision_history())
425
484
class TestStackingConnections(
426
485
transport_util.TestCaseWithConnectionHookedTransport):