~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_bzrdir.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-11-04 18:51:39 UTC
  • mfrom: (2961.1.1 trunk)
  • Revision ID: pqm@pqm.ubuntu.com-20071104185139-kaio3sneodg2kp71
Authentication ring implementation (read-only)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# Copyright (C) 2005, 2006, 2007 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
5
5
# the Free Software Foundation; either version 2 of the License, or
19
19
For interface contract tests, see tests/bzr_dir_implementations.
20
20
"""
21
21
 
22
 
import os
23
22
import os.path
24
23
from StringIO import StringIO
25
 
import subprocess
26
 
import sys
27
24
 
28
25
from bzrlib import (
29
26
    bzrdir,
30
27
    errors,
31
28
    help_topics,
32
29
    repository,
33
 
    osutils,
34
30
    symbol_versioning,
35
31
    urlutils,
36
 
    win32utils,
37
32
    workingtree,
38
33
    )
39
34
import bzrlib.branch
41
36
                           UnknownFormatError,
42
37
                           UnsupportedFormatError,
43
38
                           )
 
39
from bzrlib.symbol_versioning import (
 
40
    zero_ninetyone,
 
41
    )
44
42
from bzrlib.tests import (
45
43
    TestCase,
46
 
    TestCaseWithMemoryTransport,
47
44
    TestCaseWithTransport,
48
 
    TestSkipped,
49
45
    test_sftp_transport
50
46
    )
51
 
from bzrlib.tests.http_server import HttpServer
52
 
from bzrlib.tests.http_utils import (
 
47
from bzrlib.tests.HttpServer import HttpServer
 
48
from bzrlib.tests.HTTPTestUtil import (
53
49
    TestCaseWithTwoWebservers,
54
50
    HTTPServerRedirecting,
55
51
    )
66
62
        old_format = bzrdir.BzrDirFormat.get_default_format()
67
63
        # default is BzrDirFormat6
68
64
        self.failUnless(isinstance(old_format, bzrdir.BzrDirMetaFormat1))
69
 
        bzrdir.BzrDirFormat._set_default_format(SampleBzrDirFormat())
 
65
        self.applyDeprecated(symbol_versioning.zero_fourteen, 
 
66
                             bzrdir.BzrDirFormat.set_default_format, 
 
67
                             SampleBzrDirFormat())
70
68
        # creating a bzr dir should now create an instrumented dir.
71
69
        try:
72
70
            result = bzrdir.BzrDir.create('memory:///')
73
71
            self.failUnless(isinstance(result, SampleBzrDir))
74
72
        finally:
75
 
            bzrdir.BzrDirFormat._set_default_format(old_format)
 
73
            self.applyDeprecated(symbol_versioning.zero_fourteen,
 
74
                bzrdir.BzrDirFormat.set_default_format, old_format)
76
75
        self.assertEqual(old_format, bzrdir.BzrDirFormat.get_default_format())
77
76
 
78
77
 
167
166
        finally:
168
167
            bzrdir.format_registry.set_default_repository(old_default)
169
168
 
170
 
    def test_aliases(self):
171
 
        a_registry = bzrdir.BzrDirFormatRegistry()
172
 
        a_registry.register('weave', bzrdir.BzrDirFormat6,
173
 
            'Pre-0.8 format.  Slower and does not support checkouts or shared'
174
 
            ' repositories', deprecated=True)
175
 
        a_registry.register('weavealias', bzrdir.BzrDirFormat6,
176
 
            'Pre-0.8 format.  Slower and does not support checkouts or shared'
177
 
            ' repositories', deprecated=True, alias=True)
178
 
        self.assertEqual(frozenset(['weavealias']), a_registry.aliases())
179
 
    
180
169
 
181
170
class SampleBranch(bzrlib.branch.Branch):
182
171
    """A dummy branch for guess what, dummy use."""
278
267
        # now open_downlevel should fail too.
279
268
        self.assertRaises(UnknownFormatError, bzrdir.BzrDir.open_unsupported, url)
280
269
 
 
270
    def test_create_repository_deprecated(self):
 
271
        # new interface is to make the bzrdir, then a repository within that.
 
272
        format = SampleBzrDirFormat()
 
273
        repo = self.applyDeprecated(zero_ninetyone,
 
274
                bzrdir.BzrDir.create_repository,
 
275
                self.get_url(), format=format)
 
276
        self.assertEqual('A repository', repo)
 
277
 
 
278
    def test_create_repository_shared(self):
 
279
        # new interface is to make the bzrdir, then a repository within that.
 
280
        old_format = bzrdir.BzrDirFormat.get_default_format()
 
281
        repo = self.applyDeprecated(zero_ninetyone,
 
282
                bzrdir.BzrDir.create_repository,
 
283
                '.', shared=True)
 
284
        self.assertTrue(repo.is_shared())
 
285
 
 
286
    def test_create_repository_nonshared(self):
 
287
        # new interface is to make the bzrdir, then a repository within that.
 
288
        old_format = bzrdir.BzrDirFormat.get_default_format()
 
289
        repo = self.applyDeprecated(zero_ninetyone,
 
290
                bzrdir.BzrDir.create_repository,
 
291
                '.')
 
292
        self.assertFalse(repo.is_shared())
 
293
 
 
294
    def test_create_repository_under_shared(self):
 
295
        # an explicit create_repository always does so.
 
296
        # we trust the format is right from the 'create_repository test'
 
297
        # new interface is to make the bzrdir, then a repository within that.
 
298
        format = bzrdir.format_registry.make_bzrdir('knit')
 
299
        self.make_repository('.', shared=True, format=format)
 
300
        repo = self.applyDeprecated(zero_ninetyone,
 
301
                bzrdir.BzrDir.create_repository,
 
302
                self.get_url('child'),
 
303
                format=format)
 
304
        self.assertTrue(isinstance(repo, repository.Repository))
 
305
        self.assertTrue(repo.bzrdir.root_transport.base.endswith('child/'))
 
306
 
281
307
    def test_create_branch_and_repo_uses_default(self):
282
308
        format = SampleBzrDirFormat()
283
309
        branch = bzrdir.BzrDir.create_branch_and_repo(self.get_url(),
414
440
        branch.bzrdir.open_workingtree()
415
441
 
416
442
 
417
 
class TestRepositoryAcquisitionPolicy(TestCaseWithTransport):
418
 
 
419
 
    def test_acquire_repository_standalone(self):
420
 
        """The default acquisition policy should create a standalone branch."""
421
 
        my_bzrdir = self.make_bzrdir('.')
422
 
        repo_policy = my_bzrdir.determine_repository_policy()
423
 
        repo = repo_policy.acquire_repository()
424
 
        self.assertEqual(repo.bzrdir.root_transport.base,
425
 
                         my_bzrdir.root_transport.base)
426
 
        self.assertFalse(repo.is_shared())
427
 
 
428
 
 
429
 
    def test_determine_stacking_policy(self):
430
 
        parent_bzrdir = self.make_bzrdir('.')
431
 
        child_bzrdir = self.make_bzrdir('child')
432
 
        parent_bzrdir.get_config().set_default_stack_on('http://example.org')
433
 
        repo_policy = child_bzrdir.determine_repository_policy()
434
 
        self.assertEqual('http://example.org', repo_policy._stack_on)
435
 
 
436
 
    def test_determine_stacking_policy_relative(self):
437
 
        parent_bzrdir = self.make_bzrdir('.')
438
 
        child_bzrdir = self.make_bzrdir('child')
439
 
        parent_bzrdir.get_config().set_default_stack_on('child2')
440
 
        repo_policy = child_bzrdir.determine_repository_policy()
441
 
        self.assertEqual('child2', repo_policy._stack_on)
442
 
        self.assertEqual(parent_bzrdir.root_transport.base,
443
 
                         repo_policy._stack_on_pwd)
444
 
 
445
 
    def prepare_default_stacking(self, child_format='development1'):
446
 
        parent_bzrdir = self.make_bzrdir('.')
447
 
        child_branch = self.make_branch('child', format=child_format)
448
 
        parent_bzrdir.get_config().set_default_stack_on(child_branch.base)
449
 
        new_child_transport = parent_bzrdir.transport.clone('child2')
450
 
        return child_branch, new_child_transport
451
 
 
452
 
    def test_clone_on_transport_obeys_stacking_policy(self):
453
 
        child_branch, new_child_transport = self.prepare_default_stacking()
454
 
        new_child = child_branch.bzrdir.clone_on_transport(new_child_transport)
455
 
        self.assertEqual(child_branch.base,
456
 
                         new_child.open_branch().get_stacked_on_url())
457
 
 
458
 
    def test_sprout_obeys_stacking_policy(self):
459
 
        child_branch, new_child_transport = self.prepare_default_stacking()
460
 
        new_child = child_branch.bzrdir.sprout(new_child_transport.base)
461
 
        self.assertEqual(child_branch.base,
462
 
                         new_child.open_branch().get_stacked_on_url())
463
 
 
464
 
    def test_clone_ignores_policy_for_unsupported_formats(self):
465
 
        child_branch, new_child_transport = self.prepare_default_stacking(
466
 
            child_format='pack-0.92')
467
 
        new_child = child_branch.bzrdir.clone_on_transport(new_child_transport)
468
 
        self.assertRaises(errors.UnstackableBranchFormat,
469
 
                          new_child.open_branch().get_stacked_on_url)
470
 
 
471
 
    def test_sprout_ignores_policy_for_unsupported_formats(self):
472
 
        child_branch, new_child_transport = self.prepare_default_stacking(
473
 
            child_format='pack-0.92')
474
 
        new_child = child_branch.bzrdir.sprout(new_child_transport.base)
475
 
        self.assertRaises(errors.UnstackableBranchFormat,
476
 
                          new_child.open_branch().get_stacked_on_url)
477
 
 
478
 
    def test_sprout_upgrades_format_if_stacked_specified(self):
479
 
        child_branch, new_child_transport = self.prepare_default_stacking(
480
 
            child_format='pack-0.92')
481
 
        new_child = child_branch.bzrdir.sprout(new_child_transport.base,
482
 
                                               stacked=True)
483
 
        self.assertEqual(child_branch.bzrdir.root_transport.base,
484
 
                         new_child.open_branch().get_stacked_on_url())
485
 
        repo = new_child.open_repository()
486
 
        self.assertTrue(repo._format.supports_external_lookups)
487
 
        self.assertFalse(repo.supports_rich_root())
488
 
 
489
 
    def test_clone_on_transport_upgrades_format_if_stacked_on_specified(self):
490
 
        child_branch, new_child_transport = self.prepare_default_stacking(
491
 
            child_format='pack-0.92')
492
 
        new_child = child_branch.bzrdir.clone_on_transport(new_child_transport,
493
 
            stacked_on=child_branch.bzrdir.root_transport.base)
494
 
        self.assertEqual(child_branch.bzrdir.root_transport.base,
495
 
                         new_child.open_branch().get_stacked_on_url())
496
 
        repo = new_child.open_repository()
497
 
        self.assertTrue(repo._format.supports_external_lookups)
498
 
        self.assertFalse(repo.supports_rich_root())
499
 
 
500
 
    def test_sprout_upgrades_to_rich_root_format_if_needed(self):
501
 
        child_branch, new_child_transport = self.prepare_default_stacking(
502
 
            child_format='rich-root-pack')
503
 
        new_child = child_branch.bzrdir.sprout(new_child_transport.base,
504
 
                                               stacked=True)
505
 
        repo = new_child.open_repository()
506
 
        self.assertTrue(repo._format.supports_external_lookups)
507
 
        self.assertTrue(repo.supports_rich_root())
508
 
 
509
 
    def test_add_fallback_repo_handles_absolute_urls(self):
510
 
        stack_on = self.make_branch('stack_on', format='development1')
511
 
        repo = self.make_repository('repo', format='development1')
512
 
        policy = bzrdir.UseExistingRepository(repo, stack_on.base)
513
 
        policy._add_fallback(repo)
514
 
 
515
 
    def test_add_fallback_repo_handles_relative_urls(self):
516
 
        stack_on = self.make_branch('stack_on', format='development1')
517
 
        repo = self.make_repository('repo', format='development1')
518
 
        policy = bzrdir.UseExistingRepository(repo, '.', stack_on.base)
519
 
        policy._add_fallback(repo)
520
 
 
521
 
    def test_configure_relative_branch_stacking_url(self):
522
 
        stack_on = self.make_branch('stack_on', format='development1')
523
 
        stacked = self.make_branch('stack_on/stacked', format='development1')
524
 
        policy = bzrdir.UseExistingRepository(stacked.repository,
525
 
            '.', stack_on.base)
526
 
        policy.configure_branch(stacked)
527
 
        self.assertEqual('..', stacked.get_stacked_on_url())
528
 
 
529
 
    def test_relative_branch_stacking_to_absolute(self):
530
 
        stack_on = self.make_branch('stack_on', format='development1')
531
 
        stacked = self.make_branch('stack_on/stacked', format='development1')
532
 
        policy = bzrdir.UseExistingRepository(stacked.repository,
533
 
            '.', self.get_readonly_url('stack_on'))
534
 
        policy.configure_branch(stacked)
535
 
        self.assertEqual(self.get_readonly_url('stack_on'),
536
 
                         stacked.get_stacked_on_url())
537
 
 
538
 
 
539
443
class ChrootedTests(TestCaseWithTransport):
540
444
    """A support class that provides readonly urls outside the local namespace.
