/brz/remove-bazaar

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