/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_info.py

  • Committer: mernst at mit
  • Date: 2008-10-16 10:57:16 UTC
  • mto: This revision was merged to the branch mainline in revision 3799.
  • Revision ID: mernst@csail.mit.edu-20081016105716-v8x8n5t2pf7f6uds
Improved documentation of stacked and lightweight branches

These patches improve the User Guide's documentation of stacked and
lightweight branches.

Section "1.2.6 Putting the concepts together" should mention stacked
branches and the difference between them and lightweight branches.  It
should also contain links to further details of the common scenarios.

Section "5.3.4 Getting a lightweight checkout" should mention stacked
branches as an option, and should link to all the options, not just some of
them.  It should also clarify that lightweight only applies to checkouts,
not to arbitrary branches.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2007 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
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
 
16
 
 
17
import sys
 
18
from urllib import quote
 
19
 
 
20
from bzrlib import (
 
21
    branch as _mod_branch,
 
22
    bzrdir,
 
23
    info,
 
24
    tests,
 
25
    workingtree,
 
26
    repository as _mod_repository,
 
27
    )
 
28
 
 
29
 
 
30
class TestInfo(tests.TestCaseWithTransport):
 
31
 
 
32
    def test_describe_standalone_layout(self):
 
33
        tree = self.make_branch_and_tree('tree')
 
34
        self.assertEqual('Empty control directory', info.describe_layout())
 
35
        self.assertEqual('Unshared repository with trees',
 
36
            info.describe_layout(tree.branch.repository))
 
37
        tree.branch.repository.set_make_working_trees(False)
 
38
        self.assertEqual('Unshared repository',
 
39
            info.describe_layout(tree.branch.repository))
 
40
        self.assertEqual('Standalone branch',
 
41
            info.describe_layout(tree.branch.repository, tree.branch))
 
42
        self.assertEqual('Standalone branchless tree',
 
43
            info.describe_layout(tree.branch.repository, None, tree))
 
44
        self.assertEqual('Standalone tree',
 
45
            info.describe_layout(tree.branch.repository, tree.branch, tree))
 
46
        tree.branch.bind(tree.branch)
 
47
        self.assertEqual('Bound branch',
 
48
            info.describe_layout(tree.branch.repository, tree.branch))
 
49
        self.assertEqual('Checkout',
 
50
            info.describe_layout(tree.branch.repository, tree.branch, tree))
 
51
        checkout = tree.branch.create_checkout('checkout', lightweight=True)
 
52
        self.assertEqual('Lightweight checkout',
 
53
            info.describe_layout(checkout.branch.repository, checkout.branch,
 
54
                                 checkout))
 
55
 
 
56
    def test_describe_repository_layout(self):
 
57
        repository = self.make_repository('.', shared=True)
 
58
        tree = bzrdir.BzrDir.create_branch_convenience('tree',
 
59
            force_new_tree=True).bzrdir.open_workingtree()
 
60
        self.assertEqual('Shared repository with trees',
 
61
            info.describe_layout(tree.branch.repository))
 
62
        repository.set_make_working_trees(False)
 
63
        self.assertEqual('Shared repository',
 
64
            info.describe_layout(tree.branch.repository))
 
65
        self.assertEqual('Repository branch',
 
66
            info.describe_layout(tree.branch.repository, tree.branch))
 
67
        self.assertEqual('Repository branchless tree',
 
68
            info.describe_layout(tree.branch.repository, None, tree))
 
69
        self.assertEqual('Repository tree',
 
70
            info.describe_layout(tree.branch.repository, tree.branch, tree))
 
71
        tree.branch.bind(tree.branch)
 
72
        self.assertEqual('Repository checkout',
 
73
            info.describe_layout(tree.branch.repository, tree.branch, tree))
 
74
        checkout = tree.branch.create_checkout('checkout', lightweight=True)
 
75
        self.assertEqual('Lightweight checkout',
 
76
            info.describe_layout(checkout.branch.repository, checkout.branch,
 
77
                                 checkout))
 
78
 
 
79
    def assertTreeDescription(self, format):
 
80
        """Assert a tree's format description matches expectations"""
 
81
        self.make_branch_and_tree('%s_tree' % format, format=format)
 
82
        tree = workingtree.WorkingTree.open('%s_tree' % format)
 
83
        self.assertEqual(format, info.describe_format(tree.bzrdir,
 
84
            tree.branch.repository, tree.branch, tree))
 
85
 
 
86
    def assertCheckoutDescription(self, format, expected=None):
 
87
        """Assert a checkout's format description matches expectations"""
 
88
        if expected is None:
 
89
            expected = format
 
90
        branch = self.make_branch('%s_cobranch' % format, format=format)
 
91
        # this ought to be easier...
 
92
        branch.create_checkout('%s_co' % format,
 
93
            lightweight=True).bzrdir.destroy_workingtree()
 
94
        control = bzrdir.BzrDir.open('%s_co' % format)
 
95
        old_format = control._format.workingtree_format
 
96
        try:
 
97
            control._format.workingtree_format = \
 
