97
97
target_stat = os.stat('target/file1')
98
98
self.assertEqual(source_stat, target_stat)
100
class TestBranchStacked(ExternalBase):
101
"""Tests for branch --stacked"""
103
def check_shallow_branch(self, branch_revid, stacked_on):
104
"""Assert that the branch 'newbranch' has been published correctly.
106
:param stacked_on: url of a branch this one is stacked upon.
107
:param branch_revid: a revision id that should be the only
108
revision present in the stacked branch, and it should not be in
109
the reference branch.
111
new_branch = branch.Branch.open('newbranch')
112
# The branch refers to the mainline
113
self.assertEqual(stacked_on, new_branch.get_stacked_on_url())
114
# and the branch's work was pushed
115
self.assertTrue(new_branch.repository.has_revision(branch_revid))
116
# The newly committed revision shoud be present in the stacked branch,
117
# but not in the stacked-on branch. Because stacking is set up by the
118
# branch object, if we open the stacked branch's repository directly,
119
# bypassing the branch, we see only what's in the stacked repository.
120
stacked_repo = bzrdir.BzrDir.open('newbranch').open_repository()
121
stacked_repo_revisions = set(stacked_repo.all_revision_ids())
122
if len(stacked_repo_revisions) != 1:
123
self.fail("wrong revisions in stacked repository: %r"
124
% (stacked_repo_revisions,))
126
def assertRevisionInRepository(self, repo_path, revid):
127
"""Check that a revision is in a repository, disregarding stacking."""
128
repo = bzrdir.BzrDir.open(repo_path).open_repository()
129
self.assertTrue(repo.has_revision(revid))
131
def assertRevisionNotInRepository(self, repo_path, revid):
132
"""Check that a revision is not in a repository, disregarding stacking."""
133
repo = bzrdir.BzrDir.open(repo_path).open_repository()
134
self.assertFalse(repo.has_revision(revid))
136
def assertRevisionsInBranchRepository(self, revid_list, branch_path):
137
repo = branch.Branch.open(branch_path).repository
138
self.assertEqual(set(revid_list),
139
repo.has_revisions(revid_list))
141
def test_branch_stacked_branch_not_stacked(self):
142
"""Branching a stacked branch is not stacked by default"""
144
trunk_tree = self.make_branch_and_tree('target',
145
format='development')
146
trunk_tree.commit('mainline')
147
# and a branch from it which is stacked
148
branch_tree = self.make_branch_and_tree('branch',
149
format='development')
150
branch_tree.branch.set_stacked_on_url(trunk_tree.branch.base)
151
# with some work on it
152
branch_tree.commit('moar work plz')
153
# branching our local branch gives us a new stacked branch pointing at
155
out, err = self.run_bzr(['branch', 'branch', 'newbranch'])
156
self.assertEqual('', out)
157
self.assertEqual('Branched 1 revision(s).\n',
159
# it should have preserved the branch format, and so it should be
160
# capable of supporting stacking, but not actually have a stacked_on
162
self.assertRaises(errors.NotStacked,
163
bzrdir.BzrDir.open('newbranch').open_branch().get_stacked_on_url)
165
def test_branch_stacked_branch_stacked(self):
166
"""Asking to stack on a stacked branch does work"""
168
trunk_tree = self.make_branch_and_tree('target',
169
format='development')
170
trunk_revid = trunk_tree.commit('mainline')
171
# and a branch from it which is stacked
172
branch_tree = self.make_branch_and_tree('branch',
173
format='development')
174
branch_tree.branch.set_stacked_on_url(trunk_tree.branch.base)
175
# with some work on it
176
branch_revid = branch_tree.commit('moar work plz')
177
# you can chain branches on from there
178
out, err = self.run_bzr(['branch', 'branch', '--stacked', 'branch2'])
179
self.assertEqual('', out)
180
self.assertEqual('Created new stacked branch referring to %s.\n' %
181
branch_tree.branch.base, err)
182
self.assertEqual(branch_tree.branch.base,
183
branch.Branch.open('branch2').get_stacked_on_url())
184
branch2_tree = WorkingTree.open('branch2')
185
branch2_revid = branch2_tree.commit('work on second stacked branch')
186
self.assertRevisionInRepository('branch2', branch2_revid)
187
self.assertRevisionsInBranchRepository(
188
[trunk_revid, branch_revid, branch2_revid],
191
def test_branch_stacked(self):
193
trunk_tree = self.make_branch_and_tree('mainline',
194
format='development')
195
original_revid = trunk_tree.commit('mainline')
196
self.assertRevisionInRepository('mainline', original_revid)
197
# and a branch from it which is stacked
198
out, err = self.run_bzr(['branch', '--stacked', 'mainline',
200
self.assertEqual('', out)
201
self.assertEqual('Created new stacked branch referring to %s.\n' %
202
trunk_tree.branch.base, err)
203
self.assertRevisionNotInRepository('newbranch', original_revid)
204
new_tree = WorkingTree.open('newbranch')
205
new_revid = new_tree.commit('new work')
206
self.check_shallow_branch(new_revid, trunk_tree.branch.base)
208
def test_branch_stacked_from_smart_server(self):
209
# We can branch stacking on a smart server
210
from bzrlib.smart.server import SmartTCPServer_for_testing
211
self.transport_server = SmartTCPServer_for_testing
212
trunk = self.make_branch('mainline', format='development')
213
out, err = self.run_bzr(
214
['branch', '--stacked', self.get_url('mainline'), 'shallow'])
216
def test_branch_stacked_from_non_stacked_format(self):
217
"""The origin format doesn't support stacking"""
218
trunk = self.make_branch('trunk', format='pack-0.92')
219
out, err = self.run_bzr(
220
['branch', '--stacked', 'trunk', 'shallow'])
101
223
class TestRemoteBranch(TestCaseWithSFTPServer):