541
445
 
549
453
        if not self.vfs_transport_factory == MemoryServer:
550
454
            self.transport_readonly_server = HttpServer
551
455
 
552
 
    def local_branch_path(self, branch):
553
 
         return os.path.realpath(urlutils.local_path_from_url(branch.base))
554
 
 
555
456
    def test_open_containing(self):
556
457
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing,
557
458
                          self.get_readonly_url(''))
563
464
        branch, relpath = bzrdir.BzrDir.open_containing(self.get_readonly_url('g/p/q'))
564
465
        self.assertEqual('g/p/q', relpath)
565
466
 
566
 
    def test_open_containing_tree_branch_or_repository_empty(self):
567
 
        self.assertRaises(errors.NotBranchError,
568
 
            bzrdir.BzrDir.open_containing_tree_branch_or_repository,
569
 
            self.get_readonly_url(''))
570
 
 
571
 
    def test_open_containing_tree_branch_or_repository_all(self):
572
 
        self.make_branch_and_tree('topdir')
573
 
        tree, branch, repo, relpath = \
574
 
            bzrdir.BzrDir.open_containing_tree_branch_or_repository(
575
 
                'topdir/foo')
576
 
        self.assertEqual(os.path.realpath('topdir'),
577
 
                         os.path.realpath(tree.basedir))
