97
97
target_stat = os.stat('target/file1')
98
98
self.assertEqual(source_stat, target_stat)
100
def check_shallow_branch(self, branch_revid, stacked_on):
101
"""Assert that the branch 'newbranch' has been published correctly.
103
:param stacked_on: url of a branch this one is stacked upon.
104
:param branch_revid: a revision id that should be the only
105
revision present in the stacked branch, and it should not be in
106
the reference branch.
108
new_branch = branch.Branch.open('newbranch')
109
# The branch refers to the mainline
110
self.assertEqual(stacked_on, new_branch.get_stacked_on())
111
# and the branch's work was pushed
112
self.assertTrue(new_branch.repository.has_revision(branch_revid))
113
# The newly committed revision shoud be present in the stacked branch,
114
# but not in the stacked-on branch. Because stacking is set up by the
115
# branch object, if we open the stacked branch's repository directly,
116
# bypassing the branch, we see only what's in the stacked repository.
117
stacked_repo = bzrdir.BzrDir.open('newbranch').open_repository()
118
stacked_repo_revisions = set(stacked_repo.all_revision_ids())
119
if len(stacked_repo_revisions) != 1:
120
self.fail("wrong revisions in stacked repository: %r"
121
% (stacked_repo_revisions,))
123
def assertRevisionInRepository(self, repo_path, revid):
124
"""Check that a revision is in a repository, disregarding stacking."""
125
repo = bzrdir.BzrDir.open(repo_path).open_repository()
126
self.assertTrue(repo.has_revision(revid))
128
def assertRevisionNotInRepository(self, repo_path, revid):
129
"""Check that a revision is not in a repository, disregarding stacking."""
130
repo = bzrdir.BzrDir.open(repo_path).open_repository()
131
self.assertFalse(repo.has_revision(revid))
133
def test_branch_stacked_branch_also_stacked_same_reference(self):
135
trunk_tree = self.make_branch_and_tree('target',
136
format='development')
137
trunk_tree.commit('mainline')
138
# and a branch from it which is stacked
139
branch_tree = self.make_branch_and_tree('branch',
140
format='development')
141
branch_tree.branch.set_stacked_on(trunk_tree.branch.base)
142
# with some work on it
143
branch_tree.commit('moar work plz')
144
# branching our local branch gives us a new stacked branch pointing at
146
out, err = self.run_bzr(['branch', 'branch', 'newbranch'])
147
self.assertEqual('', out)
148
self.assertEqual('Created new stacked branch referring to %s.\n' %
149
trunk_tree.branch.base, err)
150
self.check_shallow_branch(branch_tree.last_revision(),
151
trunk_tree.branch.base)
153
def test_branch_stacked(self):
155
trunk_tree = self.make_branch_and_tree('mainline',
156
format='development')
157
original_revid = trunk_tree.commit('mainline')
158
self.assertRevisionInRepository('mainline', original_revid)
159
# and a branch from it which is stacked
160
out, err = self.run_bzr(['branch', '--stacked', 'mainline',
162
self.assertEqual('', out)
163
self.assertEqual('Created new stacked branch referring to %s.\n' %
164
trunk_tree.branch.base, err)
165
self.assertRevisionNotInRepository('newbranch', original_revid)
166
new_tree = WorkingTree.open('newbranch')
167
new_revid = new_tree.commit('new work')
168
self.check_shallow_branch(new_revid, trunk_tree.branch.base)
170
def test_branch_stacked_from_smart_server(self):
171
# We can branch stacking on a smart server
172
from bzrlib.smart.server import SmartTCPServer_for_testing
173
self.transport_server = SmartTCPServer_for_testing
174
trunk = self.make_branch('mainline', format='development')
175
out, err = self.run_bzr(
176
['branch', '--stacked', self.get_url('mainline'), 'shallow'])
101
179
class TestRemoteBranch(TestCaseWithSFTPServer):