98
                bzrdir.format_registry.make_bzrdir(format).workingtree_format
 
99
            control.create_workingtree()
 
100
            tree = workingtree.WorkingTree.open('%s_co' % format)
 
101
            format_description = info.describe_format(tree.bzrdir,
 
102
                    tree.branch.repository, tree.branch, tree)
 
103
            self.assertEqual(expected, format_description,
 
104
                "checkout of format called %r was described as %r" %
 
105
                (expected, format_description))
 
106
        finally:
 
107
            control._format.workingtree_format = old_format
 
108
 
 
109
    def assertBranchDescription(self, format, expected=None):
 
110
        """Assert branch's format description matches expectations"""
 
111
        if expected is None:
 
112
            expected = format
 
113
        self.make_branch('%s_branch' % format, format=format)
 
114
        branch = _mod_branch.Branch.open('%s_branch' % format)
 
115
        self.assertEqual(expected, info.describe_format(branch.bzrdir,
 
116
            branch.repository, branch, None))
 
117
 
 
118
    def assertRepoDescription(self, format, expected=None):
 
119
        """Assert repository's format description matches expectations"""
 
120
        if expected is None:
 
121
            expected = format
 
122
        self.make_repository('%s_repo' % format, format=format)
 
123
        repo = _mod_repository.Repository.open('%s_repo' % format)
 
124
        self.assertEqual(expected, info.describe_format(repo.bzrdir,
 
125
            repo, None, None))
 
126
 
 
127
    def test_describe_tree_format(self):
 
128
        for key in bzrdir.format_registry.keys():
 
129
            if key in bzrdir.format_registry.aliases():
 
130
                continue
 
131
            self.assertTreeDescription(key)
 
132
 
 
133
    def test_describe_checkout_format(self):
 
134
        for key in bzrdir.format_registry.keys():
 
135
            if key in bzrdir.format_registry.aliases():
 
136
                # Aliases will not describe correctly in the UI because the
 
137
                # real format is found.
 
138
                continue
 
139
            # legacy: weave does not support checkouts
 
140
            if key == 'weave':
 
141
                continue
 
142
            if bzrdir.format_registry.get_info(key).experimental:
 
143
                # We don't require that experimental formats support checkouts
 
144
                # or describe correctly in the UI.
 
145
                continue
 
146
            expected = None
 
147
            if key in ('dirstate', 'dirstate-tags', 'dirstate-with-subtree',
 
148
                'pack-0.92', 'pack-0.92-subtree', 'rich-root',
 
149
                'rich-root-pack', '1.6', '1.6.1-rich-root'):
 
150
                expected = '1.6 or 1.6.1-rich-root or ' \
 
151
                    'dirstate or dirstate-tags or pack-0.92 or'\
 
152
                    ' rich-root or rich-root-pack'
 
153
            if key in ('knit', 'metaweave'):
 
154
                expected = 'knit or metaweave'
 
155
            self.assertCheckoutDescription(key, expected)
 
156
 
 
157
    def test_describe_branch_format(self):
 
158
        for key in bzrdir.format_registry.keys():
 
159
            if key in bzrdir.format_registry.aliases():
 
160
                continue
 
161
            expected = None
 
162
            if key in ('dirstate', 'knit'):
 
163
                expected = 'dirstate or knit'
 
164
            self.assertBranchDescription(key, expected)
 
165
 
 
166
    def test_describe_repo_format(self):
 
167
        for key in bzrdir.format_registry.keys():
 
168
            if key in bzrdir.format_registry.aliases():
 
169
                continue
 
170
            expected = None
 
171
            if key in ('dirstate', 'knit', 'dirstate-tags'):
 
172
                expected = 'dirstate or dirstate-tags or knit'
 
173
            self.assertRepoDescription(key, expected)
 
174
 
 
175
        format = bzrdir.format_registry.make_bzrdir('metaweave')
 
176
        format.set_branch_format(_mod_branch.BzrBranchFormat6())
 
177
        tree = self.make_branch_and_tree('unknown', format=format)
 
178
        self.assertEqual('unnamed', info.describe_format(tree.bzrdir,
 
179
            tree.branch.repository, tree.branch, tree))
 
180
 
 
181
    def test_gather_location_standalone(self):
 
182
        tree = self.make_branch_and_tree('tree')
 
183
        self.assertEqual([('branch root', tree.bzrdir.root_transport.base)],
 
184
            info.gather_location_info(tree.branch.repository, tree.branch,
 
185
                                      tree))
 
186
        self.assertEqual([('branch root', tree.bzrdir.root_transport.base)],
 
187
            info.gather_location_info(tree.branch.repository, tree.branch))
 
188
        return tree
 
189
 
 
190
    def test_gather_location_repo(self):
 
191
        srepo = self.make_repository('shared', shared=True)
 
192
        self.assertEqual([('shared repository',
 
193
                          srepo.bzrdir.root_transport.base)],
 
194
                          info.gather_location_info(srepo))
 
195
        urepo = self.make_repository('unshared')
 