578
 
        self.assertEqual(os.path.realpath('topdir'),
579
 
                         self.local_branch_path(branch))
580
 
        self.assertEqual(
581
 
            osutils.realpath(os.path.join('topdir', '.bzr', 'repository')),
582
 
            repo.bzrdir.transport.local_abspath('repository'))
583
 
        self.assertEqual(relpath, 'foo')
584
 
 
585
 
    def test_open_containing_tree_branch_or_repository_no_tree(self):
586
 
        self.make_branch('branch')
587
 
        tree, branch, repo, relpath = \
588
 
            bzrdir.BzrDir.open_containing_tree_branch_or_repository(
589
 
                'branch/foo')
590
 
        self.assertEqual(tree, None)
591
 
        self.assertEqual(os.path.realpath('branch'),
592
 
                         self.local_branch_path(branch))
593
 
        self.assertEqual(
594
 
            osutils.realpath(os.path.join('branch', '.bzr', 'repository')),
595
 
            repo.bzrdir.transport.local_abspath('repository'))
596
 
        self.assertEqual(relpath, 'foo')
597
 
 
598
 
    def test_open_containing_tree_branch_or_repository_repo(self):
599
 
        self.make_repository('repo')
600
 
        tree, branch, repo, relpath = \
601
 
            bzrdir.BzrDir.open_containing_tree_branch_or_repository(
602
 
                'repo')
