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