177
181
source.branch.push(target, stop_revision='rev-2', overwrite=True)
178
182
self.assertEqual('rev-2', target.last_revision())
184
def test_push_with_default_stacking_does_not_create_broken_branch(self):
185
"""Pushing a new standalone branch works even when there's a default
186
stacking policy at the destination.
188
The new branch will preserve the repo format (even if it isn't the
189
default for the branch), and will be stacked when the repo format
190
allows (which means that the branch format isn't necessarly preserved).
192
if isinstance(self.branch_format, branch.BzrBranchFormat4):
193
raise tests.TestNotApplicable('Not a metadir format.')
194
if isinstance(self.branch_format, branch.BranchReferenceFormat):
195
# This test could in principle apply to BranchReferenceFormat, but
196
# make_branch_builder doesn't support it.
197
raise tests.TestSkipped(
198
"BranchBuilder can't make reference branches.")
199
# Make a branch called "local" in a stackable repository
200
# The branch has 3 revisions:
201
# - rev-1, adds a file
202
# - rev-2, no changes
203
# - rev-3, modifies the file.
204
repo = self.make_repository('repo', shared=True, format='1.6')
205
builder = self.make_branch_builder('repo/local')
206
builder.start_series()
207
builder.build_snapshot('rev-1', None, [
208
('add', ('', 'root-id', 'directory', '')),
209
('add', ('filename', 'f-id', 'file', 'content\n'))])
210
builder.build_snapshot('rev-2', ['rev-1'], [])
211
builder.build_snapshot('rev-3', ['rev-2'],
212
[('modify', ('f-id', 'new-content\n'))])
213
builder.finish_series()
214
trunk = builder.get_branch()
215
# Sprout rev-1 to "trunk", so that we can stack on it.
216
trunk.bzrdir.sprout(self.get_url('trunk'), revision_id='rev-1')
217
# Set a default stacking policy so that new branches will automatically
219
self.make_bzrdir('.').get_config().set_default_stack_on('trunk')
220
# Push rev-2 to a new branch "remote". It will be stacked on "trunk".
222
push._show_push_branch(trunk, 'rev-2', self.get_url('remote'), output)
223
# Push rev-3 onto "remote". If "remote" not stacked and is missing the
224
# fulltext record for f-id @ rev-1, then this will fail.
225
remote_branch = Branch.open(self.get_url('remote'))
226
trunk.push(remote_branch)
227
remote_branch.check()
229
def test_no_get_parent_map_after_insert_stream(self):
230
# Effort test for bug 331823
231
self.setup_smart_server_with_call_log()
232
# Make a local branch with four revisions. Four revisions because:
233
# one to push, one there for _walk_to_common_revisions to find, one we
234
# don't want to access, one for luck :)
235
if isinstance(self.branch_format, branch.BranchReferenceFormat):
236
# This test could in principle apply to BranchReferenceFormat, but
237
# make_branch_builder doesn't support it.
238
raise tests.TestSkipped(
239
"BranchBuilder can't make reference branches.")
241
builder = self.make_branch_builder('local')
242
except (errors.TransportNotPossible, errors.UninitializableFormat):
243
raise tests.TestNotApplicable('format not directly constructable')
244
builder.start_series()
245
builder.build_snapshot('first', None, [
246
('add', ('', 'root-id', 'directory', ''))])
247
builder.build_snapshot('second', ['first'], [])
248
builder.build_snapshot('third', ['second'], [])
249
builder.build_snapshot('fourth', ['third'], [])
250
builder.finish_series()
251
local = builder.get_branch()
252
local = branch.Branch.open(self.get_vfs_only_url('local'))
253
# Initial push of three revisions
254
remote_bzrdir = local.bzrdir.sprout(
255
self.get_url('remote'), revision_id='third')
256
remote = remote_bzrdir.open_branch()
257
# Push fourth revision
258
self.reset_smart_call_log()
259
self.disableOptimisticGetParentMap()
260
self.assertFalse(local.is_locked())
262
hpss_call_names = [item.call.method for item in self.hpss_calls]
263
self.assertTrue('Repository.insert_stream' in hpss_call_names)
264
insert_stream_idx = hpss_call_names.index('Repository.insert_stream')
265
calls_after_insert_stream = hpss_call_names[insert_stream_idx:]
266
# After inserting the stream the client has no reason to query the
267
# remote graph any further.
269
['Repository.insert_stream', 'Repository.insert_stream', 'get',
270
'Branch.set_last_revision_info', 'Branch.unlock'],
271
calls_after_insert_stream)
273
def disableOptimisticGetParentMap(self):
274
# Tweak some class variables to stop remote get_parent_map calls asking
275
# for or receiving more data than the caller asked for.
276
old_flag = SmartServerRepositoryGetParentMap.no_extra_results
277
inter_classes = [repository.InterOtherToRemote,
278
repository.InterPackToRemotePack]
280
for inter_class in inter_classes:
281
old_batch_sizes.append(
282
inter_class._walk_to_common_revisions_batch_size)
283
inter_class._walk_to_common_revisions_batch_size = 1
284
SmartServerRepositoryGetParentMap.no_extra_results = True
286
SmartServerRepositoryGetParentMap.no_extra_results = old_flag
287
for inter_class, size in zip(inter_classes, old_batch_sizes):
288
inter_class._walk_to_common_revisions_batch_size = size
289
self.addCleanup(reset_values)
181
292
class TestPushHook(TestCaseWithBranch):