603
 
        self.assertEqual(tree, None)
604
 
        self.assertEqual(branch, None)
605
 
        self.assertEqual(
606
 
            osutils.realpath(os.path.join('repo', '.bzr', 'repository')),
607
 
            repo.bzrdir.transport.local_abspath('repository'))
608
 
        self.assertEqual(relpath, '')
609
 
 
610
 
    def test_open_containing_tree_branch_or_repository_shared_repo(self):
611
 
        self.make_repository('shared', shared=True)
612
 
        bzrdir.BzrDir.create_branch_convenience('shared/branch',
613
 
                                                force_new_tree=False)
614
 
        tree, branch, repo, relpath = \
615
 
            bzrdir.BzrDir.open_containing_tree_branch_or_repository(
616
 
                'shared/branch')
617
 
        self.assertEqual(tree, None)
618
 
        self.assertEqual(os.path.realpath('shared/branch'),
619
 
                         self.local_branch_path(branch))
620
 
        self.assertEqual(
621
 
            osutils.realpath(os.path.join('shared', '.bzr', 'repository')),
622
 
            repo.bzrdir.transport.local_abspath('repository'))
623
 
        self.assertEqual(relpath, '')
624
 
 
625
 
    def test_open_containing_tree_branch_or_repository_branch_subdir(self):
