~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_pull.py

  • Committer: Jelmer Vernooij
  • Date: 2010-12-20 11:57:14 UTC
  • mto: This revision was merged to the branch mainline in revision 5577.
  • Revision ID: jelmer@samba.org-20101220115714-2ru3hfappjweeg7q
Don't use no-plugins.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
 
18
18
"""Black-box tests for bzr pull."""
20
20
import os
21
21
import sys
22
22
 
 
23
from bzrlib import (
 
24
    debug,
 
25
    remote,
 
26
    urlutils,
 
27
    )
 
28
 
23
29
from bzrlib.branch import Branch
 
30
from bzrlib.directory_service import directories
24
31
from bzrlib.osutils import pathjoin
25
 
from bzrlib.tests.blackbox import ExternalBase
 
32
from bzrlib.tests import TestCaseWithTransport
26
33
from bzrlib.uncommit import uncommit
27
34
from bzrlib.workingtree import WorkingTree
28
 
from bzrlib import urlutils
29
 
 
30
 
 
31
 
class TestPull(ExternalBase):
 
35
 
 
36
 
 
37
class TestPull(TestCaseWithTransport):
32
38
 
33
39
    def example_branch(self, path='.'):
34
40
        tree = self.make_branch_and_tree(path)
238
244
        out = self.run_bzr('pull ../branch_a', retcode=3)
239
245
        self.assertEqual(out,
240
246
                ('','bzr: ERROR: These branches have diverged.'
241
 
                    ' Use the merge command to reconcile them.\n'))
 
247
                    ' Use the missing command to see how.\n'
 
248
                    'Use the merge command to reconcile them.\n'))
242
249
        self.assertEqual(branch_b.get_parent(), parent)
243
250
        # test implicit --remember after resolving previous failure
244
251
        uncommit(branch=branch_b, tree=tree_b)
305
312
        self.assertContainsRe(out, 'bar')
306
313
        self.assertNotContainsRe(out, 'added:')
307
314
        self.assertNotContainsRe(out, 'foo')
 
315
 
 
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'])
 
320
        tree_a.add('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'])
 
328
        tree_a.add('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)
 
334
 
 
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"""
 
342
 
 
343
            def look_up(self, name, url):
 
344
                return 'source'
 
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())
 
349
 
 
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')
 
357
 
 
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')
 
367
 
 
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
 
371
        repository.
 
372
 
 
373
        See <https://launchpad.net/bugs/380314>
 
374
        """
 
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')],
 
389
            working_dir='empty')
 
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')
 
398
    
 
399
    def test_pull_cross_format_warning(self):
 
400
        """You get a warning for probably slow cross-format pulls.
 
401
        """
 
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")
 
409
 
 
410
    def test_pull_cross_format_warning_no_IDS(self):
 
411
        """You get a warning for probably slow cross-format pulls.
 
412
        """
 
413
        # this simulates what would happen across the network, where
 
414
        # interdifferingserializer is not active
 
415
 
 
416
        debug.debug_flags.add('IDS_never')
 
417
        # TestCase take care of restoring them
 
418
 
 
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")
 
425
 
 
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")
 
436
 
 
437
    def test_pull_to_experimental_format_warning(self):
 
438
        """You get a warning for pulling into experimental formats.
 
439
        """
 
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")
 
446
 
 
447
    def test_pull_cross_to_experimental_format_warning(self):
 
448
        """You get a warning for pulling into experimental formats.
 
449
        """
 
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")
 
456
 
 
457
    def test_pull_show_base(self):
 
458
        """bzr pull supports --show-base
 
459
 
 
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()
 
465
 
 
466
        f = open(pathjoin('a', 'hello'),'wt')
 
467
        f.write('fee')
 
468
        f.close()
 
469
        a_tree.commit('fee')
 
470
 
 
471
        f = open(pathjoin('b', 'hello'),'wt')
 
472
        f.write('fie')
 
473
        f.close()
 
474
 
 
475
        out,err=self.run_bzr(['pull','-d','b','a','--show-base'])
 
476
 
 
477
        # check for message here
 
478
        self.assertEqual(err,
 
479
                         ' M  hello\nText conflict in hello\n1 conflicts encountered.\n')
 
480
 
 
481
        self.assertEqualDiff('<<<<<<< TREE\n'
 
482
                             'fie||||||| BASE-REVISION\n'
 
483
                             'foo=======\n'
 
484
                             'fee>>>>>>> MERGE-SOURCE\n',
 
485
                             open(pathjoin('b', 'hello')).read())
 
486
 
 
487
    def test_pull_show_base_working_tree_only(self):
 
488
        """--show-base only allowed if there's a working tree
 
489
 
 
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'))
 
497
 
 
498