305
312
self.assertContainsRe(out, 'bar')
306
313
self.assertNotContainsRe(out, 'added:')
307
314
self.assertNotContainsRe(out, 'foo')
316
def test_pull_quiet(self):
317
"""Check that bzr pull --quiet does not print anything"""
318
tree_a = self.make_branch_and_tree('tree_a')
319
self.build_tree(['tree_a/foo'])
321
revision_id = tree_a.commit('bar')
322
tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
323
out, err = self.run_bzr('pull --quiet -d tree_b')
324
self.assertEqual(out, '')
325
self.assertEqual(err, '')
326
self.assertEqual(tree_b.last_revision(), revision_id)
327
self.build_tree(['tree_a/moo'])
329
revision_id = tree_a.commit('quack')
330
out, err = self.run_bzr('pull --quiet -d tree_b')
331
self.assertEqual(out, '')
332
self.assertEqual(err, '')
333
self.assertEqual(tree_b.last_revision(), revision_id)
335
def test_pull_from_directory_service(self):
336
source = self.make_branch_and_tree('source')
337
source.commit('commit 1')
338
target = source.bzrdir.sprout('target').open_workingtree()
339
source_last = source.commit('commit 2')
340
class FooService(object):
341
"""A directory service that always returns source"""
343
def look_up(self, name, url):
345
directories.register('foo:', FooService, 'Testing directory service')
346
self.addCleanup(directories.remove, 'foo:')
347
self.run_bzr('pull foo:bar -d target')
348
self.assertEqual(source_last, target.last_revision())
350
def test_pull_verbose_defaults_to_long(self):
351
tree = self.example_branch('source')
352
target = self.make_branch_and_tree('target')
353
out = self.run_bzr('pull -v source -d target')[0]
354
self.assertContainsRe(out,
355
r'revno: 1\ncommitter: .*\nbranch nick: source')
356
self.assertNotContainsRe(out, r'\n {4}1 .*\n {6}setup\n')
358
def test_pull_verbose_uses_default_log(self):
359
tree = self.example_branch('source')
360
target = self.make_branch_and_tree('target')
361
target_config = target.branch.get_config()
362
target_config.set_user_option('log_format', 'short')
363
out = self.run_bzr('pull -v source -d target')[0]
364
self.assertContainsRe(out, r'\n {4}1 .*\n {6}setup\n')
365
self.assertNotContainsRe(
366
out, r'revno: 1\ncommitter: .*\nbranch nick: source')
368
def test_pull_smart_stacked_streaming_acceptance(self):
369
"""'bzr pull -r 123' works on stacked, smart branches, even when the
370
revision specified by the revno is only present in the fallback
373
See <https://launchpad.net/bugs/380314>
375
self.setup_smart_server_with_call_log()
376
# Make a stacked-on branch with two commits so that the
377
# revision-history can't be determined just by looking at the parent
378
# field in the revision in the stacked repo.
379
parent = self.make_branch_and_tree('parent', format='1.9')
380
parent.commit(message='first commit')
381
parent.commit(message='second commit')
382
local = parent.bzrdir.sprout('local').open_workingtree()
383
local.commit(message='local commit')
384
local.branch.create_clone_on_transport(
385
self.get_transport('stacked'), stacked_on=self.get_url('parent'))
386
empty = self.make_branch_and_tree('empty', format='1.9')
387
self.reset_smart_call_log()
388
self.run_bzr(['pull', '-r', '1', self.get_url('stacked')],
390
# This figure represent the amount of work to perform this use case. It
391
# is entirely ok to reduce this number if a test fails due to rpc_count
392
# being too low. If rpc_count increases, more network roundtrips have
393
# become necessary for this use case. Please do not adjust this number
394
# upwards without agreement from bzr's network support maintainers.
395
self.assertLength(18, self.hpss_calls)
396
remote = Branch.open('stacked')
397
self.assertEndsWith(remote.get_stacked_on_url(), '/parent')
399
def test_pull_cross_format_warning(self):
400
"""You get a warning for probably slow cross-format pulls.
402
# this is assumed to be going through InterDifferingSerializer
403
from_tree = self.make_branch_and_tree('from', format='2a')
404
to_tree = self.make_branch_and_tree('to', format='1.14-rich-root')
405
from_tree.commit(message='first commit')
406
out, err = self.run_bzr(['pull', '-d', 'to', 'from'])
407
self.assertContainsRe(err,
408
"(?m)Doing on-the-fly conversion")
410
def test_pull_cross_format_warning_no_IDS(self):
411
"""You get a warning for probably slow cross-format pulls.
413
# this simulates what would happen across the network, where
414
# interdifferingserializer is not active
416
debug.debug_flags.add('IDS_never')
417
# TestCase take care of restoring them
419
from_tree = self.make_branch_and_tree('from', format='2a')
420
to_tree = self.make_branch_and_tree('to', format='1.14-rich-root')
421
from_tree.commit(message='first commit')
422
out, err = self.run_bzr(['pull', '-d', 'to', 'from'])
423
self.assertContainsRe(err,
424
"(?m)Doing on-the-fly conversion")
426
def test_pull_cross_format_from_network(self):
427
self.setup_smart_server_with_call_log()
428
from_tree = self.make_branch_and_tree('from', format='2a')
429
to_tree = self.make_branch_and_tree('to', format='1.14-rich-root')
430
self.assertIsInstance(from_tree.branch, remote.RemoteBranch)
431
from_tree.commit(message='first commit')
432
out, err = self.run_bzr(['pull', '-d', 'to',
433
from_tree.branch.bzrdir.root_transport.base])
434
self.assertContainsRe(err,
435
"(?m)Doing on-the-fly conversion")
437
def test_pull_to_experimental_format_warning(self):
438
"""You get a warning for pulling into experimental formats.
440
from_tree = self.make_branch_and_tree('from', format='development-subtree')
441
to_tree = self.make_branch_and_tree('to', format='development-subtree')
442
from_tree.commit(message='first commit')
443
out, err = self.run_bzr(['pull', '-d', 'to', 'from'])
444
self.assertContainsRe(err,
445
"(?m)Fetching into experimental format")
447
def test_pull_cross_to_experimental_format_warning(self):
448
"""You get a warning for pulling into experimental formats.
450
from_tree = self.make_branch_and_tree('from', format='2a')
451
to_tree = self.make_branch_and_tree('to', format='development-subtree')
452
from_tree.commit(message='first commit')
453
out, err = self.run_bzr(['pull', '-d', 'to', 'from'])
454
self.assertContainsRe(err,
455
"(?m)Fetching into experimental format")
457
def test_pull_show_base(self):
458
"""bzr pull supports --show-base
460
see https://bugs.launchpad.net/bzr/+bug/202374"""
461
# create two trees with conflicts, setup conflict, check that
462
# conflicted file looks correct
463
a_tree = self.example_branch('a')
464
b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
466
f = open(pathjoin('a', 'hello'),'wt')
471
f = open(pathjoin('b', 'hello'),'wt')
475
out,err=self.run_bzr(['pull','-d','b','a','--show-base'])
477
# check for message here
478
self.assertEqual(err,
479
' M hello\nText conflict in hello\n1 conflicts encountered.\n')
481
self.assertEqualDiff('<<<<<<< TREE\n'
482
'fie||||||| BASE-REVISION\n'
484
'fee>>>>>>> MERGE-SOURCE\n',
485
open(pathjoin('b', 'hello')).read())
487
def test_pull_show_base_working_tree_only(self):
488
"""--show-base only allowed if there's a working tree
490
see https://bugs.launchpad.net/bzr/+bug/202374"""
491
# create a branch, see that --show-base fails
492
self.make_branch('from')
493
self.make_branch('to')
494
out=self.run_bzr(['pull','-d','to','from','--show-base'],retcode=3)
495
self.assertEqual(out,
496
('','bzr: ERROR: Need working tree for --show-base.\n'))