626
 
        self.make_branch_and_tree('foo')
627
 
        self.build_tree(['foo/bar/'])
628
 
        tree, branch, repo, relpath = \
629
 
            bzrdir.BzrDir.open_containing_tree_branch_or_repository(
630
 
                'foo/bar')
631
 
        self.assertEqual(os.path.realpath('foo'),
632
 
                         os.path.realpath(tree.basedir))
633
 
        self.assertEqual(os.path.realpath('foo'),
634
 
                         self.local_branch_path(branch))
635
 
        self.assertEqual(
636
 
            osutils.realpath(os.path.join('foo', '.bzr', 'repository')),
637
 
            repo.bzrdir.transport.local_abspath('repository'))
638
 
        self.assertEqual(relpath, 'bar')
639
 
 
640
 
    def test_open_containing_tree_branch_or_repository_repo_subdir(self):
641
 
        self.make_repository('bar')
642
 
        self.build_tree(['bar/baz/'])
643
 
        tree, branch, repo, relpath = \
644
 
            bzrdir.BzrDir.open_containing_tree_branch_or_repository(
645
 
                'bar/baz')
646
 
        self.assertEqual(tree, None)
647
 
        self.assertEqual(branch, None)
648
 
        self.assertEqual(
649
 
            osutils.realpath(os.path.join('bar', '.bzr', 'repository')),
650
 
            repo.bzrdir.transport.local_abspath('repository'))
651
 
        self.assertEqual(relpath, 'baz')
652
 
 
653
467
    def test_open_containing_from_transport(self):
654
468
        self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
655
469
                          get_transport(self.get_readonly_url('')))
664
478
        self.assertEqual('g/p/q', relpath)
