/brz/remove-bazaar

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