196
        self.assertEqual([('repository',
 
197
                          urepo.bzrdir.root_transport.base)],
 
198
                          info.gather_location_info(urepo))
 
199
 
 
200
    def test_gather_location_repo_branch(self):
 
201
        srepo = self.make_repository('shared', shared=True)
 
202
        self.assertEqual([('shared repository',
 
203
                          srepo.bzrdir.root_transport.base)],
 
204
                          info.gather_location_info(srepo))
 
205
        tree = self.make_branch_and_tree('shared/tree')
 
206
        self.assertEqual([('shared repository',
 
207
                          srepo.bzrdir.root_transport.base),
 
208
                          ('repository branch', tree.branch.base)],
 
209
                          info.gather_location_info(srepo, tree.branch, tree))
 
210
 
 
211
    def test_gather_location_light_checkout(self):
 
212
        tree = self.make_branch_and_tree('tree')
 
213
        lcheckout = tree.branch.create_checkout('lcheckout', lightweight=True)
 
214
        self.assertEqual(
 
215
            [('light checkout root', lcheckout.bzrdir.root_transport.base),
 
216
             ('checkout of branch', tree.bzrdir.root_transport.base)],
 
217
            self.gather_tree_location_info(lcheckout))
 
218
 
 
219
    def test_gather_location_heavy_checkout(self):
 
220
        tree = self.make_branch_and_tree('tree')
 
221
        checkout = tree.branch.create_checkout('checkout')
 
222
        self.assertEqual(
 
223
            [('checkout root', checkout.bzrdir.root_transport.base),
 
224
             ('checkout of branch', tree.bzrdir.root_transport.base)],
 
225
            self.gather_tree_location_info(checkout))
 
226
        light_checkout = checkout.branch.create_checkout('light_checkout',
 
227
                                                         lightweight=True)
 
228
        self.assertEqual(
 
229
            [('light checkout root',
 
230
              light_checkout.bzrdir.root_transport.base),
 
231
             ('checkout root', checkout.bzrdir.root_transport.base),
 
232
             ('checkout of branch', tree.bzrdir.root_transport.base)],
 
233
             self.gather_tree_location_info(light_checkout)
 
234
             )
 
235
 
 
236
    def test_gather_location_shared_repo_checkout(self):
 
237
        tree = self.make_branch_and_tree('tree')
 
238
        srepo = self.make_repository('shared', shared=True)
 
239
        shared_checkout = tree.branch.create_checkout('shared/checkout')
 
240
        self.assertEqual(
 
241
            [('repository checkout root',
 
242
              shared_checkout.bzrdir.root_transport.base),
 
243
             ('checkout of branch', tree.bzrdir.root_transport.base),
 
244
             ('shared repository', srepo.bzrdir.root_transport.base)],
 
245
             self.gather_tree_location_info(shared_checkout))
 
246
 
 
247
    def gather_tree_location_info(self, tree):
 
248
        return info.gather_location_info(tree.branch.repository, tree.branch,
 
249
                                         tree)
 
250
 
 
251
    def test_gather_location_bound(self):
 
252
        branch = self.make_branch('branch')
 
253
        bound_branch = self.make_branch('bound_branch')
 
254
        bound_branch.bind(branch)
 
255
        self.assertEqual(
 
256
            [('branch root', bound_branch.bzrdir.root_transport.base),
 
257
             ('bound to branch', branch.bzrdir.root_transport.base)],
 
258
            info.gather_location_info(bound_branch.repository, bound_branch)
 
259
        )
 
260
 
 
261
    def test_location_list(self):
 
262
        if sys.platform == 'win32':
 
263
            raise tests.TestSkipped('Windows-unfriendly test')
 
264
        locs = info.LocationList('/home/foo')
 
265
        locs.add_url('a', 'file:///home/foo/')
 
266
        locs.add_url('b', 'file:///home/foo/bar/')
 
267
        locs.add_url('c', 'file:///home/bar/bar')
 
268
        locs.add_url('d', 'http://example.com/example/')
 
269
        locs.add_url('e', None)
 
270
        self.assertEqual(locs.locs, [('a', '.'),
 
271
                                     ('b', 'bar'),
 
272
                                     ('c', '/home/bar/bar'),
 
273
                                     ('d', 'http://example.com/example/')])
 
274
        self.assertEqualDiff('  a: .\n  b: bar\n  c: /home/bar/bar\n'
 
275
                             '  d: http://example.com/example/\n',
 
276
                             ''.join(locs.get_lines()))
 
277
 
 
278
    def test_gather_related_braches(self):
 
279
        branch = self.make_branch('.')
 
280
        branch.set_public_branch('baz')
 
281
        branch.set_push_location('bar')
 
282
        branch.set_parent('foo')
 
283
        branch.set_submit_branch('qux')
 
284
        self.assertEqual(
 
285
            [('public branch', 'baz'), ('push branch', 'bar'),
 
286
             ('parent branch', 'foo'), ('submit branch', 'qux')],
 
287
            info._gather_related_branches(branch).locs)