665
479
 
666
480
    def test_open_containing_tree_or_branch(self):
 
481
        def local_branch_path(branch):
 
482
             return os.path.realpath(
 
483
                urlutils.local_path_from_url(branch.base))
 
484
 
667
485
        self.make_branch_and_tree('topdir')
668
486
        tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
669
487
            'topdir/foo')
670
488
        self.assertEqual(os.path.realpath('topdir'),
671
489
                         os.path.realpath(tree.basedir))
672
490
        self.assertEqual(os.path.realpath('topdir'),
673
 
                         self.local_branch_path(branch))
 
491
                         local_branch_path(branch))
674
492
        self.assertIs(tree.bzrdir, branch.bzrdir)
675
493
        self.assertEqual('foo', relpath)
676
494
        # opening from non-local should not return the tree
684
502
            'topdir/foo')
685
503
        self.assertIs(tree, None)
686
504
        self.assertEqual(os.path.realpath('topdir/foo'),
687
 
                         self.local_branch_path(branch))
 
505
                         local_branch_path(branch))
688
506
        self.assertEqual('', relpath)
689
507
 
690
 
    def test_open_tree_or_branch(self):
691
 
        self.make_branch_and_tree('topdir')
692
 
        tree, branch = bzrdir.BzrDir.open_tree_or_branch('topdir')
693
 
        self.assertEqual(os.path.realpath('topdir'),
694
 
                         os.path.realpath(tree.basedir))
695
 
        self.assertEqual(os.path.realpath('topdir'),
696
 
                         self.local_branch_path(branch))
697
 
        self.assertIs(tree.bzrdir, branch.bzrdir)
698
 
        # opening from non-local should not return the tree
699
 
        tree, branch = bzrdir.BzrDir.open_tree_or_branch(
700
 
            self.get_readonly_url('topdir'))
701
 
        self.assertEqual(None, tree)
702
 
        # without a tree:
703
 
        self.make_branch('topdir/foo')
704
 
        tree, branch = bzrdir.BzrDir.open_tree_or_branch('topdir/foo')
705
 
        self.assertIs(tree, None)
706
 
        self.assertEqual(os.path.realpath('topdir/foo'),
707
 
                         self.local_branch_path(branch))
708
 
 
709
508
    def test_open_from_transport(self):
710
509
        # transport pointing at bzrdir should give a bzrdir with root transport
711
510
        # set to the given transport
765
564
        self.failUnlessExists('repo/tree2/subtree')
766
565
        self.failIfExists('repo/tree2/subtree/file')
767
566
 
768
 
    def make_foo_bar_baz(self):
769
 
        foo = bzrdir.BzrDir.create_branch_convenience('foo').bzrdir
770
 
        bar = self.make_branch('foo/bar').bzrdir
771
 
        baz = self.make_branch('baz').bzrdir
772
 
        return foo, bar, baz
773
 
 
774
 
    def test_find_bzrdirs(self):
775
 
        foo, bar, baz = self.make_foo_bar_baz()
776
 
        transport = get_transport(self.get_url())
777
 
        self.assertEqualBzrdirs([baz, foo, bar],
778
 
                                bzrdir.BzrDir.find_bzrdirs(transport))
779
 
 
780
 
    def test_find_bzrdirs_list_current(self):
781
 
        def list_current(transport):
782
 
            return [s for s in transport.list_dir('') if s != 'baz']
783
 
 
784
 
        foo, bar, baz = self.make_foo_bar_baz()
785
 
        transport = get_transport(self.get_url())
786
 
        self.assertEqualBzrdirs([foo, bar],
787
 
                                bzrdir.BzrDir.find_bzrdirs(transport,
788
 
                                    list_current=list_current))
789
 
 
790
 
 
791
 
    def test_find_bzrdirs_evaluate(self):
792
 
        def evaluate(bzrdir):
793
 
            try:
794
 
                repo = bzrdir.open_repository()
795
 
            except NoRepositoryPresent:
796
 
                return True, bzrdir.root_transport.base
797
 
            else:
798
 
                return False, bzrdir.root_transport.base
799
 
 
800
 
        foo, bar, baz = self.make_foo_bar_baz()
801
 
        transport = get_transport(self.get_url())
802
 
        self.assertEqual([baz.root_transport.base, foo.root_transport.base],
803
 
                         list(bzrdir.BzrDir.find_bzrdirs(transport,
804
 
                                                         evaluate=evaluate)))
805
 
 
806
 
    def assertEqualBzrdirs(self, first, second):
807
 
        first = list(first)
808
 
        second = list(second)
809
 
        self.assertEqual(len(first), len(second))
810
 
        for x, y in zip(first, second):
811
 
            self.assertEqual(x.root_transport.base, y.root_transport.base)
812
 
 
813
 
    def test_find_branches(self):
814
 
        root = self.make_repository('', shared=True)
815
 
        foo, bar, baz = self.make_foo_bar_baz()
816
 
        qux = self.make_bzrdir('foo/qux')
817
 
        transport = get_transport(self.get_url())
818
 
        branches = bzrdir.BzrDir.find_branches(transport)
819
 
        self.assertEqual(baz.root_transport.base, branches[0].base)
820
 
        self.assertEqual(foo.root_transport.base, branches[1].base)
821
 
        self.assertEqual(bar.root_transport.base, branches[2].base)
822
 
 
823
 
        # ensure this works without a top-level repo
824
 
        branches = bzrdir.BzrDir.find_branches(transport.clone('foo'))
825
 
        self.assertEqual(foo.root_transport.base, branches[0].base)
826
 
        self.assertEqual(bar.root_transport.base, branches[1].base)
827
 
 
828
567
 
829
568
class TestMeta1DirFormat(TestCaseWithTransport):
830
569
    """Tests specific to the meta1 dir format."""
1131
870
    """Tests redirections for pycurl implementation"""
1132
871
 
1133
872
    _qualifier = 'pycurl'
1134
 
 
1135
 
 
1136
 
class TestDotBzrHidden(TestCaseWithTransport):
1137
 
 
1138
 
    ls = ['ls']
1139
 
    if sys.platform == 'win32':
1140
 
        ls = [os.environ['COMSPEC'], '/C', 'dir', '/B']
1141
 
 
1142
 
    def get_ls(self):
1143
 
        f = subprocess.Popen(self.ls, stdout=subprocess.PIPE,
1144
 
            stderr=subprocess.PIPE)
1145
 
        out, err = f.communicate()
1146
 
        self.assertEqual(0, f.returncode, 'Calling %s failed: %s'
1147
 
                         % (self.ls, err))
1148
 
        return out.splitlines()
1149
 
 
1150
 
    def test_dot_bzr_hidden(self):
1151
 
        if sys.platform == 'win32' and not win32utils.has_win32file:
1152
 
            raise TestSkipped('unable to make file hidden without pywin32 library')
1153
 
        b = bzrdir.BzrDir.create('.')
1154
 
        self.build_tree(['a'])
1155
 
        self.assertEquals(['a'], self.get_ls())
1156
 
 
1157
 
    def test_dot_bzr_hidden_with_url(self):
1158
 
        if sys.platform == 'win32' and not win32utils.has_win32file:
1159
 
            raise TestSkipped('unable to make file hidden without pywin32 library')
1160
 
        b = bzrdir.BzrDir.create(urlutils.local_path_to_url('.'))
1161
 
        self.build_tree(['a'])
1162
 
        self.assertEquals(['a'], self.get_ls())
1163
 
 
1164
 
 
1165
 
class _TestBzrDirFormat(bzrdir.BzrDirMetaFormat1):
1166
 
    """Test BzrDirFormat implementation for TestBzrDirSprout."""
