/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5557.1.7 by John Arbash Meinel
Merge in the bzr.dev 5582
1
# Copyright (C) 2006-2011 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1534.4.39 by Robert Collins
Basic BzrDir support.
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1534.4.39 by Robert Collins
Basic BzrDir support.
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1534.4.39 by Robert Collins
Basic BzrDir support.
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1534.4.39 by Robert Collins
Basic BzrDir support.
16
17
"""BzrDir logic. The BzrDir is the basic control directory used by bzr.
18
19
At format 7 this was split out into Branch, Repository and Checkout control
20
directories.
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
21
22
Note: This module has a lot of ``open`` functions/methods that return
23
references to in-memory objects. As a rule, there are no matching ``close``
24
methods. To free any associated resources, simply stop referencing the
25
objects returned.
1534.4.39 by Robert Collins
Basic BzrDir support.
26
"""
27
3023.1.1 by Alexander Belchenko
Mark .bzr directories as "hidden" on Windows (#71147)
28
import sys
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
29
30
from bzrlib.lazy_import import lazy_import
31
lazy_import(globals(), """
1534.4.39 by Robert Collins
Basic BzrDir support.
32
import bzrlib
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
33
from bzrlib import (
5753.2.1 by Jelmer Vernooij
Work around lazy import issues.
34
    branch as _mod_branch,
5735.1.1 by Jelmer Vernooij
Move ControlDir.sprout to BzrDir.
35
    cleanup,
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
36
    errors,
5735.1.1 by Jelmer Vernooij
Move ControlDir.sprout to BzrDir.
37
    fetch,
2776.1.5 by Robert Collins
Add reasonably comprehensive tests for path last modified and per file graph behaviour.
38
    graph,
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
39
    lockable_files,
40
    lockdir,
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
41
    osutils,
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
42
    pyutils,
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
43
    remote,
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
44
    repository,
1996.3.12 by John Arbash Meinel
Change how 'revision' is imported to avoid problems later
45
    revision as _mod_revision,
5609.9.1 by Martin
Blindly change all users of get_transport to address the function via the transport module
46
    transport as _mod_transport,
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
47
    ui,
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
48
    urlutils,
3023.1.2 by Alexander Belchenko
Martin's review.
49
    win32utils,
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
50
    workingtree_3,
3023.1.2 by Alexander Belchenko
Martin's review.
51
    workingtree_4,
3978.3.14 by Jelmer Vernooij
Move BranchBzrDirInter.push() to BzrDir.push().
52
    )
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
53
from bzrlib.repofmt import knitpack_repo
2164.2.21 by Vincent Ladeuil
Take bundles into account.
54
from bzrlib.transport import (
55
    do_catching_redirections,
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
56
    local,
2164.2.21 by Vincent Ladeuil
Take bundles into account.
57
    )
6138.3.1 by Jonathan Riddell
use gettext() in more files
58
from bzrlib.i18n import gettext
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
59
""")
60
2164.2.1 by v.ladeuil+lp at free
First rough http branch redirection implementation.
61
from bzrlib.trace import (
5735.1.1 by Jelmer Vernooij
Move ControlDir.sprout to BzrDir.
62
    mutter,
2164.2.1 by v.ladeuil+lp at free
First rough http branch redirection implementation.
63
    note,
64
    )
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
65
66
from bzrlib import (
5904.1.2 by Martin Pool
Various pyflakes import fixes.
67
    config,
68
    controldir,
5712.3.8 by Jelmer Vernooij
Support lazy registration of BzrDir formats.
69
    registry,
2711.2.1 by Martin Pool
Deprecate BzrDir.create_repository
70
    )
5409.5.4 by Vincent Ladeuil
Deprecate BzrDir.generate_backup_name and use osutils.available_backup_name.
71
from bzrlib.symbol_versioning import (
72
    deprecated_in,
73
    deprecated_method,
74
    )
5363.2.2 by Jelmer Vernooij
Rename per_bzrdir => per_controldir.
75
76
5363.2.20 by Jelmer Vernooij
use controldir.X
77
class BzrDir(controldir.ControlDir):
1534.4.39 by Robert Collins
Basic BzrDir support.
78
    """A .bzr control diretory.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
79
1534.4.39 by Robert Collins
Basic BzrDir support.
80
    BzrDir instances let you create or open any of the things that can be
81
    found within .bzr - checkouts, branches and repositories.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
82
3407.2.13 by Martin Pool
Remove indirection through control_files to get transports
83
    :ivar transport:
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
84
        the transport which this bzr dir is rooted at (i.e. file:///.../.bzr/)
3407.2.13 by Martin Pool
Remove indirection through control_files to get transports
85
    :ivar root_transport:
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
86
        a transport connected to the directory this bzr was opened from
87
        (i.e. the parent directory holding the .bzr directory).
3416.2.1 by Martin Pool
Add BzrDir._get_file_mode and _get_dir_mode
88
89
    Everything in the bzrdir should have the same file permissions.
4160.1.1 by Robert Collins
Add a BzrDir.pre_open hook for use by the smart server gaol.
90
91
    :cvar hooks: An instance of BzrDirHooks.
1534.4.39 by Robert Collins
Basic BzrDir support.
92
    """
93
1687.1.12 by Robert Collins
Hook in the full break-lock ui.
94
    def break_lock(self):
95
        """Invoke break_lock on the first object in the bzrdir.
96
97
        If there is a tree, the tree is opened and break_lock() called.
98
        Otherwise, branch is tried, and finally repository.
99
        """
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
100
        # XXX: This seems more like a UI function than something that really
101
        # belongs in this class.
1687.1.12 by Robert Collins
Hook in the full break-lock ui.
102
        try:
103
            thing_to_unlock = self.open_workingtree()
104
        except (errors.NotLocalUrl, errors.NoWorkingTree):
105
            try:
106
                thing_to_unlock = self.open_branch()
107
            except errors.NotBranchError:
108
                try:
109
                    thing_to_unlock = self.open_repository()
110
                except errors.NoRepositoryPresent:
111
                    return
112
        thing_to_unlock.break_lock()
113
1910.2.12 by Aaron Bentley
Implement knit repo format 2
114
    def check_conversion_target(self, target_format):
4634.2.1 by Robert Collins
Fix regression in upgrade introduced with the change to upgrade in rev 4622.
115
        """Check that a bzrdir as a whole can be converted to a new format."""
116
        # The only current restriction is that the repository content can be 
117
        # fetched compatibly with the target.
1910.2.12 by Aaron Bentley
Implement knit repo format 2
118
        target_repo_format = target_format.repository_format
4634.2.1 by Robert Collins
Fix regression in upgrade introduced with the change to upgrade in rev 4622.
119
        try:
120
            self.open_repository()._format.check_conversion_target(
121
                target_repo_format)
122
        except errors.NoRepositoryPresent:
123
            # No repo, no problem.
124
            pass
1910.2.12 by Aaron Bentley
Implement knit repo format 2
125
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
126
    def clone_on_transport(self, transport, revision_id=None,
4294.2.2 by Robert Collins
Move use_existing and create_prefix all the way down to clone_on_transport, reducing duplicate work.
127
        force_new_repo=False, preserve_stacking=False, stacked_on=None,
5448.6.1 by Matthew Gordon
Added --no-tree option to pull. Needs testing and help text.
128
        create_prefix=False, use_existing_dir=True, no_tree=False):
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
129
        """Clone this bzrdir and its contents to transport verbatim.
130
3242.3.36 by Aaron Bentley
Updates from review comments
131
        :param transport: The transport for the location to produce the clone
132
            at.  If the target directory does not exist, it will be created.
133
        :param revision_id: The tip revision-id to use for any branch or
134
            working tree.  If not None, then the clone operation may tune
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
135
            itself to download less data.
3242.3.35 by Aaron Bentley
Cleanups and documentation
136
        :param force_new_repo: Do not use a shared repository for the target,
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
137
                               even if one is available.
3242.3.22 by Aaron Bentley
Make clone stacking optional
138
        :param preserve_stacking: When cloning a stacked branch, stack the
139
            new branch on top of the other branch's stacked-on branch.
4294.2.2 by Robert Collins
Move use_existing and create_prefix all the way down to clone_on_transport, reducing duplicate work.
140
        :param create_prefix: Create any missing directories leading up to
141
            to_transport.
142
        :param use_existing_dir: Use an existing directory if one exists.
5664.1.1 by Jelmer Vernooij
Document no_tree option to ControlDir.clone_on_transport.
143
        :param no_tree: If set to true prevents creation of a working tree.
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
144
        """
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
145
        # Overview: put together a broad description of what we want to end up
146
        # with; then make as few api calls as possible to do it.
5363.2.2 by Jelmer Vernooij
Rename per_bzrdir => per_controldir.
147
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
148
        # We may want to create a repo/branch/tree, if we do so what format
149
        # would we want for each:
3650.5.1 by Aaron Bentley
Fix push to use clone all the time.
150
        require_stacking = (stacked_on is not None)
4017.2.1 by Robert Collins
Add BzrDirFormatMeta1 test for the amount of rpc calls made initializing over the network.
151
        format = self.cloning_metadir(require_stacking)
5363.2.2 by Jelmer Vernooij
Rename per_bzrdir => per_controldir.
152
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
153
        # Figure out what objects we want:
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
154
        try:
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
155
            local_repo = self.find_repository()
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
156
        except errors.NoRepositoryPresent:
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
157
            local_repo = None
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
158
        try:
159
            local_branch = self.open_branch()
160
        except errors.NotBranchError:
161
            local_branch = None
162
        else:
163
            # enable fallbacks when branch is not a branch reference
164
            if local_branch.repository.has_same_location(local_repo):
165
                local_repo = local_branch.repository
166
            if preserve_stacking:
167
                try:
3650.5.1 by Aaron Bentley
Fix push to use clone all the time.
168
                    stacked_on = local_branch.get_stacked_on_url()
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
169
                except (errors.UnstackableBranchFormat,
170
                        errors.UnstackableRepositoryFormat,
171
                        errors.NotStacked):
172
                    pass
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
173
        # Bug: We create a metadir without knowing if it can support stacking,
174
        # we should look up the policy needs first, or just use it as a hint,
175
        # or something.
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
176
        if local_repo:
5448.6.1 by Matthew Gordon
Added --no-tree option to pull. Needs testing and help text.
177
            make_working_trees = local_repo.make_working_trees() and not no_tree
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
178
            want_shared = local_repo.is_shared()
179
            repo_format_name = format.repository_format.network_name()
180
        else:
181
            make_working_trees = False
182
            want_shared = False
183
            repo_format_name = None
184
185
        result_repo, result, require_stacking, repository_policy = \
186
            format.initialize_on_transport_ex(transport,
187
            use_existing_dir=use_existing_dir, create_prefix=create_prefix,
188
            force_new_repo=force_new_repo, stacked_on=stacked_on,
189
            stack_on_pwd=self.root_transport.base,
190
            repo_format_name=repo_format_name,
191
            make_working_trees=make_working_trees, shared_repo=want_shared)
192
        if repo_format_name:
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
193
            try:
194
                # If the result repository is in the same place as the
195
                # resulting bzr dir, it will have no content, further if the
196
                # result is not stacked then we know all content should be
197
                # copied, and finally if we are copying up to a specific
198
                # revision_id then we can use the pending-ancestry-result which
199
                # does not require traversing all of history to describe it.
5158.6.9 by Martin Pool
Simplify various code to use user_url
200
                if (result_repo.user_url == result.user_url
201
                    and not require_stacking and
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
202
                    revision_id is not None):
203
                    fetch_spec = graph.PendingAncestryResult(
204
                        [revision_id], local_repo)
205
                    result_repo.fetch(local_repo, fetch_spec=fetch_spec)
206
                else:
207
                    result_repo.fetch(local_repo, revision_id=revision_id)
208
            finally:
209
                result_repo.unlock()
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
210
        else:
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
211
            if result_repo is not None:
212
                raise AssertionError('result_repo not None(%r)' % result_repo)
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
213
        # 1 if there is a branch present
214
        #   make sure its content is available in the target repository
215
        #   clone it.
3242.3.37 by Aaron Bentley
Updates from reviews
216
        if local_branch is not None:
4050.1.1 by Robert Collins
Fix race condition with branch hooks during cloning when the new branch is stacked.
217
            result_branch = local_branch.clone(result, revision_id=revision_id,
218
                repository_policy=repository_policy)
4044.1.5 by Robert Collins
Stop trying to create working trees during clone when the target bzrdir cannot have a local abspath created for it.
219
        try:
220
            # Cheaper to check if the target is not local, than to try making
221
            # the tree and fail.
222
            result.root_transport.local_abspath('.')
223
            if result_repo is None or result_repo.make_working_trees():
6182.1.18 by Jelmer Vernooij
Fix last test.
224
                self.open_workingtree().clone(result, revision_id=revision_id)
4044.1.5 by Robert Collins
Stop trying to create working trees during clone when the target bzrdir cannot have a local abspath created for it.
225
        except (errors.NoWorkingTree, errors.NotLocalUrl):
226
            pass
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
227
        return result
228
1685.1.61 by Martin Pool
[broken] Change BzrDir._make_tail to use urlutils.split
229
    # TODO: This should be given a Transport, and should chdir up; otherwise
230
    # this will open a new connection.
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
231
    def _make_tail(self, url):
6039.1.9 by Jelmer Vernooij
Fix weave tests.
232
        t = _mod_transport.get_transport(url)
2475.3.3 by John Arbash Meinel
Change calls to try/mkdir('.')/except FileExists to ensure_base()
233
        t.ensure_base()
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
234
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
235
    def determine_repository_policy(self, force_new_repo=False, stack_on=None,
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
236
                                    stack_on_pwd=None, require_stacking=False):
3242.2.13 by Aaron Bentley
Update docs
237
        """Return an object representing a policy to use.
238
4165.2.1 by Robert Collins
Fix bzr failing to stack when a server requests it and the branch it is pushing from cannot stack but the branch it should stack on can.
239
        This controls whether a new repository is created, and the format of
240
        that repository, or some existing shared repository used instead.
3242.3.35 by Aaron Bentley
Cleanups and documentation
241
242
        If stack_on is supplied, will not seek a containing shared repo.
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
243
3242.3.35 by Aaron Bentley
Cleanups and documentation
244
        :param force_new_repo: If True, require a new repository to be created.
245
        :param stack_on: If supplied, the location to stack on.  If not
246
            supplied, a default_stack_on location may be used.
247
        :param stack_on_pwd: If stack_on is relative, the location it is
248
            relative to.
3242.2.13 by Aaron Bentley
Update docs
249
        """
3242.3.3 by Aaron Bentley
Use _find_containing to determine repository policy
250
        def repository_policy(found_bzrdir):
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
251
            stack_on = None
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
252
            stack_on_pwd = None
3641.1.1 by John Arbash Meinel
Merge in 1.6rc5 and revert disabling default stack on policy
253
            config = found_bzrdir.get_config()
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
254
            stop = False
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
255
            stack_on = config.get_default_stack_on()
256
            if stack_on is not None:
5158.6.9 by Martin Pool
Simplify various code to use user_url
257
                stack_on_pwd = found_bzrdir.user_url
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
258
                stop = True
3242.3.3 by Aaron Bentley
Use _find_containing to determine repository policy
259
            # does it have a repository ?
260
            try:
261
                repository = found_bzrdir.open_repository()
262
            except errors.NoRepositoryPresent:
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
263
                repository = None
264
            else:
5158.6.9 by Martin Pool
Simplify various code to use user_url
265
                if (found_bzrdir.user_url != self.user_url 
266
                    and not repository.is_shared()):
4165.2.1 by Robert Collins
Fix bzr failing to stack when a server requests it and the branch it is pushing from cannot stack but the branch it should stack on can.
267
                    # Don't look higher, can't use a higher shared repo.
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
268
                    repository = None
4165.2.1 by Robert Collins
Fix bzr failing to stack when a server requests it and the branch it is pushing from cannot stack but the branch it should stack on can.
269
                    stop = True
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
270
                else:
271
                    stop = True
272
            if not stop:
3242.3.3 by Aaron Bentley
Use _find_containing to determine repository policy
273
                return None, False
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
274
            if repository:
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
275
                return UseExistingRepository(repository, stack_on,
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
276
                    stack_on_pwd, require_stacking=require_stacking), True
3242.3.3 by Aaron Bentley
Use _find_containing to determine repository policy
277
            else:
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
278
                return CreateRepository(self, stack_on, stack_on_pwd,
279
                    require_stacking=require_stacking), True
3242.3.3 by Aaron Bentley
Use _find_containing to determine repository policy
280
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
281
        if not force_new_repo:
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
282
            if stack_on is None:
283
                policy = self._find_containing(repository_policy)
284
                if policy is not None:
285
                    return policy
286
            else:
287
                try:
288
                    return UseExistingRepository(self.open_repository(),
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
289
                        stack_on, stack_on_pwd,
290
                        require_stacking=require_stacking)
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
291
                except errors.NoRepositoryPresent:
292
                    pass
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
293
        return CreateRepository(self, stack_on, stack_on_pwd,
294
                                require_stacking=require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
295
1534.6.11 by Robert Collins
Review feedback.
296
    def _find_or_create_repository(self, force_new_repo):
297
        """Create a new repository if needed, returning the repository."""
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
298
        policy = self.determine_repository_policy(force_new_repo)
4070.9.2 by Andrew Bennetts
Rough prototype of allowing a SearchResult to be passed to fetch, and using that to improve network conversations.
299
        return policy.acquire_repository()[0]
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
300
5735.1.1 by Jelmer Vernooij
Move ControlDir.sprout to BzrDir.
301
    def _find_source_repo(self, add_cleanup, source_branch):
302
        """Find the source branch and repo for a sprout operation.
303
        
304
        This is helper intended for use by _sprout.
305
306
        :returns: (source_branch, source_repository).  Either or both may be
307
            None.  If not None, they will be read-locked (and their unlock(s)
308
            scheduled via the add_cleanup param).
309
        """
310
        if source_branch is not None:
311
            add_cleanup(source_branch.lock_read().unlock)
312
            return source_branch, source_branch.repository
313
        try:
314
            source_branch = self.open_branch()
315
            source_repository = source_branch.repository
316
        except errors.NotBranchError:
317
            source_branch = None
318
            try:
319
                source_repository = self.open_repository()
320
            except errors.NoRepositoryPresent:
321
                source_repository = None
322
            else:
323
                add_cleanup(source_repository.lock_read().unlock)
324
        else:
325
            add_cleanup(source_branch.lock_read().unlock)
326
        return source_branch, source_repository
327
328
    def sprout(self, url, revision_id=None, force_new_repo=False,
329
               recurse='down', possible_transports=None,
330
               accelerator_tree=None, hardlink=False, stacked=False,
331
               source_branch=None, create_tree_if_local=True):
332
        """Create a copy of this controldir prepared for use as a new line of
333
        development.
334
335
        If url's last component does not exist, it will be created.
336
337
        Attributes related to the identity of the source branch like
338
        branch nickname will be cleaned, a working tree is created
339
        whether one existed before or not; and a local branch is always
340
        created.
341
342
        if revision_id is not None, then the clone operation may tune
343
            itself to download less data.
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
344
5735.1.1 by Jelmer Vernooij
Move ControlDir.sprout to BzrDir.
345
        :param accelerator_tree: A tree which can be used for retrieving file
346
            contents more quickly than the revision tree, i.e. a workingtree.
347
            The revision tree will be used for cases where accelerator_tree's
348
            content is different.
349
        :param hardlink: If true, hard-link files from accelerator_tree,
350
            where possible.
351
        :param stacked: If true, create a stacked branch referring to the
352
            location of this control directory.
353
        :param create_tree_if_local: If true, a working-tree will be created
354
            when working locally.
355
        """
356
        operation = cleanup.OperationWithCleanups(self._sprout)
357
        return operation.run(url, revision_id=revision_id,
358
            force_new_repo=force_new_repo, recurse=recurse,
359
            possible_transports=possible_transports,
360
            accelerator_tree=accelerator_tree, hardlink=hardlink,
361
            stacked=stacked, source_branch=source_branch,
362
            create_tree_if_local=create_tree_if_local)
363
364
    def _sprout(self, op, url, revision_id=None, force_new_repo=False,
365
               recurse='down', possible_transports=None,
366
               accelerator_tree=None, hardlink=False, stacked=False,
367
               source_branch=None, create_tree_if_local=True):
368
        add_cleanup = op.add_cleanup
369
        fetch_spec_factory = fetch.FetchSpecFactory()
370
        if revision_id is not None:
371
            fetch_spec_factory.add_revision_ids([revision_id])
372
            fetch_spec_factory.source_branch_stop_revision_id = revision_id
373
        target_transport = _mod_transport.get_transport(url,
374
            possible_transports)
375
        target_transport.ensure_base()
376
        cloning_format = self.cloning_metadir(stacked)
377
        # Create/update the result branch
378
        result = cloning_format.initialize_on_transport(target_transport)
379
        source_branch, source_repository = self._find_source_repo(
380
            add_cleanup, source_branch)
381
        fetch_spec_factory.source_branch = source_branch
382
        # if a stacked branch wasn't requested, we don't create one
383
        # even if the origin was stacked
384
        if stacked and source_branch is not None:
385
            stacked_branch_url = self.root_transport.base
386
        else:
387
            stacked_branch_url = None
388
        repository_policy = result.determine_repository_policy(
389
            force_new_repo, stacked_branch_url, require_stacking=stacked)
390
        result_repo, is_new_repo = repository_policy.acquire_repository()
391
        add_cleanup(result_repo.lock_write().unlock)
392
        fetch_spec_factory.source_repo = source_repository
393
        fetch_spec_factory.target_repo = result_repo
394
        if stacked or (len(result_repo._fallback_repositories) != 0):
395
            target_repo_kind = fetch.TargetRepoKinds.STACKED
396
        elif is_new_repo:
397
            target_repo_kind = fetch.TargetRepoKinds.EMPTY
398
        else:
399
            target_repo_kind = fetch.TargetRepoKinds.PREEXISTING
400
        fetch_spec_factory.target_repo_kind = target_repo_kind
401
        if source_repository is not None:
402
            fetch_spec = fetch_spec_factory.make_fetch_spec()
403
            result_repo.fetch(source_repository, fetch_spec=fetch_spec)
404
405
        if source_branch is None:
406
            # this is for sprouting a controldir without a branch; is that
407
            # actually useful?
408
            # Not especially, but it's part of the contract.
409
            result_branch = result.create_branch()
410
        else:
411
            result_branch = source_branch.sprout(result,
412
                revision_id=revision_id, repository_policy=repository_policy,
413
                repository=result_repo)
414
        mutter("created new branch %r" % (result_branch,))
415
416
        # Create/update the result working tree
417
        if (create_tree_if_local and
418
            isinstance(target_transport, local.LocalTransport) and
419
            (result_repo is None or result_repo.make_working_trees())):
420
            wt = result.create_workingtree(accelerator_tree=accelerator_tree,
421
                hardlink=hardlink, from_branch=result_branch)
422
            wt.lock_write()
423
            try:
424
                if wt.path2id('') is None:
425
                    try:
426
                        wt.set_root_id(self.open_workingtree.get_root_id())
427
                    except errors.NoWorkingTree:
428
                        pass
429
            finally:
430
                wt.unlock()
431
        else:
432
            wt = None
433
        if recurse == 'down':
434
            basis = None
435
            if wt is not None:
436
                basis = wt.basis_tree()
437
            elif result_branch is not None:
438
                basis = result_branch.basis_tree()
439
            elif source_branch is not None:
440
                basis = source_branch.basis_tree()
441
            if basis is not None:
442
                add_cleanup(basis.lock_read().unlock)
443
                subtrees = basis.iter_references()
444
            else:
445
                subtrees = []
446
            for path, file_id in subtrees:
447
                target = urlutils.join(url, urlutils.escape(path))
448
                sublocation = source_branch.reference_parent(file_id, path)
449
                sublocation.bzrdir.sprout(target,
450
                    basis.get_reference_revision(file_id, path),
451
                    force_new_repo=force_new_repo, recurse=recurse,
452
                    stacked=stacked)
453
        return result
454
5409.5.4 by Vincent Ladeuil
Deprecate BzrDir.generate_backup_name and use osutils.available_backup_name.
455
    @deprecated_method(deprecated_in((2, 3, 0)))
5340.8.4 by Marius Kruger
* gen_backup_name => generate_backup_name
456
    def generate_backup_name(self, base):
5409.5.4 by Vincent Ladeuil
Deprecate BzrDir.generate_backup_name and use osutils.available_backup_name.
457
        return self._available_backup_name(base)
458
459
    def _available_backup_name(self, base):
5409.5.8 by Vincent Ladeuil
Be more explicit about race conditions and LBYL being discouraged
460
        """Find a non-existing backup file name based on base.
461
462
        See bzrlib.osutils.available_backup_name about race conditions.
463
        """
5409.5.4 by Vincent Ladeuil
Deprecate BzrDir.generate_backup_name and use osutils.available_backup_name.
464
        return osutils.available_backup_name(base, self.root_transport.has)
5340.8.1 by Marius Kruger
* make the backup file name generator in bzrdir available to others
465
3872.3.2 by Jelmer Vernooij
make backup_bzrdir determine the name for the backup files.
466
    def backup_bzrdir(self):
3872.3.1 by Jelmer Vernooij
Allow BzrDir implementation to implement backing up of control directory.
467
        """Backup this bzr control directory.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
468
3872.3.2 by Jelmer Vernooij
make backup_bzrdir determine the name for the backup files.
469
        :return: Tuple with old path name and new path name
3872.3.1 by Jelmer Vernooij
Allow BzrDir implementation to implement backing up of control directory.
470
        """
5035.4.1 by Parth Malwankar
fixes 335033.
471
3943.2.4 by Martin Pool
Move backup progress indicators from upgrade.py into backup_bzrdir, and tweak text
472
        pb = ui.ui_factory.nested_progress_bar()
473
        try:
474
            old_path = self.root_transport.abspath('.bzr')
5409.5.4 by Vincent Ladeuil
Deprecate BzrDir.generate_backup_name and use osutils.available_backup_name.
475
            backup_dir = self._available_backup_name('backup.bzr')
5035.4.2 by Parth Malwankar
name_gen now works with all transports.
476
            new_path = self.root_transport.abspath(backup_dir)
6147.1.1 by Jonathan Riddell
use .format() instead of % for string formatting where there are multiple formats in one string to allow for translations
477
            ui.ui_factory.note(gettext('making backup of {0}\n  to {1}').format(
6072.3.2 by Jelmer Vernooij
Use utf8 as encoding for urls passed to note().
478
                urlutils.unescape_for_display(old_path, 'utf-8'),
479
                urlutils.unescape_for_display(new_path, 'utf-8')))
5035.4.2 by Parth Malwankar
name_gen now works with all transports.
480
            self.root_transport.copy_tree('.bzr', backup_dir)
3943.2.4 by Martin Pool
Move backup progress indicators from upgrade.py into backup_bzrdir, and tweak text
481
            return (old_path, new_path)
482
        finally:
483
            pb.finished()
3872.3.1 by Jelmer Vernooij
Allow BzrDir implementation to implement backing up of control directory.
484
2830.1.2 by Ian Clatworthy
Incorporate feedback from poolie's review
485
    def retire_bzrdir(self, limit=10000):
2255.14.1 by Martin Pool
Add BzrDir.retire_bzrdir and partly fix subsume
486
        """Permanently disable the bzrdir.
487
488
        This is done by renaming it to give the user some ability to recover
489
        if there was a problem.
490
491
        This will have horrible consequences if anyone has anything locked or
492
        in use.
2830.1.2 by Ian Clatworthy
Incorporate feedback from poolie's review
493
        :param limit: number of times to retry
2255.14.1 by Martin Pool
Add BzrDir.retire_bzrdir and partly fix subsume
494
        """
2830.1.2 by Ian Clatworthy
Incorporate feedback from poolie's review
495
        i  = 0
496
        while True:
2255.14.1 by Martin Pool
Add BzrDir.retire_bzrdir and partly fix subsume
497
            try:
498
                to_path = '.bzr.retired.%d' % i
499
                self.root_transport.rename('.bzr', to_path)
6138.3.1 by Jonathan Riddell
use gettext() in more files
500
                note(gettext("renamed {0} to {1}").format(
501
                    self.root_transport.abspath('.bzr'), to_path))
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
502
                return
2255.14.1 by Martin Pool
Add BzrDir.retire_bzrdir and partly fix subsume
503
            except (errors.TransportError, IOError, errors.PathError):
2830.1.2 by Ian Clatworthy
Incorporate feedback from poolie's review
504
                i += 1
505
                if i > limit:
506
                    raise
507
                else:
508
                    pass
2255.14.1 by Martin Pool
Add BzrDir.retire_bzrdir and partly fix subsume
509
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
510
    def _find_containing(self, evaluate):
3242.2.13 by Aaron Bentley
Update docs
511
        """Find something in a containing control directory.
512
513
        This method will scan containing control dirs, until it finds what
514
        it is looking for, decides that it will never find it, or runs out
515
        of containing control directories to check.
516
517
        It is used to implement find_repository and
518
        determine_repository_policy.
519
520
        :param evaluate: A function returning (value, stop).  If stop is True,
521
            the value will be returned.
522
        """
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
523
        found_bzrdir = self
524
        while True:
525
            result, stop = evaluate(found_bzrdir)
526
            if stop:
527
                return result
528
            next_transport = found_bzrdir.root_transport.clone('..')
5158.6.9 by Martin Pool
Simplify various code to use user_url
529
            if (found_bzrdir.user_url == next_transport.base):
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
530
                # top of the file system
531
                return None
532
            # find the next containing bzrdir
533
            try:
6207.3.1 by jelmer at samba
use classmethods.
534
                found_bzrdir = self.open_containing_from_transport(
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
535
                    next_transport)[0]
536
            except errors.NotBranchError:
537
                return None
538
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
539
    def find_repository(self):
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
540
        """Find the repository that should be used.
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
541
542
        This does not require a branch as we use it to find the repo for
543
        new branches as well as to hook existing branches up to their
544
        repository.
545
        """
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
546
        def usable_repository(found_bzrdir):
1725.2.5 by Robert Collins
Bugfix create_branch_convenience at the root of a file system to not loop
547
            # does it have a repository ?
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
548
            try:
549
                repository = found_bzrdir.open_repository()
550
            except errors.NoRepositoryPresent:
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
551
                return None, False
5158.6.9 by Martin Pool
Simplify various code to use user_url
552
            if found_bzrdir.user_url == self.user_url:
3242.2.5 by Aaron Bentley
Avoid unnecessary is_shared check
553
                return repository, True
554
            elif repository.is_shared():
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
555
                return repository, True
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
556
            else:
3242.2.5 by Aaron Bentley
Avoid unnecessary is_shared check
557
                return None, True
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
558
559
        found_repo = self._find_containing(usable_repository)
560
        if found_repo is None:
561
            raise errors.NoRepositoryPresent(self)
562
        return found_repo
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
563
3416.2.1 by Martin Pool
Add BzrDir._get_file_mode and _get_dir_mode
564
    def _find_creation_modes(self):
565
        """Determine the appropriate modes for files and directories.
3641.2.1 by John Arbash Meinel
Fix bug #259855, if a Transport returns 0 for permission bits, ignore it
566
3416.2.1 by Martin Pool
Add BzrDir._get_file_mode and _get_dir_mode
567
        They're always set to be consistent with the base directory,
568
        assuming that this transport allows setting modes.
569
        """
570
        # TODO: Do we need or want an option (maybe a config setting) to turn
571
        # this off or override it for particular locations? -- mbp 20080512
572
        if self._mode_check_done:
573
            return
574
        self._mode_check_done = True
575
        try:
576
            st = self.transport.stat('.')
577
        except errors.TransportNotPossible:
578
            self._dir_mode = None
579
            self._file_mode = None
580
        else:
581
            # Check the directory mode, but also make sure the created
582
            # directories and files are read-write for this user. This is
583
            # mostly a workaround for filesystems which lie about being able to
584
            # write to a directory (cygwin & win32)
3641.2.1 by John Arbash Meinel
Fix bug #259855, if a Transport returns 0 for permission bits, ignore it
585
            if (st.st_mode & 07777 == 00000):
586
                # FTP allows stat but does not return dir/file modes
587
                self._dir_mode = None
588
                self._file_mode = None
589
            else:
590
                self._dir_mode = (st.st_mode & 07777) | 00700
591
                # Remove the sticky and execute bits for files
592
                self._file_mode = self._dir_mode & ~07111
3416.2.1 by Martin Pool
Add BzrDir._get_file_mode and _get_dir_mode
593
594
    def _get_file_mode(self):
595
        """Return Unix mode for newly created files, or None.
596
        """
597
        if not self._mode_check_done:
598
            self._find_creation_modes()
599
        return self._file_mode
600
601
    def _get_dir_mode(self):
602
        """Return Unix mode for newly created directories, or None.
603
        """
604
        if not self._mode_check_done:
605
            self._find_creation_modes()
606
        return self._dir_mode
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
607
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
608
    def get_config(self):
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
609
        """Get configuration for this BzrDir."""
610
        return config.BzrDirConfig(self)
611
612
    def _get_config(self):
613
        """By default, no configuration is available."""
614
        return None
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
615
1534.4.39 by Robert Collins
Basic BzrDir support.
616
    def __init__(self, _transport, _format):
617
        """Initialize a Bzr control dir object.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
618
1534.4.39 by Robert Collins
Basic BzrDir support.
619
        Only really common logic should reside here, concrete classes should be
620
        made with varying behaviours.
621
1534.4.53 by Robert Collins
Review feedback from John Meinel.
622
        :param _format: the format that is creating this BzrDir instance.
623
        :param _transport: the transport this dir is based at.
1534.4.39 by Robert Collins
Basic BzrDir support.
624
        """
625
        self._format = _format
5158.6.1 by Martin Pool
Add ControlComponent interface and make BzrDir implement it
626
        # these are also under the more standard names of 
627
        # control_transport and user_transport
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
628
        self.transport = _transport.clone('.bzr')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
629
        self.root_transport = _transport
3416.2.1 by Martin Pool
Add BzrDir._get_file_mode and _get_dir_mode
630
        self._mode_check_done = False
5363.2.2 by Jelmer Vernooij
Rename per_bzrdir => per_controldir.
631
5158.6.1 by Martin Pool
Add ControlComponent interface and make BzrDir implement it
632
    @property 
633
    def user_transport(self):
634
        return self.root_transport
5363.2.2 by Jelmer Vernooij
Rename per_bzrdir => per_controldir.
635
5158.6.1 by Martin Pool
Add ControlComponent interface and make BzrDir implement it
636
    @property
637
    def control_transport(self):
638
        return self.transport
1534.4.39 by Robert Collins
Basic BzrDir support.
639
1713.1.9 by Robert Collins
Paired performance tuning of bzr add. (Robert Collins, Martin Pool).
640
    def is_control_filename(self, filename):
641
        """True if filename is the name of a path which is reserved for bzrdir's.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
642
1713.1.9 by Robert Collins
Paired performance tuning of bzr add. (Robert Collins, Martin Pool).
643
        :param filename: A filename within the root transport of this bzrdir.
644
645
        This is true IF and ONLY IF the filename is part of the namespace reserved
646
        for bzr control dirs. Currently this is the '.bzr' directory in the root
5363.2.2 by Jelmer Vernooij
Rename per_bzrdir => per_controldir.
647
        of the root_transport. 
1713.1.9 by Robert Collins
Paired performance tuning of bzr add. (Robert Collins, Martin Pool).
648
        """
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
649
        # this might be better on the BzrDirFormat class because it refers to
650
        # all the possible bzrdir disk formats.
651
        # This method is tested via the workingtree is_control_filename tests-
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
652
        # it was extracted from WorkingTree.is_control_filename. If the method's
653
        # contract is extended beyond the current trivial implementation, please
1713.1.9 by Robert Collins
Paired performance tuning of bzr add. (Robert Collins, Martin Pool).
654
        # add new tests for it to the appropriate place.
655
        return filename == '.bzr' or filename.startswith('.bzr/')
656
2018.5.96 by Andrew Bennetts
Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's
657
    def _cloning_metadir(self):
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
658
        """Produce a metadir suitable for cloning with.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
659
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
660
        :returns: (destination_bzrdir_format, source_repository)
661
        """
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
662
        result_format = self._format.__class__()
663
        try:
1910.2.41 by Aaron Bentley
Clean up clone format creation
664
            try:
4160.2.6 by Andrew Bennetts
Add ignore_fallbacks flag.
665
                branch = self.open_branch(ignore_fallbacks=True)
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
666
                source_repository = branch.repository
3650.2.5 by Aaron Bentley
Stop creating a new instance
667
                result_format._branch_format = branch._format
1910.2.41 by Aaron Bentley
Clean up clone format creation
668
            except errors.NotBranchError:
669
                source_branch = None
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
670
                source_repository = self.open_repository()
2305.3.1 by Andrew Bennetts
Tidy up BzrDir.cloning_metadir: bogus try/except, and basis argument isn't actually used.
671
        except errors.NoRepositoryPresent:
2100.3.24 by Aaron Bentley
Get all tests passing again
672
            source_repository = None
2305.3.1 by Andrew Bennetts
Tidy up BzrDir.cloning_metadir: bogus try/except, and basis argument isn't actually used.
673
        else:
2018.5.138 by Robert Collins
Merge bzr.dev.
674
            # XXX TODO: This isinstance is here because we have not implemented
675
            # the fix recommended in bug # 103195 - to delegate this choice the
676
            # repository itself.
2018.5.94 by Andrew Bennetts
Various small changes in aid of making tests pass (including deleting one invalid test).
677
            repo_format = source_repository._format
3705.2.1 by Andrew Bennetts
Possible fix for bug 269214
678
            if isinstance(repo_format, remote.RemoteRepositoryFormat):
679
                source_repository._ensure_real()
680
                repo_format = source_repository._real_repository._format
681
            result_format.repository_format = repo_format
2100.3.28 by Aaron Bentley
Make sprout recursive
682
        try:
2323.5.19 by Martin Pool
No upgrade recommendation on source when cloning
683
            # TODO: Couldn't we just probe for the format in these cases,
684
            # rather than opening the whole tree?  It would be a little
685
            # faster. mbp 20070401
686
            tree = self.open_workingtree(recommend_upgrade=False)
2100.3.28 by Aaron Bentley
Make sprout recursive
687
        except (errors.NoWorkingTree, errors.NotLocalUrl):
688
            result_format.workingtree_format = None
689
        else:
690
            result_format.workingtree_format = tree._format.__class__()
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
691
        return result_format, source_repository
692
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
693
    def cloning_metadir(self, require_stacking=False):
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
694
        """Produce a metadir suitable for cloning or sprouting with.
1910.2.41 by Aaron Bentley
Clean up clone format creation
695
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
696
        These operations may produce workingtrees (yes, even though they're
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
697
        "cloning" something that doesn't have a tree), so a viable workingtree
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
698
        format must be selected.
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
699
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
700
        :require_stacking: If True, non-stackable formats will be upgraded
701
            to similar stackable formats.
6207.3.1 by jelmer at samba
use classmethods.
702
        :returns: a ControlDirFormat with all component formats either set
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
703
            appropriately or set to None if that component should not be
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
704
            created.
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
705
        """
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
706
        format, repository = self._cloning_metadir()
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
707
        if format._workingtree_format is None:
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
708
            # No tree in self.
2100.3.34 by Aaron Bentley
Fix BzrDir.cloning_metadir with no format
709
            if repository is None:
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
710
                # No repository either
2100.3.34 by Aaron Bentley
Fix BzrDir.cloning_metadir with no format
711
                return format
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
712
            # We have a repository, so set a working tree? (Why? This seems to
713
            # contradict the stated return value in the docstring).
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
714
            tree_format = repository._format._matchingbzrdir.workingtree_format
2100.3.28 by Aaron Bentley
Make sprout recursive
715
            format.workingtree_format = tree_format.__class__()
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
716
        if require_stacking:
717
            format.require_stacking()
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
718
        return format
719
5699.4.1 by Jelmer Vernooij
Move get_branch_transport, .get_workingtree_transport and .get_repository_transport
720
    def get_branch_transport(self, branch_format, name=None):
5699.4.5 by Jelmer Vernooij
Refer to BzrDir, not ControlDir in docstrings.
721
        """Get the transport for use by branch format in this BzrDir.
5699.4.1 by Jelmer Vernooij
Move get_branch_transport, .get_workingtree_transport and .get_repository_transport
722
723
        Note that bzr dirs that do not support format strings will raise
724
        IncompatibleFormat if the branch format they are given has
725
        a format string, and vice versa.
726
727
        If branch_format is None, the transport is returned with no
728
        checking. If it is not None, then the returned transport is
729
        guaranteed to point to an existing directory ready for use.
730
        """
731
        raise NotImplementedError(self.get_branch_transport)
732
733
    def get_repository_transport(self, repository_format):
5699.4.5 by Jelmer Vernooij
Refer to BzrDir, not ControlDir in docstrings.
734
        """Get the transport for use by repository format in this BzrDir.
5699.4.1 by Jelmer Vernooij
Move get_branch_transport, .get_workingtree_transport and .get_repository_transport
735
736
        Note that bzr dirs that do not support format strings will raise
737
        IncompatibleFormat if the repository format they are given has
738
        a format string, and vice versa.
739
740
        If repository_format is None, the transport is returned with no
741
        checking. If it is not None, then the returned transport is
742
        guaranteed to point to an existing directory ready for use.
743
        """
744
        raise NotImplementedError(self.get_repository_transport)
745
746
    def get_workingtree_transport(self, tree_format):
5699.4.5 by Jelmer Vernooij
Refer to BzrDir, not ControlDir in docstrings.
747
        """Get the transport for use by workingtree format in this BzrDir.
5699.4.1 by Jelmer Vernooij
Move get_branch_transport, .get_workingtree_transport and .get_repository_transport
748
749
        Note that bzr dirs that do not support format strings will raise
750
        IncompatibleFormat if the workingtree format they are given has a
751
        format string, and vice versa.
752
753
        If workingtree_format is None, the transport is returned with no
754
        checking. If it is not None, then the returned transport is
755
        guaranteed to point to an existing directory ready for use.
756
        """
757
        raise NotImplementedError(self.get_workingtree_transport)
758
6207.3.2 by jelmer at samba
Move convenience methods to ControlDir.
759
    @classmethod
760
    def create(cls, base, format=None, possible_transports=None):
761
        """Create a new BzrDir at the url 'base'.
762
763
        :param format: If supplied, the format of branch to create.  If not
764
            supplied, the default is used.
765
        :param possible_transports: If supplied, a list of transports that
766
            can be reused to share a remote connection.
767
        """
768
        if cls is not BzrDir:
6207.3.3 by jelmer at samba
Fix tests and the like.
769
            raise AssertionError("BzrDir.create always creates the "
6207.3.2 by jelmer at samba
Move convenience methods to ControlDir.
770
                "default format, not one of %r" % cls)
771
        return controldir.ControlDir.create(base, format=format,
772
                possible_transports=possible_transports)
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
773
774
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
775
class BzrDirMeta1(BzrDir):
776
    """A .bzr meta version 1 control object.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
777
778
    This is the first control object where the
1553.5.67 by Martin Pool
doc
779
    individual aspects are really split out: there are separate repository,
780
    workingtree and branch subdirectories and any subset of the three can be
781
    present within a BzrDir.
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
782
    """
783
1534.5.16 by Robert Collins
Review feedback.
784
    def can_convert_format(self):
785
        """See BzrDir.can_convert_format()."""
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
786
        return True
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
787
6123.9.12 by Jelmer Vernooij
Add append_revisions_only argument to BranchFormat.initialize.
788
    def create_branch(self, name=None, repository=None,
789
            append_revisions_only=None):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
790
        """See BzrDir.create_branch."""
5536.1.1 by Andrew Bennetts
Avoid reopening (and relocking) the same branches/repositories in ControlDir.sprout. Still a few rough edges, but the tests I've run are passing.
791
        return self._format.get_branch_format().initialize(self, name=name,
6123.9.12 by Jelmer Vernooij
Add append_revisions_only argument to BranchFormat.initialize.
792
                repository=repository,
793
                append_revisions_only=append_revisions_only)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
794
5051.3.1 by Jelmer Vernooij
Add optional name argument to BzrDir.destroy_branch.
795
    def destroy_branch(self, name=None):
2796.2.6 by Aaron Bentley
Implement destroy_branch
796
        """See BzrDir.create_branch."""
6083.2.8 by Jelmer Vernooij
Write/read branch list.
797
        if name is not None:
6083.2.10 by Jelmer Vernooij
Move more to colo class.
798
            raise errors.NoColocatedBranchSupport(self)
799
        self.transport.delete_tree('branch')
2796.2.6 by Aaron Bentley
Implement destroy_branch
800
1534.6.1 by Robert Collins
allow API creation of shared repositories
801
    def create_repository(self, shared=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
802
        """See BzrDir.create_repository."""
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
803
        return self._format.repository_format.initialize(self, shared)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
804
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
805
    def destroy_repository(self):
806
        """See BzrDir.destroy_repository."""
807
        self.transport.delete_tree('repository')
808
3123.5.2 by Aaron Bentley
Allow checkout --files_from
809
    def create_workingtree(self, revision_id=None, from_branch=None,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
810
                           accelerator_tree=None, hardlink=False):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
811
        """See BzrDir.create_workingtree."""
2955.5.3 by Vincent Ladeuil
Fix second unwanted connection by providing the right branch to create_checkout.
812
        return self._format.workingtree_format.initialize(
3123.5.2 by Aaron Bentley
Allow checkout --files_from
813
            self, revision_id, from_branch=from_branch,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
814
            accelerator_tree=accelerator_tree, hardlink=hardlink)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
815
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
816
    def destroy_workingtree(self):
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
817
        """See BzrDir.destroy_workingtree."""
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
818
        wt = self.open_workingtree(recommend_upgrade=False)
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
819
        repository = wt.branch.repository
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
820
        empty = repository.revision_tree(_mod_revision.NULL_REVISION)
5409.1.7 by Vincent Ladeuil
First orphaning implementation (some tests lacking).
821
        # We ignore the conflicts returned by wt.revert since we're about to
822
        # delete the wt metadata anyway, all that should be left here are
5409.7.3 by Vincent Ladeuil
Orphan unversioned files to avoid 'missing parent' conflicts
823
        # detritus. But see bug #634470 about subtree .bzr dirs.
5409.1.7 by Vincent Ladeuil
First orphaning implementation (some tests lacking).
824
        conflicts = wt.revert(old_tree=empty)
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
825
        self.destroy_workingtree_metadata()
826
827
    def destroy_workingtree_metadata(self):
828
        self.transport.delete_tree('checkout')
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
829
5147.4.1 by Jelmer Vernooij
Pass branch names in more places.
830
    def find_branch_format(self, name=None):
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
831
        """Find the branch 'format' for this bzrdir.
832
833
        This might be a synthetic object for e.g. RemoteBranch and SVN.
834
        """
835
        from bzrlib.branch import BranchFormat
5147.4.3 by Jelmer Vernooij
Support branch name argument to BzrDir.get_branch_reference.
836
        return BranchFormat.find_format(self, name=name)
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
837
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
838
    def _get_mkdir_mode(self):
839
        """Figure out the mode to use when creating a bzrdir subdir."""
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
840
        temp_control = lockable_files.LockableFiles(self.transport, '',
841
                                     lockable_files.TransportLock)
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
842
        return temp_control._dir_mode
843
5147.4.3 by Jelmer Vernooij
Support branch name argument to BzrDir.get_branch_reference.
844
    def get_branch_reference(self, name=None):
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
845
        """See BzrDir.get_branch_reference()."""
4734.4.7 by Andrew Bennetts
Defer checking for a repository in NotBranchError case until we format the error as a string. (test_smart currently fails)
846
        from bzrlib.branch import BranchFormat
5147.4.3 by Jelmer Vernooij
Support branch name argument to BzrDir.get_branch_reference.
847
        format = BranchFormat.find_format(self, name=name)
848
        return format.get_reference(self, name=name)
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
849
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
850
    def get_branch_transport(self, branch_format, name=None):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
851
        """See BzrDir.get_branch_transport()."""
6083.2.11 by Jelmer Vernooij
Add development-colo format.
852
        if name is not None:
853
            raise errors.NoColocatedBranchSupport(self)
4570.3.6 by Martin Pool
doc
854
        # XXX: this shouldn't implicitly create the directory if it's just
855
        # promising to get a transport -- mbp 20090727
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
856
        if branch_format is None:
6083.2.11 by Jelmer Vernooij
Add development-colo format.
857
            return self.transport.clone('branch')
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
858
        try:
859
            branch_format.get_format_string()
860
        except NotImplementedError:
861
            raise errors.IncompatibleFormat(branch_format, self._format)
6083.2.5 by Jelmer Vernooij
Fix colocated branch handling.
862
        try:
6083.2.11 by Jelmer Vernooij
Add development-colo format.
863
            self.transport.mkdir('branch', mode=self._get_mkdir_mode())
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
864
        except errors.FileExists:
865
            pass
6083.2.11 by Jelmer Vernooij
Add development-colo format.
866
        return self.transport.clone('branch')
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
867
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
868
    def get_repository_transport(self, repository_format):
869
        """See BzrDir.get_repository_transport()."""
870
        if repository_format is None:
871
            return self.transport.clone('repository')
872
        try:
873
            repository_format.get_format_string()
874
        except NotImplementedError:
875
            raise errors.IncompatibleFormat(repository_format, self._format)
876
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
877
            self.transport.mkdir('repository', mode=self._get_mkdir_mode())
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
878
        except errors.FileExists:
879
            pass
880
        return self.transport.clone('repository')
881
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
882
    def get_workingtree_transport(self, workingtree_format):
883
        """See BzrDir.get_workingtree_transport()."""
884
        if workingtree_format is None:
885
            return self.transport.clone('checkout')
886
        try:
887
            workingtree_format.get_format_string()
888
        except NotImplementedError:
889
            raise errors.IncompatibleFormat(workingtree_format, self._format)
890
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
891
            self.transport.mkdir('checkout', mode=self._get_mkdir_mode())
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
892
        except errors.FileExists:
893
            pass
894
        return self.transport.clone('checkout')
895
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
896
    def has_workingtree(self):
897
        """Tell if this bzrdir contains a working tree.
898
899
        Note: if you're going to open the working tree, you should just go
900
        ahead and try, and not ask permission first.
901
        """
902
        from bzrlib.workingtree import WorkingTreeFormat
903
        try:
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
904
            WorkingTreeFormat.find_format_string(self)
4634.47.5 by Andrew Bennetts
Add tests, and fix BzrDirMeta1.has_workingtree which was failing if the local transport is decorated with a ChrootTransport or similar.
905
        except errors.NoWorkingTree:
906
            return False
907
        return True
908
5670.1.1 by Jelmer Vernooij
Remove all methods and arguments that were deprecated before bzr 2.0.0.
909
    def needs_format_conversion(self, format):
1534.5.16 by Robert Collins
Review feedback.
910
        """See BzrDir.needs_format_conversion()."""
6207.1.1 by Jelmer Vernooij
Support upgrading between 2a and development-colo.
911
        if (not isinstance(self._format, format.__class__) or
912
            self._format.get_format_string() != format.get_format_string()):
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
913
            # it is not a meta dir format, conversion is needed.
914
            return True
915
        # we might want to push this down to the repository?
916
        try:
917
            if not isinstance(self.open_repository()._format,
918
                              format.repository_format.__class__):
919
                # the repository needs an upgrade.
920
                return True
921
        except errors.NoRepositoryPresent:
922
            pass
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
923
        for branch in self.list_branches():
924
            if not isinstance(branch._format,
2230.3.55 by Aaron Bentley
Updates from review
925
                              format.get_branch_format().__class__):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
926
                # the branch needs an upgrade.
927
                return True
928
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
929
            my_wt = self.open_workingtree(recommend_upgrade=False)
930
            if not isinstance(my_wt._format,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
931
                              format.workingtree_format.__class__):
932
                # the workingtree needs an upgrade.
933
                return True
2255.2.196 by Robert Collins
Fix test_upgrade defects related to non local or absent working trees.
934
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
935
            pass
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
936
        return False
937
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
938
    def open_branch(self, name=None, unsupported=False,
939
                    ignore_fallbacks=False):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
940
        """See BzrDir.open_branch."""
5147.4.3 by Jelmer Vernooij
Support branch name argument to BzrDir.get_branch_reference.
941
        format = self.find_branch_format(name=name)
5717.1.7 by Jelmer Vernooij
Rename check_status -> check_support_status.
942
        format.check_support_status(unsupported)
5051.3.13 by Jelmer Vernooij
Pass colocated branch name around rather than raising an exception directly.
943
        return format.open(self, name=name,
944
            _found=True, ignore_fallbacks=ignore_fallbacks)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
945
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
946
    def open_repository(self, unsupported=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
947
        """See BzrDir.open_repository."""
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
948
        from bzrlib.repository import RepositoryFormat
949
        format = RepositoryFormat.find_format(self)
5717.1.7 by Jelmer Vernooij
Rename check_status -> check_support_status.
950
        format.check_support_status(unsupported)
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
951
        return format.open(self, _found=True)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
952
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
953
    def open_workingtree(self, unsupported=False,
954
            recommend_upgrade=True):
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
955
        """See BzrDir.open_workingtree."""
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
956
        from bzrlib.workingtree import WorkingTreeFormat
957
        format = WorkingTreeFormat.find_format(self)
5717.1.7 by Jelmer Vernooij
Rename check_status -> check_support_status.
958
        format.check_support_status(unsupported, recommend_upgrade,
2323.6.5 by Martin Pool
Recommended-upgrade message should give base dir not the control dir url
959
            basedir=self.root_transport.base)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
960
        return format.open(self, _found=True)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
961
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
962
    def _get_config(self):
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
963
        return config.TransportConfig(self.transport, 'control.conf')
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
964
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
965
6083.2.9 by Jelmer Vernooij
Add development-colo as a separate format.
966
class BzrDirMeta1Colo(BzrDirMeta1):
967
    """BzrDirMeta1 with support for colocated branches.
968
6083.2.13 by Jelmer Vernooij
Fix metadircolo initialization.
969
    This format is experimental, and will eventually be merged back into
970
    BzrDirMeta1.
6083.2.9 by Jelmer Vernooij
Add development-colo as a separate format.
971
    """
972
6083.2.13 by Jelmer Vernooij
Fix metadircolo initialization.
973
    def __init__(self, _transport, _format):
974
        super(BzrDirMeta1Colo, self).__init__(_transport, _format)
975
        self.control_files = lockable_files.LockableFiles(_transport,
976
            self._format._lock_file_name, self._format._lock_class)
977
6083.2.9 by Jelmer Vernooij
Add development-colo as a separate format.
978
    def _get_branch_path(self, name):
979
        """Obtain the branch path to use.
980
981
        This uses the API specified branch name first, and then falls back to
982
        the branch name specified in the URL. If neither of those is specified,
983
        it uses the default branch.
984
985
        :param name: Optional branch name to use
986
        :return: Relative path to branch, branch name
987
        """
988
        if name is None:
989
            name = self._get_selected_branch()
990
        if name is None:
991
            return 'branch', None
992
        return urlutils.join('branches', name), name
993
994
    def _read_branch_list(self):
995
        """Read the branch list.
996
997
        :return: List of utf-8 encoded branch names.
998
        """
999
        try:
1000
            f = self.control_transport.get('branch-list')
1001
        except errors.NoSuchFile:
1002
            return []
1003
1004
        ret = []
1005
        try:
1006
            for name in f:
1007
                ret.append(name.rstrip("\n"))
1008
        finally:
1009
            f.close()
1010
        return ret
1011
1012
    def _write_branch_list(self, branches):
1013
        """Write out the branch list.
1014
1015
        :param branches: List of utf-8 branch names to write
1016
        """
1017
        self.transport.put_bytes('branch-list',
1018
            "".join([name+"\n" for name in branches]))
1019
6083.2.10 by Jelmer Vernooij
Move more to colo class.
1020
    def destroy_branch(self, name=None):
1021
        """See BzrDir.create_branch."""
1022
        path, name = self._get_branch_path(name)
1023
        if name is not None:
1024
            self.control_files.lock_write()
1025
            try:
1026
                branches = self._read_branch_list()
1027
                try:
1028
                    branches.remove(name)
1029
                except ValueError:
1030
                    raise errors.NotBranchError(name)
1031
                self._write_branch_list(name)
1032
            finally:
1033
                self.control_files.unlock()
1034
        self.transport.delete_tree(path)
1035
1036
    def list_branches(self):
1037
        """See ControlDir.list_branches."""
1038
        ret = []
1039
        # Default branch
1040
        try:
1041
            ret.append(self.open_branch())
1042
        except (errors.NotBranchError, errors.NoRepositoryPresent):
1043
            pass
1044
1045
        # colocated branches
1046
        ret.extend([self.open_branch(name) for name in
1047
                    self._read_branch_list()])
1048
1049
        return ret
1050
1051
    def get_branch_transport(self, branch_format, name=None):
1052
        """See BzrDir.get_branch_transport()."""
1053
        path, name = self._get_branch_path(name)
1054
        # XXX: this shouldn't implicitly create the directory if it's just
1055
        # promising to get a transport -- mbp 20090727
1056
        if branch_format is None:
1057
            return self.transport.clone(path)
1058
        try:
1059
            branch_format.get_format_string()
1060
        except NotImplementedError:
1061
            raise errors.IncompatibleFormat(branch_format, self._format)
1062
        if name is not None:
1063
            try:
1064
                self.transport.mkdir('branches', mode=self._get_mkdir_mode())
1065
            except errors.FileExists:
1066
                pass
1067
            branches = self._read_branch_list()
1068
            if not name in branches:
1069
                self.control_files.lock_write()
1070
                try:
1071
                    branches = self._read_branch_list()
1072
                    branches.append(name)
1073
                    self._write_branch_list(branches)
1074
                finally:
1075
                    self.control_files.unlock()
1076
        try:
1077
            self.transport.mkdir(path, mode=self._get_mkdir_mode())
1078
        except errors.FileExists:
1079
            pass
1080
        return self.transport.clone(path)
6083.2.9 by Jelmer Vernooij
Add development-colo as a separate format.
1081
1082
5363.2.20 by Jelmer Vernooij
use controldir.X
1083
class BzrProber(controldir.Prober):
5363.2.8 by Jelmer Vernooij
Docstrings.
1084
    """Prober for formats that use a .bzr/ control directory."""
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1085
5712.3.8 by Jelmer Vernooij
Support lazy registration of BzrDir formats.
1086
    formats = registry.FormatRegistry(controldir.network_format_registry)
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1087
    """The known .bzr formats."""
1088
1089
    @classmethod
5712.3.1 by Jelmer Vernooij
Use registry for BzrProber.formats.
1090
    @deprecated_method(deprecated_in((2, 4, 0)))
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1091
    def register_bzrdir_format(klass, format):
5712.3.8 by Jelmer Vernooij
Support lazy registration of BzrDir formats.
1092
        klass.formats.register(format.get_format_string(), format)
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1093
1094
    @classmethod
5712.3.1 by Jelmer Vernooij
Use registry for BzrProber.formats.
1095
    @deprecated_method(deprecated_in((2, 4, 0)))
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
1096
    def unregister_bzrdir_format(klass, format):
5712.3.8 by Jelmer Vernooij
Support lazy registration of BzrDir formats.
1097
        klass.formats.remove(format.get_format_string())
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1098
5363.2.7 by Jelmer Vernooij
Fix tests.
1099
    @classmethod
1100
    def probe_transport(klass, transport):
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1101
        """Return the .bzrdir style format present in a directory."""
1102
        try:
1103
            format_string = transport.get_bytes(".bzr/branch-format")
1104
        except errors.NoSuchFile:
1105
            raise errors.NotBranchError(path=transport.base)
1106
        try:
5712.3.1 by Jelmer Vernooij
Use registry for BzrProber.formats.
1107
            return klass.formats.get(format_string)
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1108
        except KeyError:
1109
            raise errors.UnknownFormatError(format=format_string, kind='bzrdir')
1110
5712.3.15 by Jelmer Vernooij
Remove unused register format functions.
1111
    @classmethod
1112
    def known_formats(cls):
5712.3.13 by Jelmer Vernooij
Add Prober.known_formats().
1113
        result = set()
5712.3.15 by Jelmer Vernooij
Remove unused register format functions.
1114
        for name, format in cls.formats.iteritems():
5712.4.9 by Jelmer Vernooij
Fix lazy control directory discovery.
1115
            if callable(format):
1116
                format = format()
5712.3.13 by Jelmer Vernooij
Add Prober.known_formats().
1117
            result.add(format)
1118
        return result
1119
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1120
5363.2.20 by Jelmer Vernooij
use controldir.X
1121
controldir.ControlDirFormat.register_prober(BzrProber)
1122
1123
1124
class RemoteBzrProber(controldir.Prober):
5363.2.8 by Jelmer Vernooij
Docstrings.
1125
    """Prober for remote servers that provide a Bazaar smart server."""
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1126
1127
    @classmethod
1128
    def probe_transport(klass, transport):
1129
        """Return a RemoteBzrDirFormat object if it looks possible."""
1130
        try:
1131
            medium = transport.get_smart_medium()
1132
        except (NotImplementedError, AttributeError,
1133
                errors.TransportNotPossible, errors.NoSmartMedium,
1134
                errors.SmartProtocolError):
1135
            # no smart server, so not a branch for this format type.
1136
            raise errors.NotBranchError(path=transport.base)
1137
        else:
1138
            # Decline to open it if the server doesn't support our required
1139
            # version (3) so that the VFS-based transport will do it.
1140
            if medium.should_probe():
1141
                try:
1142
                    server_version = medium.protocol_version()
1143
                except errors.SmartProtocolError:
1144
                    # Apparently there's no usable smart server there, even though
1145
                    # the medium supports the smart protocol.
1146
                    raise errors.NotBranchError(path=transport.base)
1147
                if server_version != '2':
1148
                    raise errors.NotBranchError(path=transport.base)
5712.3.13 by Jelmer Vernooij
Add Prober.known_formats().
1149
            from bzrlib.remote import RemoteBzrDirFormat
5363.2.7 by Jelmer Vernooij
Fix tests.
1150
            return RemoteBzrDirFormat()
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1151
5712.3.15 by Jelmer Vernooij
Remove unused register format functions.
1152
    @classmethod
1153
    def known_formats(cls):
5712.3.13 by Jelmer Vernooij
Add Prober.known_formats().
1154
        from bzrlib.remote import RemoteBzrDirFormat
1155
        return set([RemoteBzrDirFormat()])
1156
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1157
5363.2.20 by Jelmer Vernooij
use controldir.X
1158
class BzrDirFormat(controldir.ControlDirFormat):
5363.2.3 by Jelmer Vernooij
Add ControlDirFormat.
1159
    """ControlDirFormat base class for .bzr/ directories.
1534.4.39 by Robert Collins
Basic BzrDir support.
1160
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1161
    Formats are placed in a dict by their format string for reference
1534.4.39 by Robert Collins
Basic BzrDir support.
1162
    during bzrdir opening. These should be subclasses of BzrDirFormat
1163
    for consistency.
1164
1165
    Once a format is deprecated, just deprecate the initialize and open
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1166
    methods on the format class. Do not deprecate the object, as the
1534.4.39 by Robert Collins
Basic BzrDir support.
1167
    object will be created every system load.
2018.5.169 by Andrew Bennetts
Add a _server_formats flag to BzrDir.open_from_transport and BzrDirFormat.find_format, make RemoteBranch.control_files into a property.
1168
    """
1169
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1170
    _lock_file_name = 'branch-lock'
1171
1172
    # _lock_class must be set in subclasses to the lock type, typ.
1173
    # TransportLock or LockDir
1174
5712.3.15 by Jelmer Vernooij
Remove unused register format functions.
1175
    @classmethod
1176
    def get_format_string(cls):
1534.4.39 by Robert Collins
Basic BzrDir support.
1177
        """Return the ASCII format string that identifies this format."""
5904.1.2 by Martin Pool
Various pyflakes import fixes.
1178
        raise NotImplementedError(cls.get_format_string)
1534.4.39 by Robert Collins
Basic BzrDir support.
1179
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1180
    def initialize_on_transport(self, transport):
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1181
        """Initialize a new bzrdir in the base directory of a Transport."""
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
1182
        try:
1183
            # can we hand off the request to the smart server rather than using
1184
            # vfs calls?
1185
            client_medium = transport.get_smart_medium()
1186
        except errors.NoSmartMedium:
1187
            return self._initialize_on_transport_vfs(transport)
1188
        else:
1189
            # Current RPC's only know how to create bzr metadir1 instances, so
1190
            # we still delegate to vfs methods if the requested format is not a
1191
            # metadir1
1192
            if type(self) != BzrDirMetaFormat1:
1193
                return self._initialize_on_transport_vfs(transport)
5712.3.13 by Jelmer Vernooij
Add Prober.known_formats().
1194
            from bzrlib.remote import RemoteBzrDirFormat
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
1195
            remote_format = RemoteBzrDirFormat()
1196
            self._supply_sub_formats_to(remote_format)
1197
            return remote_format.initialize_on_transport(transport)
1198
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1199
    def initialize_on_transport_ex(self, transport, use_existing_dir=False,
1200
        create_prefix=False, force_new_repo=False, stacked_on=None,
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
1201
        stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
1202
        shared_repo=False, vfs_only=False):
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1203
        """Create this format on transport.
1204
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
1205
        The directory to initialize will be created.
1206
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1207
        :param force_new_repo: Do not use a shared repository for the target,
1208
                               even if one is available.
1209
        :param create_prefix: Create any missing directories leading up to
1210
            to_transport.
1211
        :param use_existing_dir: Use an existing directory if one exists.
1212
        :param stacked_on: A url to stack any created branch on, None to follow
1213
            any target stacking policy.
1214
        :param stack_on_pwd: If stack_on is relative, the location it is
1215
            relative to.
1216
        :param repo_format_name: If non-None, a repository will be
1217
            made-or-found. Should none be found, or if force_new_repo is True
1218
            the repo_format_name is used to select the format of repository to
1219
            create.
1220
        :param make_working_trees: Control the setting of make_working_trees
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
1221
            for a new shared repository when one is made. None to use whatever
1222
            default the format has.
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1223
        :param shared_repo: Control whether made repositories are shared or
1224
            not.
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
1225
        :param vfs_only: If True do not attempt to use a smart server
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
1226
        :return: repo, bzrdir, require_stacking, repository_policy. repo is
1227
            None if none was created or found, bzrdir is always valid.
1228
            require_stacking is the result of examining the stacked_on
1229
            parameter and any stacking policy found for the target.
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1230
        """
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
1231
        if not vfs_only:
1232
            # Try to hand off to a smart server 
1233
            try:
1234
                client_medium = transport.get_smart_medium()
1235
            except errors.NoSmartMedium:
1236
                pass
1237
            else:
5712.3.15 by Jelmer Vernooij
Remove unused register format functions.
1238
                from bzrlib.remote import RemoteBzrDirFormat
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
1239
                # TODO: lookup the local format from a server hint.
1240
                remote_dir_format = RemoteBzrDirFormat()
1241
                remote_dir_format._network_name = self.network_name()
1242
                self._supply_sub_formats_to(remote_dir_format)
1243
                return remote_dir_format.initialize_on_transport_ex(transport,
1244
                    use_existing_dir=use_existing_dir, create_prefix=create_prefix,
1245
                    force_new_repo=force_new_repo, stacked_on=stacked_on,
1246
                    stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
1247
                    make_working_trees=make_working_trees, shared_repo=shared_repo)
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1248
        # XXX: Refactor the create_prefix/no_create_prefix code into a
1249
        #      common helper function
1250
        # The destination may not exist - if so make it according to policy.
1251
        def make_directory(transport):
1252
            transport.mkdir('.')
1253
            return transport
1254
        def redirected(transport, e, redirection_notice):
1255
            note(redirection_notice)
1256
            return transport._redirected_to(e.source, e.target)
1257
        try:
1258
            transport = do_catching_redirections(make_directory, transport,
1259
                redirected)
1260
        except errors.FileExists:
1261
            if not use_existing_dir:
1262
                raise
1263
        except errors.NoSuchFile:
1264
            if not create_prefix:
1265
                raise
1266
            transport.create_prefix()
1267
1268
        require_stacking = (stacked_on is not None)
1269
        # Now the target directory exists, but doesn't have a .bzr
1270
        # directory. So we need to create it, along with any work to create
1271
        # all of the dependent branches, etc.
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
1272
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1273
        result = self.initialize_on_transport(transport)
1274
        if repo_format_name:
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
1275
            try:
1276
                # use a custom format
1277
                result._format.repository_format = \
1278
                    repository.network_format_registry.get(repo_format_name)
1279
            except AttributeError:
1280
                # The format didn't permit it to be set.
1281
                pass
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1282
            # A repository is desired, either in-place or shared.
1283
            repository_policy = result.determine_repository_policy(
1284
                force_new_repo, stacked_on, stack_on_pwd,
1285
                require_stacking=require_stacking)
1286
            result_repo, is_new_repo = repository_policy.acquire_repository(
1287
                make_working_trees, shared_repo)
1288
            if not require_stacking and repository_policy._require_stacking:
1289
                require_stacking = True
1290
                result._format.require_stacking()
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
1291
            result_repo.lock_write()
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1292
        else:
1293
            result_repo = None
1294
            repository_policy = None
1295
        return result_repo, result, require_stacking, repository_policy
1296
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
1297
    def _initialize_on_transport_vfs(self, transport):
1298
        """Initialize a new bzrdir using VFS calls.
4032.1.2 by John Arbash Meinel
Track down a few more files that have trailing whitespace.
1299
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
1300
        :param transport: The transport to create the .bzr directory in.
1301
        :return: A
1302
        """
1303
        # Since we are creating a .bzr directory, inherit the
1534.4.39 by Robert Collins
Basic BzrDir support.
1304
        # mode from the root directory
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1305
        temp_control = lockable_files.LockableFiles(transport,
1306
                            '', lockable_files.TransportLock)
1534.4.39 by Robert Collins
Basic BzrDir support.
1307
        temp_control._transport.mkdir('.bzr',
1759.2.2 by Jelmer Vernooij
Revert some of my spelling fixes and fix some typos after review by Aaron.
1308
                                      # FIXME: RBC 20060121 don't peek under
1534.4.39 by Robert Collins
Basic BzrDir support.
1309
                                      # the covers
1310
                                      mode=temp_control._dir_mode)
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
1311
        if sys.platform == 'win32' and isinstance(transport, local.LocalTransport):
3023.1.2 by Alexander Belchenko
Martin's review.
1312
            win32utils.set_file_attr_hidden(transport._abspath('.bzr'))
1534.4.39 by Robert Collins
Basic BzrDir support.
1313
        file_mode = temp_control._file_mode
1314
        del temp_control
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
1315
        bzrdir_transport = transport.clone('.bzr')
1316
        utf8_files = [('README',
3250.2.1 by Marius Kruger
update .bzr/README to not refer to Bazaar-NG, and add link to website.
1317
                       "This is a Bazaar control directory.\n"
1318
                       "Do not change any files in this directory.\n"
5560.2.1 by Vincent Ladeuil
Fix the remaining references to http://bazaar-vcs.org (except the explicitly historical ones).
1319
                       "See http://bazaar.canonical.com/ for more information about Bazaar.\n"),
1534.4.39 by Robert Collins
Basic BzrDir support.
1320
                      ('branch-format', self.get_format_string()),
1321
                      ]
1322
        # NB: no need to escape relative paths that are url safe.
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
1323
        control_files = lockable_files.LockableFiles(bzrdir_transport,
1324
            self._lock_file_name, self._lock_class)
1553.5.60 by Martin Pool
New LockableFiles.create_lock() method
1325
        control_files.create_lock()
1534.4.39 by Robert Collins
Basic BzrDir support.
1326
        control_files.lock_write()
1327
        try:
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
1328
            for (filename, content) in utf8_files:
3407.2.12 by Martin Pool
Fix creation mode of control files
1329
                bzrdir_transport.put_bytes(filename, content,
1330
                    mode=file_mode)
1534.4.39 by Robert Collins
Basic BzrDir support.
1331
        finally:
1332
            control_files.unlock()
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
1333
        return self.open(transport, _found=True)
1534.4.39 by Robert Collins
Basic BzrDir support.
1334
1335
    def open(self, transport, _found=False):
1336
        """Return an instance of this format for the dir transport points at.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1337
1534.4.39 by Robert Collins
Basic BzrDir support.
1338
        _found is a private parameter, do not use it.
1339
        """
1340
        if not _found:
5363.2.20 by Jelmer Vernooij
use controldir.X
1341
            found_format = controldir.ControlDirFormat.find_format(transport)
2090.2.2 by Martin Pool
Fix an assertion with side effects
1342
            if not isinstance(found_format, self.__class__):
1343
                raise AssertionError("%s was asked to open %s, but it seems to need "
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1344
                        "format %s"
2090.2.2 by Martin Pool
Fix an assertion with side effects
1345
                        % (self, transport, found_format))
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1346
            # Allow subclasses - use the found format.
1347
            self._supply_sub_formats_to(found_format)
1348
            return found_format._open(transport)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1349
        return self._open(transport)
1350
1351
    def _open(self, transport):
1352
        """Template method helper for opening BzrDirectories.
1353
1354
        This performs the actual open and any additional logic or parameter
1355
        passing.
1356
        """
1357
        raise NotImplementedError(self._open)
1534.4.39 by Robert Collins
Basic BzrDir support.
1358
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1359
    def _supply_sub_formats_to(self, other_format):
1360
        """Give other_format the same values for sub formats as this has.
1361
1362
        This method is expected to be used when parameterising a
1363
        RemoteBzrDirFormat instance with the parameters from a
1364
        BzrDirMetaFormat1 instance.
1365
1366
        :param other_format: other_format is a format which should be
1367
            compatible with whatever sub formats are supported by self.
1368
        :return: None.
1369
        """
1370
6205.3.1 by Jelmer Vernooij
Add ControlDirFormat.supports_transport.
1371
    def supports_transport(self, transport):
1372
        # bzr formats can be opened over all known transports
1373
        return True
1374
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1375
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1376
class BzrDirMetaFormat1(BzrDirFormat):
1377
    """Bzr meta control format 1
1378
1379
    This is the first format with split out working tree, branch and repository
1380
    disk storage.
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
1381
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1382
    It has:
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
1383
1384
    - Format 3 working trees [optional]
6083.2.11 by Jelmer Vernooij
Add development-colo format.
1385
    - Format 5 branches [optional]
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
1386
    - Format 7 repositories [optional]
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1387
    """
1388
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1389
    _lock_class = lockdir.LockDir
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1390
5673.1.3 by Jelmer Vernooij
Change flexible_components to fixed_components.
1391
    fixed_components = False
1392
6083.2.10 by Jelmer Vernooij
Move more to colo class.
1393
    colocated_branches = False
6083.2.1 by Jelmer Vernooij
Support passing names to BzrDir methods.
1394
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
1395
    def __init__(self):
1396
        self._workingtree_format = None
2230.3.1 by Aaron Bentley
Get branch6 creation working
1397
        self._branch_format = None
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
1398
        self._repository_format = None
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
1399
2100.3.15 by Aaron Bentley
get test suite passing
1400
    def __eq__(self, other):
1401
        if other.__class__ is not self.__class__:
1402
            return False
1403
        if other.repository_format != self.repository_format:
1404
            return False
1405
        if other.workingtree_format != self.workingtree_format:
1406
            return False
1407
        return True
1408
2100.3.35 by Aaron Bentley
equality operations on bzrdir
1409
    def __ne__(self, other):
1410
        return not self == other
1411
2230.3.55 by Aaron Bentley
Updates from review
1412
    def get_branch_format(self):
2230.3.1 by Aaron Bentley
Get branch6 creation working
1413
        if self._branch_format is None:
5662.2.2 by Jelmer Vernooij
Move most format registration functions to BranchFormatRegistry.
1414
            from bzrlib.branch import format_registry as branch_format_registry
1415
            self._branch_format = branch_format_registry.get_default()
2230.3.1 by Aaron Bentley
Get branch6 creation working
1416
        return self._branch_format
1417
2230.3.55 by Aaron Bentley
Updates from review
1418
    def set_branch_format(self, format):
2230.3.1 by Aaron Bentley
Get branch6 creation working
1419
        self._branch_format = format
1420
4456.2.1 by Andrew Bennetts
Fix automatic branch format upgrades triggered by a default stacking policy on a 1.16rc1 (or later) smart server.
1421
    def require_stacking(self, stack_on=None, possible_transports=None,
1422
            _skip_repo=False):
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
1423
        """We have a request to stack, try to ensure the formats support it.
1424
1425
        :param stack_on: If supplied, it is the URL to a branch that we want to
1426
            stack on. Check to see if that format supports stacking before
1427
            forcing an upgrade.
1428
        """
1429
        # Stacking is desired. requested by the target, but does the place it
1430
        # points at support stacking? If it doesn't then we should
1431
        # not implicitly upgrade. We check this here.
1432
        new_repo_format = None
1433
        new_branch_format = None
1434
1435
        # a bit of state for get_target_branch so that we don't try to open it
1436
        # 2 times, for both repo *and* branch
1437
        target = [None, False, None] # target_branch, checked, upgrade anyway
1438
        def get_target_branch():
1439
            if target[1]:
1440
                # We've checked, don't check again
1441
                return target
1442
            if stack_on is None:
1443
                # No target format, that means we want to force upgrading
1444
                target[:] = [None, True, True]
1445
                return target
1446
            try:
1447
                target_dir = BzrDir.open(stack_on,
1448
                    possible_transports=possible_transports)
1449
            except errors.NotBranchError:
1450
                # Nothing there, don't change formats
1451
                target[:] = [None, True, False]
1452
                return target
1453
            except errors.JailBreak:
1454
                # JailBreak, JFDI and upgrade anyway
1455
                target[:] = [None, True, True]
1456
                return target
1457
            try:
1458
                target_branch = target_dir.open_branch()
1459
            except errors.NotBranchError:
1460
                # No branch, don't upgrade formats
1461
                target[:] = [None, True, False]
1462
                return target
1463
            target[:] = [target_branch, True, False]
1464
            return target
1465
4456.2.1 by Andrew Bennetts
Fix automatic branch format upgrades triggered by a default stacking policy on a 1.16rc1 (or later) smart server.
1466
        if (not _skip_repo and
1467
                 not self.repository_format.supports_external_lookups):
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
1468
            # We need to upgrade the Repository.
1469
            target_branch, _, do_upgrade = get_target_branch()
1470
            if target_branch is None:
1471
                # We don't have a target branch, should we upgrade anyway?
1472
                if do_upgrade:
1473
                    # stack_on is inaccessible, JFDI.
1474
                    # TODO: bad monkey, hard-coded formats...
1475
                    if self.repository_format.rich_root_data:
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
1476
                        new_repo_format = knitpack_repo.RepositoryFormatKnitPack5RichRoot()
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
1477
                    else:
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
1478
                        new_repo_format = knitpack_repo.RepositoryFormatKnitPack5()
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
1479
            else:
1480
                # If the target already supports stacking, then we know the
1481
                # project is already able to use stacking, so auto-upgrade
1482
                # for them
1483
                new_repo_format = target_branch.repository._format
1484
                if not new_repo_format.supports_external_lookups:
1485
                    # target doesn't, source doesn't, so don't auto upgrade
1486
                    # repo
1487
                    new_repo_format = None
1488
            if new_repo_format is not None:
1489
                self.repository_format = new_repo_format
6138.3.1 by Jonathan Riddell
use gettext() in more files
1490
                note(gettext('Source repository format does not support stacking,'
1491
                     ' using format:\n  %s'),
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
1492
                     new_repo_format.get_format_description())
1493
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
1494
        if not self.get_branch_format().supports_stacking():
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
1495
            # We just checked the repo, now lets check if we need to
1496
            # upgrade the branch format
1497
            target_branch, _, do_upgrade = get_target_branch()
1498
            if target_branch is None:
1499
                if do_upgrade:
1500
                    # TODO: bad monkey, hard-coded formats...
5675.2.6 by Jelmer Vernooij
Fix some tests.
1501
                    from bzrlib.branch import BzrBranchFormat7
1502
                    new_branch_format = BzrBranchFormat7()
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
1503
            else:
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
1504
                new_branch_format = target_branch._format
1505
                if not new_branch_format.supports_stacking():
1506
                    new_branch_format = None
1507
            if new_branch_format is not None:
1508
                # Does support stacking, use its format.
1509
                self.set_branch_format(new_branch_format)
6138.3.1 by Jonathan Riddell
use gettext() in more files
1510
                note(gettext('Source branch format does not support stacking,'
1511
                     ' using format:\n  %s'),
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
1512
                     new_branch_format.get_format_description())
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
1513
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1514
    def get_converter(self, format=None):
1515
        """See BzrDirFormat.get_converter()."""
1516
        if format is None:
1517
            format = BzrDirFormat.get_default_format()
6207.1.1 by Jelmer Vernooij
Support upgrading between 2a and development-colo.
1518
        if (type(self) is BzrDirMetaFormat1 and
1519
            type(format) is BzrDirMetaFormat1Colo):
1520
            return ConvertMetaToColo(format)
1521
        if (type(self) is BzrDirMetaFormat1Colo and
1522
            type(format) is BzrDirMetaFormat1):
1523
            return ConvertMetaRemoveColo(format)
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1524
        if not isinstance(self, format.__class__):
1525
            # converting away from metadir is not implemented
1526
            raise NotImplementedError(self.get_converter)
1527
        return ConvertMetaToMeta(format)
1528
5712.3.15 by Jelmer Vernooij
Remove unused register format functions.
1529
    @classmethod
1530
    def get_format_string(cls):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1531
        """See BzrDirFormat.get_format_string()."""
1532
        return "Bazaar-NG meta directory, format 1\n"
1533
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
1534
    def get_format_description(self):
1535
        """See BzrDirFormat.get_format_description()."""
1536
        return "Meta directory format 1"
1537
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
1538
    def network_name(self):
1539
        return self.get_format_string()
1540
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1541
    def _open(self, transport):
1542
        """See BzrDirFormat._open."""
4294.2.12 by Robert Collins
Prevent aliasing issues with BzrDirMetaFormat1 by making a new format object in _open.
1543
        # Create a new format instance because otherwise initialisation of new
1544
        # metadirs share the global default format object leading to alias
1545
        # problems.
1546
        format = BzrDirMetaFormat1()
1547
        self._supply_sub_formats_to(format)
1548
        return BzrDirMeta1(transport, format)
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1549
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1550
    def __return_repository_format(self):
1551
        """Circular import protection."""
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
1552
        if self._repository_format:
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1553
            return self._repository_format
5651.3.2 by Jelmer Vernooij
Fix deprecation warnings in test suite.
1554
        from bzrlib.repository import format_registry
1555
        return format_registry.get_default()
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1556
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1557
    def _set_repository_format(self, value):
3015.2.8 by Robert Collins
Typo in __set_repository_format's docstring.
1558
        """Allow changing the repository format for metadir formats."""
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1559
        self._repository_format = value
1553.5.72 by Martin Pool
Clean up test for Branch5 lockdirs
1560
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1561
    repository_format = property(__return_repository_format,
1562
        _set_repository_format)
1563
1564
    def _supply_sub_formats_to(self, other_format):
1565
        """Give other_format the same values for sub formats as this has.
1566
1567
        This method is expected to be used when parameterising a
1568
        RemoteBzrDirFormat instance with the parameters from a
1569
        BzrDirMetaFormat1 instance.
1570
1571
        :param other_format: other_format is a format which should be
1572
            compatible with whatever sub formats are supported by self.
1573
        :return: None.
1574
        """
1575
        if getattr(self, '_repository_format', None) is not None:
1576
            other_format.repository_format = self.repository_format
1577
        if self._branch_format is not None:
1578
            other_format._branch_format = self._branch_format
1579
        if self._workingtree_format is not None:
1580
            other_format.workingtree_format = self.workingtree_format
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1581
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
1582
    def __get_workingtree_format(self):
1583
        if self._workingtree_format is None:
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
1584
            from bzrlib.workingtree import (
1585
                format_registry as wt_format_registry,
1586
                )
1587
            self._workingtree_format = wt_format_registry.get_default()
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
1588
        return self._workingtree_format
1589
1590
    def __set_workingtree_format(self, wt_format):
1591
        self._workingtree_format = wt_format
1592
1593
    workingtree_format = property(__get_workingtree_format,
1594
                                  __set_workingtree_format)
1595
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1596
2164.2.13 by v.ladeuil+lp at free
Add tests for redirection. Preserve transport decorations.
1597
# Register bzr formats
5712.3.23 by Jelmer Vernooij
Register BzrMetaDir1 as a class in the BzrDir subformat registry. This subformat registry inherits from bzrlib.controldir.network_format_registry, which previously contained classes rather than instances.
1598
BzrProber.formats.register(BzrDirMetaFormat1.get_format_string(),
1599
    BzrDirMetaFormat1)
1600
controldir.ControlDirFormat._default_format = BzrDirMetaFormat1()
1534.4.39 by Robert Collins
Basic BzrDir support.
1601
1602
6083.2.10 by Jelmer Vernooij
Move more to colo class.
1603
class BzrDirMetaFormat1Colo(BzrDirMetaFormat1):
6083.2.11 by Jelmer Vernooij
Add development-colo format.
1604
    """BzrDirMeta1 format with support for colocated branches."""
6083.2.10 by Jelmer Vernooij
Move more to colo class.
1605
1606
    colocated_branches = True
1607
1608
    @classmethod
1609
    def get_format_string(cls):
1610
        """See BzrDirFormat.get_format_string()."""
1611
        return "Bazaar meta directory, format 1 (with colocated branches)\n"
1612
1613
    def get_format_description(self):
1614
        """See BzrDirFormat.get_format_description()."""
1615
        return "Meta directory format 1 with support for colocated branches"
1616
6083.2.11 by Jelmer Vernooij
Add development-colo format.
1617
    def _open(self, transport):
1618
        """See BzrDirFormat._open."""
1619
        # Create a new format instance because otherwise initialisation of new
1620
        # metadirs share the global default format object leading to alias
1621
        # problems.
1622
        format = BzrDirMetaFormat1Colo()
1623
        self._supply_sub_formats_to(format)
1624
        return BzrDirMeta1Colo(transport, format)
1625
6083.2.10 by Jelmer Vernooij
Move more to colo class.
1626
1627
BzrProber.formats.register(BzrDirMetaFormat1Colo.get_format_string(),
1628
    BzrDirMetaFormat1Colo)
1629
1630
5692.1.1 by Jelmer Vernooij
Move Converter (which is generic) from bzrlib.bzrdir to bzrlib.controldir.
1631
class ConvertMetaToMeta(controldir.Converter):
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1632
    """Converts the components of metadirs."""
1633
1634
    def __init__(self, target_format):
1635
        """Create a metadir to metadir converter.
1636
1637
        :param target_format: The final metadir format that is desired.
1638
        """
1639
        self.target_format = target_format
1640
1641
    def convert(self, to_convert, pb):
1642
        """See Converter.convert()."""
1643
        self.bzrdir = to_convert
4961.2.14 by Martin Pool
Further pb cleanups
1644
        self.pb = ui.ui_factory.nested_progress_bar()
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1645
        self.count = 0
1646
        self.total = 1
1647
        self.step('checking repository format')
1648
        try:
1649
            repo = self.bzrdir.open_repository()
1650
        except errors.NoRepositoryPresent:
1651
            pass
1652
        else:
1653
            if not isinstance(repo._format, self.target_format.repository_format.__class__):
1654
                from bzrlib.repository import CopyConverter
6138.3.1 by Jonathan Riddell
use gettext() in more files
1655
                ui.ui_factory.note(gettext('starting repository conversion'))
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1656
                converter = CopyConverter(self.target_format.repository_format)
1657
                converter.convert(repo, pb)
4997.1.3 by Jelmer Vernooij
Use list_branches during upgrades.
1658
        for branch in self.bzrdir.list_branches():
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1659
            # TODO: conversions of Branch and Tree should be done by
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
1660
            # InterXFormat lookups/some sort of registry.
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
1661
            # Avoid circular imports
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
1662
            old = branch._format.__class__
1663
            new = self.target_format.get_branch_format().__class__
1664
            while old != new:
1665
                if (old == _mod_branch.BzrBranchFormat5 and
1666
                    new in (_mod_branch.BzrBranchFormat6,
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
1667
                        _mod_branch.BzrBranchFormat7,
1668
                        _mod_branch.BzrBranchFormat8)):
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
1669
                    branch_converter = _mod_branch.Converter5to6()
1670
                elif (old == _mod_branch.BzrBranchFormat6 and
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
1671
                    new in (_mod_branch.BzrBranchFormat7,
1672
                            _mod_branch.BzrBranchFormat8)):
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
1673
                    branch_converter = _mod_branch.Converter6to7()
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
1674
                elif (old == _mod_branch.BzrBranchFormat7 and
1675
                      new is _mod_branch.BzrBranchFormat8):
1676
                    branch_converter = _mod_branch.Converter7to8()
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
1677
                else:
4608.1.3 by Martin Pool
BadConversionTarget error includes source format
1678
                    raise errors.BadConversionTarget("No converter", new,
1679
                        branch._format)
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
1680
                branch_converter.convert(branch)
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
1681
                branch = self.bzrdir.open_branch()
1682
                old = branch._format.__class__
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1683
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1684
            tree = self.bzrdir.open_workingtree(recommend_upgrade=False)
2255.2.196 by Robert Collins
Fix test_upgrade defects related to non local or absent working trees.
1685
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1686
            pass
1687
        else:
1688
            # TODO: conversions of Branch and Tree should be done by
1689
            # InterXFormat lookups
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
1690
            if (isinstance(tree, workingtree_3.WorkingTree3) and
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
1691
                not isinstance(tree, workingtree_4.DirStateWorkingTree) and
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1692
                isinstance(self.target_format.workingtree_format,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
1693
                    workingtree_4.DirStateWorkingTreeFormat)):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1694
                workingtree_4.Converter3to4().convert(tree)
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
1695
            if (isinstance(tree, workingtree_4.DirStateWorkingTree) and
1696
                not isinstance(tree, workingtree_4.WorkingTree5) and
3586.1.8 by Ian Clatworthy
add workingtree_5 and initial upgrade code
1697
                isinstance(self.target_format.workingtree_format,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
1698
                    workingtree_4.WorkingTreeFormat5)):
1699
                workingtree_4.Converter4to5().convert(tree)
4210.4.2 by Ian Clatworthy
split filtered views support out into WorkingTreeFormat6
1700
            if (isinstance(tree, workingtree_4.DirStateWorkingTree) and
1701
                not isinstance(tree, workingtree_4.WorkingTree6) and
1702
                isinstance(self.target_format.workingtree_format,
1703
                    workingtree_4.WorkingTreeFormat6)):
1704
                workingtree_4.Converter4or5to6().convert(tree)
4961.2.14 by Martin Pool
Further pb cleanups
1705
        self.pb.finished()
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1706
        return to_convert
1731.2.18 by Aaron Bentley
Get extract in repository under test
1707
1708
6207.1.1 by Jelmer Vernooij
Support upgrading between 2a and development-colo.
1709
class ConvertMetaToColo(controldir.Converter):
1710
    """Add colocated branch support."""
1711
1712
    def __init__(self, target_format):
1713
        """Create a converter.that upgrades a metadir to the colo format.
1714
1715
        :param target_format: The final metadir format that is desired.
1716
        """
1717
        self.target_format = target_format
1718
1719
    def convert(self, to_convert, pb):
1720
        """See Converter.convert()."""
1721
        to_convert.transport.put_bytes('branch-format',
1722
            self.target_format.get_format_string())
1723
        return BzrDir.open_from_transport(to_convert.root_transport)
1724
1725
1726
class ConvertMetaRemoveColo(controldir.Converter):
1727
    """Remove colocated branch support from a bzrdir."""
1728
1729
    def __init__(self, target_format):
1730
        """Create a converter.that downgrades a colocated branch metadir
1731
        to a regular metadir.
1732
1733
        :param target_format: The final metadir format that is desired.
1734
        """
1735
        self.target_format = target_format
1736
1737
    def convert(self, to_convert, pb):
1738
        """See Converter.convert()."""
1739
        to_convert.control_files.lock_write()
1740
        try:
1741
            branches = to_convert.list_branches()
1742
            if len(branches) > 1:
1743
                raise errors.BzrError("remove all but a single "
1744
                    "colocated branch when downgrading")
1745
        finally:
1746
            to_convert.control_files.unlock()
1747
        to_convert.transport.put_bytes('branch-format',
1748
            self.target_format.get_format_string())
1749
        return BzrDir.open_from_transport(to_convert.root_transport)
1750
1751
5363.2.20 by Jelmer Vernooij
use controldir.X
1752
controldir.ControlDirFormat.register_server_prober(RemoteBzrProber)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
1753
1754
3242.2.14 by Aaron Bentley
Update from review comments
1755
class RepositoryAcquisitionPolicy(object):
1756
    """Abstract base class for repository acquisition policies.
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
1757
3242.2.14 by Aaron Bentley
Update from review comments
1758
    A repository acquisition policy decides how a BzrDir acquires a repository
1759
    for a branch that is being created.  The most basic policy decision is
1760
    whether to create a new repository or use an existing one.
1761
    """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1762
    def __init__(self, stack_on, stack_on_pwd, require_stacking):
3242.3.35 by Aaron Bentley
Cleanups and documentation
1763
        """Constructor.
1764
1765
        :param stack_on: A location to stack on
1766
        :param stack_on_pwd: If stack_on is relative, the location it is
1767
            relative to.
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1768
        :param require_stacking: If True, it is a failure to not stack.
3242.3.35 by Aaron Bentley
Cleanups and documentation
1769
        """
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
1770
        self._stack_on = stack_on
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
1771
        self._stack_on_pwd = stack_on_pwd
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1772
        self._require_stacking = require_stacking
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
1773
1774
    def configure_branch(self, branch):
3242.2.13 by Aaron Bentley
Update docs
1775
        """Apply any configuration data from this policy to the branch.
1776
3242.3.18 by Aaron Bentley
Clean up repository-policy work
1777
        Default implementation sets repository stacking.
3242.2.13 by Aaron Bentley
Update docs
1778
        """
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
1779
        if self._stack_on is None:
1780
            return
1781
        if self._stack_on_pwd is None:
1782
            stack_on = self._stack_on
1783
        else:
1784
            try:
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
1785
                stack_on = urlutils.rebase_url(self._stack_on,
1786
                    self._stack_on_pwd,
5158.6.9 by Martin Pool
Simplify various code to use user_url
1787
                    branch.user_url)
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
1788
            except errors.InvalidRebaseURLs:
1789
                stack_on = self._get_full_stack_on()
3242.3.37 by Aaron Bentley
Updates from reviews
1790
        try:
3537.3.5 by Martin Pool
merge trunk including stacking policy
1791
            branch.set_stacked_on_url(stack_on)
4126.1.1 by Andrew Bennetts
Fix bug when pushing stackable branch in unstackable repo to default-stacking target.
1792
        except (errors.UnstackableBranchFormat,
1793
                errors.UnstackableRepositoryFormat):
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1794
            if self._require_stacking:
1795
                raise
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
1796
4617.3.1 by Robert Collins
Fix test_stacking tests for 2a as a default format. The change to 2a exposed some actual bugs, both in tests and bzrdir/branch code.
1797
    def requires_stacking(self):
1798
        """Return True if this policy requires stacking."""
1799
        return self._stack_on is not None and self._require_stacking
1800
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
1801
    def _get_full_stack_on(self):
3242.3.35 by Aaron Bentley
Cleanups and documentation
1802
        """Get a fully-qualified URL for the stack_on location."""
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
1803
        if self._stack_on is None:
1804
            return None
1805
        if self._stack_on_pwd is None:
1806
            return self._stack_on
1807
        else:
1808
            return urlutils.join(self._stack_on_pwd, self._stack_on)
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
1809
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
1810
    def _add_fallback(self, repository, possible_transports=None):
3242.3.35 by Aaron Bentley
Cleanups and documentation
1811
        """Add a fallback to the supplied repository, if stacking is set."""
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
1812
        stack_on = self._get_full_stack_on()
1813
        if stack_on is None:
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
1814
            return
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
1815
        try:
1816
            stacked_dir = BzrDir.open(stack_on,
1817
                                      possible_transports=possible_transports)
1818
        except errors.JailBreak:
1819
            # We keep the stacking details, but we are in the server code so
1820
            # actually stacking is not needed.
1821
            return
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
1822
        try:
1823
            stacked_repo = stacked_dir.open_branch().repository
1824
        except errors.NotBranchError:
1825
            stacked_repo = stacked_dir.open_repository()
3242.3.37 by Aaron Bentley
Updates from reviews
1826
        try:
1827
            repository.add_fallback_repository(stacked_repo)
1828
        except errors.UnstackableRepositoryFormat:
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1829
            if self._require_stacking:
1830
                raise
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
1831
        else:
1832
            self._require_stacking = True
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
1833
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
1834
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
1835
        """Acquire a repository for this bzrdir.
1836
1837
        Implementations may create a new repository or use a pre-exising
1838
        repository.
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
1839
3242.2.14 by Aaron Bentley
Update from review comments
1840
        :param make_working_trees: If creating a repository, set
1841
            make_working_trees to this value (if non-None)
1842
        :param shared: If creating a repository, make it shared if True
4070.9.8 by Andrew Bennetts
Use MiniSearchResult in clone_on_transport down (further tightening the test_push ratchets), and improve acquire_repository docstrings.
1843
        :return: A repository, is_new_flag (True if the repository was
1844
            created).
3242.2.14 by Aaron Bentley
Update from review comments
1845
        """
1846
        raise NotImplemented(RepositoryAcquisitionPolicy.acquire_repository)
1847
1848
1849
class CreateRepository(RepositoryAcquisitionPolicy):
3242.2.13 by Aaron Bentley
Update docs
1850
    """A policy of creating a new repository"""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
1851
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1852
    def __init__(self, bzrdir, stack_on=None, stack_on_pwd=None,
1853
                 require_stacking=False):
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
1854
        """Constructor.
1855
3242.3.35 by Aaron Bentley
Cleanups and documentation
1856
        :param bzrdir: The bzrdir to create the repository on.
1857
        :param stack_on: A location to stack on
1858
        :param stack_on_pwd: If stack_on is relative, the location it is
1859
            relative to.
1860
        """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1861
        RepositoryAcquisitionPolicy.__init__(self, stack_on, stack_on_pwd,
1862
                                             require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
1863
        self._bzrdir = bzrdir
1864
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
1865
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
1866
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
3242.2.13 by Aaron Bentley
Update docs
1867
3242.2.14 by Aaron Bentley
Update from review comments
1868
        Creates the desired repository in the bzrdir we already have.
3242.2.13 by Aaron Bentley
Update docs
1869
        """
4165.2.1 by Robert Collins
Fix bzr failing to stack when a server requests it and the branch it is pushing from cannot stack but the branch it should stack on can.
1870
        stack_on = self._get_full_stack_on()
1871
        if stack_on:
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
1872
            format = self._bzrdir._format
1873
            format.require_stacking(stack_on=stack_on,
1874
                                    possible_transports=[self._bzrdir.root_transport])
1875
            if not self._require_stacking:
1876
                # We have picked up automatic stacking somewhere.
6150.3.5 by Jonathan Riddell
more gettext()
1877
                note(gettext('Using default stacking branch {0} at {1}').format(
1878
                    self._stack_on, self._stack_on_pwd))
3650.3.9 by Aaron Bentley
Move responsibility for stackable repo format to _get_metadir
1879
        repository = self._bzrdir.create_repository(shared=shared)
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
1880
        self._add_fallback(repository,
1881
                           possible_transports=[self._bzrdir.transport])
3242.2.4 by Aaron Bentley
Only set working tree policty when specified
1882
        if make_working_trees is not None:
3242.3.6 by Aaron Bentley
Work around strange test failure
1883
            repository.set_make_working_trees(make_working_trees)
4070.9.2 by Andrew Bennetts
Rough prototype of allowing a SearchResult to be passed to fetch, and using that to improve network conversations.
1884
        return repository, True
3242.2.2 by Aaron Bentley
Merge policy updates from stacked-policy thread
1885
1886
3242.2.14 by Aaron Bentley
Update from review comments
1887
class UseExistingRepository(RepositoryAcquisitionPolicy):
3242.2.13 by Aaron Bentley
Update docs
1888
    """A policy of reusing an existing repository"""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
1889
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1890
    def __init__(self, repository, stack_on=None, stack_on_pwd=None,
1891
                 require_stacking=False):
3242.3.35 by Aaron Bentley
Cleanups and documentation
1892
        """Constructor.
1893
1894
        :param repository: The repository to use.
1895
        :param stack_on: A location to stack on
1896
        :param stack_on_pwd: If stack_on is relative, the location it is
1897
            relative to.
1898
        """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1899
        RepositoryAcquisitionPolicy.__init__(self, stack_on, stack_on_pwd,
1900
                                             require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
1901
        self._repository = repository
1902
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
1903
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
1904
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
3242.2.13 by Aaron Bentley
Update docs
1905
4070.9.8 by Andrew Bennetts
Use MiniSearchResult in clone_on_transport down (further tightening the test_push ratchets), and improve acquire_repository docstrings.
1906
        Returns an existing repository to use.
3242.2.13 by Aaron Bentley
Update docs
1907
        """
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
1908
        self._add_fallback(self._repository,
1909
                       possible_transports=[self._repository.bzrdir.transport])
4070.9.2 by Andrew Bennetts
Rough prototype of allowing a SearchResult to be passed to fetch, and using that to improve network conversations.
1910
        return self._repository, False
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
1911
1912
5363.2.9 by Jelmer Vernooij
Fix some tests.
1913
def register_metadir(registry, key,
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
1914
         repository_format, help, native=True, deprecated=False,
1915
         branch_format=None,
1916
         tree_format=None,
1917
         hidden=False,
1918
         experimental=False,
6083.2.9 by Jelmer Vernooij
Add development-colo as a separate format.
1919
         alias=False, bzrdir_format=None):
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
1920
    """Register a metadir subformat.
1921
6083.2.9 by Jelmer Vernooij
Add development-colo as a separate format.
1922
    These all use a meta bzrdir, but can be parameterized by the
1923
    Repository/Branch/WorkingTreeformats.
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
1924
1925
    :param repository_format: The fully-qualified repository format class
1926
        name as a string.
1927
    :param branch_format: Fully-qualified branch format class name as
1928
        a string.
1929
    :param tree_format: Fully-qualified tree format class name as
1930
        a string.
1931
    """
6083.2.9 by Jelmer Vernooij
Add development-colo as a separate format.
1932
    if bzrdir_format is None:
1933
        bzrdir_format = BzrDirMetaFormat1
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
1934
    # This should be expanded to support setting WorkingTree and Branch
6083.2.9 by Jelmer Vernooij
Add development-colo as a separate format.
1935
    # formats, once the API supports that.
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
1936
    def _load(full_name):
1937
        mod_name, factory_name = full_name.rsplit('.', 1)
1938
        try:
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
1939
            factory = pyutils.get_named_object(mod_name, factory_name)
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
1940
        except ImportError, e:
1941
            raise ImportError('failed to load %s: %s' % (full_name, e))
1942
        except AttributeError:
1943
            raise AttributeError('no factory %s in module %r'
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
1944
                % (full_name, sys.modules[mod_name]))
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
1945
        return factory()
1946
1947
    def helper():
6083.2.9 by Jelmer Vernooij
Add development-colo as a separate format.
1948
        bd = bzrdir_format()
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
1949
        if branch_format is not None:
1950
            bd.set_branch_format(_load(branch_format))
1951
        if tree_format is not None:
1952
            bd.workingtree_format = _load(tree_format)
1953
        if repository_format is not None:
1954
            bd.repository_format = _load(repository_format)
1955
        return bd
5363.2.9 by Jelmer Vernooij
Fix some tests.
1956
    registry.register(key, helper, help, native, deprecated, hidden,
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
1957
        experimental, alias)
1958
5363.2.20 by Jelmer Vernooij
use controldir.X
1959
register_metadir(controldir.format_registry, 'knit',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
1960
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
1961
    'Format using knits.  Recommended for interoperation with bzr <= 0.14.',
1962
    branch_format='bzrlib.branch.BzrBranchFormat5',
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
1963
    tree_format='bzrlib.workingtree_3.WorkingTreeFormat3',
4976.2.1 by Ian Clatworthy
Hide most storage formats
1964
    hidden=True,
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
1965
    deprecated=True)
5363.2.20 by Jelmer Vernooij
use controldir.X
1966
register_metadir(controldir.format_registry, 'dirstate',
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1967
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
1968
    help='New in 0.15: Fast local operations. Compatible with bzr 0.8 and '
1969
        'above when accessed over the network.',
1970
    branch_format='bzrlib.branch.BzrBranchFormat5',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
1971
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
1972
    hidden=True,
3892.1.1 by Ian Clatworthy
improve help on storage formats
1973
    deprecated=True)
5363.2.20 by Jelmer Vernooij
use controldir.X
1974
register_metadir(controldir.format_registry, 'dirstate-tags',
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
1975
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
1976
    help='New in 0.15: Fast local operations and improved scaling for '
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
1977
        'network operations. Additionally adds support for tags.'
1978
        ' Incompatible with bzr < 0.15.',
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
1979
    branch_format='bzrlib.branch.BzrBranchFormat6',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
1980
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
1981
    hidden=True,
3892.1.1 by Ian Clatworthy
improve help on storage formats
1982
    deprecated=True)
5363.2.20 by Jelmer Vernooij
use controldir.X
1983
register_metadir(controldir.format_registry, 'rich-root',
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
1984
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
1985
    help='New in 1.0.  Better handling of tree roots.  Incompatible with'
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
1986
        ' bzr < 1.0.',
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
1987
    branch_format='bzrlib.branch.BzrBranchFormat6',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
1988
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
1989
    hidden=True,
3892.1.1 by Ian Clatworthy
improve help on storage formats
1990
    deprecated=True)
5363.2.20 by Jelmer Vernooij
use controldir.X
1991
register_metadir(controldir.format_registry, 'dirstate-with-subtree',
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1992
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
1993
    help='New in 0.15: Fast local operations and improved scaling for '
1994
        'network operations. Additionally adds support for versioning nested '
1995
        'bzr branches. Incompatible with bzr < 0.15.',
1996
    branch_format='bzrlib.branch.BzrBranchFormat6',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
1997
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
3170.4.3 by Adeodato Simó
Mark the subtree formats as experimental instead of hidden, and remove hidden=True from the rich-root ones.
1998
    experimental=True,
3170.4.4 by Adeodato Simó
Keep the hidden flag for subtree formats after review from Aaron.
1999
    hidden=True,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2000
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2001
register_metadir(controldir.format_registry, 'pack-0.92',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2002
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack1',
2939.2.1 by Ian Clatworthy
use 'knitpack' naming instead of 'experimental' for pack formats
2003
    help='New in 0.92: Pack-based format with data compatible with '
2939.2.6 by Ian Clatworthy
more review feedback from lifeless and poolie
2004
        'dirstate-tags format repositories. Interoperates with '
2005
        'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
4988.4.2 by Martin Pool
Change url to canonical.com or wiki, plus some doc improvements in passing
2006
        ,
2592.3.22 by Robert Collins
Add new experimental repository formats.
2007
    branch_format='bzrlib.branch.BzrBranchFormat6',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2008
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2592.3.22 by Robert Collins
Add new experimental repository formats.
2009
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2010
register_metadir(controldir.format_registry, 'pack-0.92-subtree',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2011
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack3',
2939.2.1 by Ian Clatworthy
use 'knitpack' naming instead of 'experimental' for pack formats
2012
    help='New in 0.92: Pack-based format with data compatible with '
2939.2.6 by Ian Clatworthy
more review feedback from lifeless and poolie
2013
        'dirstate-with-subtree format repositories. Interoperates with '
2014
        'bzr repositories before 0.92 but cannot be read by bzr < 0.92. '
4988.4.2 by Martin Pool
Change url to canonical.com or wiki, plus some doc improvements in passing
2015
        ,
2592.3.22 by Robert Collins
Add new experimental repository formats.
2016
    branch_format='bzrlib.branch.BzrBranchFormat6',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2017
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
3190.1.2 by Aaron Bentley
Undo spurious change
2018
    hidden=True,
3170.4.3 by Adeodato Simó
Mark the subtree formats as experimental instead of hidden, and remove hidden=True from the rich-root ones.
2019
    experimental=True,
2592.3.22 by Robert Collins
Add new experimental repository formats.
2020
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2021
register_metadir(controldir.format_registry, 'rich-root-pack',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2022
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack4',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2023
    help='New in 1.0: A variant of pack-0.92 that supports rich-root data '
4119.6.2 by Jelmer Vernooij
Use existing alias mechanism for default-rich-root.
2024
         '(needed for bzr-svn and bzr-git).',
2996.2.11 by Aaron Bentley
Implement rich-root-pack format ( #164639)
2025
    branch_format='bzrlib.branch.BzrBranchFormat6',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2026
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2027
    hidden=True,
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
2028
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2029
register_metadir(controldir.format_registry, '1.6',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2030
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack5',
3892.1.6 by Ian Clatworthy
include feedback from poolie
2031
    help='A format that allows a branch to indicate that there is another '
2032
         '(stacked) repository that should be used to access data that is '
2033
         'not present locally.',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
2034
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2035
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2036
    hidden=True,
3549.1.5 by Martin Pool
Add stable format names for stacked branches
2037
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2038
register_metadir(controldir.format_registry, '1.6.1-rich-root',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2039
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack5RichRoot',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2040
    help='A variant of 1.6 that supports rich-root data '
4119.6.2 by Jelmer Vernooij
Use existing alias mechanism for default-rich-root.
2041
         '(needed for bzr-svn and bzr-git).',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
2042
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2043
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2044
    hidden=True,
3549.1.5 by Martin Pool
Add stable format names for stacked branches
2045
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2046
register_metadir(controldir.format_registry, '1.9',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2047
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack6',
3892.1.6 by Ian Clatworthy
include feedback from poolie
2048
    help='A repository format using B+tree indexes. These indexes '
3892.1.4 by Ian Clatworthy
rich-root explanation and improved help for 1.6 and 1.9 formats
2049
         'are smaller in size, have smarter caching and provide faster '
2050
         'performance for most operations.',
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
2051
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2052
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2053
    hidden=True,
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
2054
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2055
register_metadir(controldir.format_registry, '1.9-rich-root',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2056
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack6RichRoot',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2057
    help='A variant of 1.9 that supports rich-root data '
4119.6.2 by Jelmer Vernooij
Use existing alias mechanism for default-rich-root.
2058
         '(needed for bzr-svn and bzr-git).',
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
2059
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2060
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2061
    hidden=True,
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
2062
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2063
register_metadir(controldir.format_registry, '1.14',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2064
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack6',
4210.4.2 by Ian Clatworthy
split filtered views support out into WorkingTreeFormat6
2065
    help='A working-tree format that supports content filtering.',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
2066
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2067
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat5',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
2068
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2069
register_metadir(controldir.format_registry, '1.14-rich-root',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2070
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack6RichRoot',
4210.4.1 by Ian Clatworthy
replace experimental development-wt5 formats with 1.14 formats
2071
    help='A variant of 1.14 that supports rich-root data '
4119.6.2 by Jelmer Vernooij
Use existing alias mechanism for default-rich-root.
2072
         '(needed for bzr-svn and bzr-git).',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
2073
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2074
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat5',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
2075
    )
4241.6.8 by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)
2076
# The following un-numbered 'development' formats should always just be aliases.
5363.2.20 by Jelmer Vernooij
use controldir.X
2077
register_metadir(controldir.format_registry, 'development-subtree',
5389.1.1 by Jelmer Vernooij
Add development8-subtree.
2078
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2aSubtree',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
2079
    help='Current development format, subtree variant. Can convert data to and '
3221.11.7 by Robert Collins
Merge in real stacked repository work.
2080
        'from pack-0.92-subtree (and anything compatible with '
2081
        'pack-0.92-subtree) format repositories. Repositories and branches in '
2082
        'this format can only be read by bzr.dev. Please read '
4988.4.2 by Martin Pool
Change url to canonical.com or wiki, plus some doc improvements in passing
2083
        'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
2084
        'before use.',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
2085
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2086
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
2087
    experimental=True,
4976.2.1 by Ian Clatworthy
Hide most storage formats
2088
    hidden=True,
4241.6.8 by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)
2089
    alias=False, # Restore to being an alias when an actual development subtree format is added
2090
                 # This current non-alias status is simply because we did not introduce a
2091
                 # chk based subtree format.
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
2092
    )
5546.1.1 by Andrew Bennetts
Remove RepositoryFormatCHK1 and RepositoryFormatCHK2.
2093
register_metadir(controldir.format_registry, 'development5-subtree',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2094
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatPackDevelopment2Subtree',
5546.1.1 by Andrew Bennetts
Remove RepositoryFormatCHK1 and RepositoryFormatCHK2.
2095
    help='Development format, subtree variant. Can convert data to and '
2096
        'from pack-0.92-subtree (and anything compatible with '
2097
        'pack-0.92-subtree) format repositories. Repositories and branches in '
2098
        'this format can only be read by bzr.dev. Please read '
2099
        'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
2100
        'before use.',
2101
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2102
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
5546.1.1 by Andrew Bennetts
Remove RepositoryFormatCHK1 and RepositoryFormatCHK2.
2103
    experimental=True,
2104
    hidden=True,
2105
    alias=False,
2106
    )
4241.6.8 by Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil
Add --development6-rich-root, disabling the legacy and unneeded development2 format, and activating the tests for CHK features disabled pending this format. (Robert Collins, John Arbash Meinel, Ian Clatworthy, Vincent Ladeuil)
2107
6083.2.9 by Jelmer Vernooij
Add development-colo as a separate format.
2108
register_metadir(controldir.format_registry, 'development-colo',
2109
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
2110
    help='The 2a format with experimental support for colocated branches.\n',
2111
    branch_format='bzrlib.branch.BzrBranchFormat7',
2112
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
2113
    experimental=False,
2114
    bzrdir_format=BzrDirMetaFormat1Colo,
2115
    )
2116
2117
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
2118
# And the development formats above will have aliased one of the following:
5546.1.1 by Andrew Bennetts
Remove RepositoryFormatCHK1 and RepositoryFormatCHK2.
2119
2120
# Finally, the current format.
5363.2.20 by Jelmer Vernooij
use controldir.X
2121
register_metadir(controldir.format_registry, '2a',
4428.2.1 by Martin Pool
Add 2a format
2122
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
2123
    help='First format for bzr 2.0 series.\n'
4428.2.5 by Martin Pool
Mark 2a experimental and tweak its help per lifeless's review
2124
        'Uses group-compress storage.\n'
4428.2.6 by Martin Pool
Stupid typo fix
2125
        'Provides rich roots which are a one-way transition.\n',
4428.2.5 by Martin Pool
Mark 2a experimental and tweak its help per lifeless's review
2126
        # 'storage in packs, 255-way hashed CHK inventory, bencode revision, group compress, '
2127
        # 'rich roots. Supported by bzr 1.16 and later.',
4428.2.1 by Martin Pool
Add 2a format
2128
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2129
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
5389.1.1 by Jelmer Vernooij
Add development8-subtree.
2130
    experimental=False,
4428.2.1 by Martin Pool
Add 2a format
2131
    )
4428.2.2 by Martin Pool
Format 2a should not be hidden
2132
4119.6.2 by Jelmer Vernooij
Use existing alias mechanism for default-rich-root.
2133
# The following format should be an alias for the rich root equivalent 
2134
# of the default format
5363.2.20 by Jelmer Vernooij
use controldir.X
2135
register_metadir(controldir.format_registry, 'default-rich-root',
4599.4.37 by Robert Collins
Fix registration of default-rich-root as 2a.
2136
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
2137
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2138
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
4599.4.23 by Robert Collins
default-rich-root should be an alias still.
2139
    alias=True,
4976.2.1 by Ian Clatworthy
Hide most storage formats
2140
    hidden=True,
4599.4.22 by mbp at sourcefrog
Don't forget to set default-rich-root to 2a too.
2141
    help='Same as 2a.')
2142
3221.11.2 by Robert Collins
Create basic stackable branch facility.
2143
# The current format that is made on 'bzr init'.
6056.2.2 by Vincent Ladeuil
Migrate default_format.
2144
format_name = config.GlobalStack().get('default_format')
2145
controldir.format_registry.set_default(format_name)
5363.2.22 by Jelmer Vernooij
Provide bzrlib.bzrdir.format_registry.
2146
2147
# XXX 2010-08-20 JRV: There is still a lot of code relying on
2148
# bzrlib.bzrdir.format_registry existing. When BzrDir.create/BzrDir.open/etc
2149
# get changed to ControlDir.create/ControlDir.open/etc this should be removed.
2150
format_registry = controldir.format_registry