~bzr-pqm/bzr/bzr.dev

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