1167
 
 
1168
 
    def _open(self, transport):
1169
 
        return _TestBzrDir(transport, self)
1170
 
 
1171
 
 
1172
 
class _TestBzrDir(bzrdir.BzrDirMeta1):
1173
 
    """Test BzrDir implementation for TestBzrDirSprout.
1174
 
    
1175
 
    When created a _TestBzrDir already has repository and a branch.  The branch
1176
 
    is a test double as well.
1177
 
    """
1178
 
 
1179
 
    def __init__(self, *args, **kwargs):
1180
 
        super(_TestBzrDir, self).__init__(*args, **kwargs)
1181
 
        self.test_branch = _TestBranch()
1182
 
        self.test_branch.repository = self.create_repository()
1183
 
 
1184
 
    def open_branch(self, unsupported=False):
1185
 
        return self.test_branch
1186
 
 
1187
 
    def cloning_metadir(self, require_stacking=False):
1188
 
        return _TestBzrDirFormat()
1189
 
 
1190
 
 
1191
 
class _TestBranch(bzrlib.branch.Branch):
1192
 
    """Test Branch implementation for TestBzrDirSprout."""
1193
 
 
1194
 
    def __init__(self, *args, **kwargs):
1195
 
        super(_TestBranch, self).__init__(*args, **kwargs)
1196
 
        self.calls = []
1197
 
        self._parent = None
1198
 
 
1199
 
    def sprout(self, *args, **kwargs):
1200
 
        self.calls.append('sprout')
1201
 
        return _TestBranch()
1202
 
 
1203
 
    def copy_content_into(self, destination, revision_id=None):
1204
 
        self.calls.append('copy_content_into')
1205
 
 
1206
 
    def get_parent(self):
1207
 
        return self._parent
1208
 
 
1209
 
    def set_parent(self, parent):
1210
 
        self._parent = parent
1211
 
 
1212
 
 
1213
 
class TestBzrDirSprout(TestCaseWithMemoryTransport):
1214
 
 
1215
 
    def test_sprout_uses_branch_sprout(self):
1216
 
        """BzrDir.sprout calls Branch.sprout.
1217
 
 
1218
 
        Usually, BzrDir.sprout should delegate to the branch's sprout method
1219
 
        for part of the work.  This allows the source branch to control the
1220
 
        choice of format for the new branch.
1221
 
        
1222
 
        There are exceptions, but this tests avoids them:
1223
 
          - if there's no branch in the source bzrdir,
1224
 
          - or if the stacking has been requested and the format needs to be
1225
 
            overridden to satisfy that.
1226
 
        """
1227
 
        # Make an instrumented bzrdir.
1228
 
        t = self.get_transport('source')
1229
 
        t.ensure_base()
1230
 
        source_bzrdir = _TestBzrDirFormat().initialize_on_transport(t)
1231
 
        # The instrumented bzrdir has a test_branch attribute that logs calls
1232
 
        # made to the branch contained in that bzrdir.  Initially the test
1233
 
        # branch exists but no calls have been made to it.
1234
 
        self.assertEqual([], source_bzrdir.test_branch.calls)
1235
 
 
1236
 
        # Sprout the bzrdir
1237
 
        target_url = self.get_url('target')
1238
 
        result = source_bzrdir.sprout(target_url, recurse='no')
1239
 
 
1240
 
        # The bzrdir called the branch's sprout method.
1241
 
        self.assertSubset(['sprout'], source_bzrdir.test_branch.calls)
1242
 
 
1243
 
    def test_sprout_parent(self):
1244
 
        grandparent_tree = self.make_branch('grandparent')
1245
 
        parent = grandparent_tree.bzrdir.sprout('parent').open_branch()
1246
 
        branch_tree = parent.bzrdir.sprout('branch').open_branch()
1247
 
        self.assertContainsRe(branch_tree.get_parent(), '/parent/$')