/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
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.
1150
    def create_branch(self, name=None, repository=None):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1151
        """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.
1152
        return self._format.get_branch_format().initialize(self, name=name,
1153
                repository=repository)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1154
5051.3.1 by Jelmer Vernooij
Add optional name argument to BzrDir.destroy_branch.
1155
    def destroy_branch(self, name=None):
2796.2.6 by Aaron Bentley
Implement destroy_branch
1156
        """See BzrDir.create_branch."""
5051.3.1 by Jelmer Vernooij
Add optional name argument to BzrDir.destroy_branch.
1157
        if name is not None:
1158
            raise errors.NoColocatedBranchSupport(self)
2796.2.6 by Aaron Bentley
Implement destroy_branch
1159
        self.transport.delete_tree('branch')
1160
1534.6.1 by Robert Collins
allow API creation of shared repositories
1161
    def create_repository(self, shared=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1162
        """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.
1163
        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.
1164
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
1165
    def destroy_repository(self):
1166
        """See BzrDir.destroy_repository."""
1167
        self.transport.delete_tree('repository')
1168
3123.5.2 by Aaron Bentley
Allow checkout --files_from
1169
    def create_workingtree(self, revision_id=None, from_branch=None,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1170
                           accelerator_tree=None, hardlink=False):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1171
        """See BzrDir.create_workingtree."""
2955.5.3 by Vincent Ladeuil
Fix second unwanted connection by providing the right branch to create_checkout.
1172
        return self._format.workingtree_format.initialize(
3123.5.2 by Aaron Bentley
Allow checkout --files_from
1173
            self, revision_id, from_branch=from_branch,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1174
            accelerator_tree=accelerator_tree, hardlink=hardlink)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1175
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1176
    def destroy_workingtree(self):
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
1177
        """See BzrDir.destroy_workingtree."""
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1178
        wt = self.open_workingtree(recommend_upgrade=False)
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1179
        repository = wt.branch.repository
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
1180
        empty = repository.revision_tree(_mod_revision.NULL_REVISION)
5409.1.7 by Vincent Ladeuil
First orphaning implementation (some tests lacking).
1181
        # We ignore the conflicts returned by wt.revert since we're about to
1182
        # 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
1183
        # detritus. But see bug #634470 about subtree .bzr dirs.
5409.1.7 by Vincent Ladeuil
First orphaning implementation (some tests lacking).
1184
        conflicts = wt.revert(old_tree=empty)
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1185
        self.destroy_workingtree_metadata()
1186
1187
    def destroy_workingtree_metadata(self):
1188
        self.transport.delete_tree('checkout')
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
1189
5147.4.1 by Jelmer Vernooij
Pass branch names in more places.
1190
    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.
1191
        """Find the branch 'format' for this bzrdir.
1192
1193
        This might be a synthetic object for e.g. RemoteBranch and SVN.
1194
        """
1195
        from bzrlib.branch import BranchFormat
5147.4.3 by Jelmer Vernooij
Support branch name argument to BzrDir.get_branch_reference.
1196
        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.
1197
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1198
    def _get_mkdir_mode(self):
1199
        """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
1200
        temp_control = lockable_files.LockableFiles(self.transport, '',
1201
                                     lockable_files.TransportLock)
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1202
        return temp_control._dir_mode
1203
5147.4.3 by Jelmer Vernooij
Support branch name argument to BzrDir.get_branch_reference.
1204
    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.
1205
        """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)
1206
        from bzrlib.branch import BranchFormat
5147.4.3 by Jelmer Vernooij
Support branch name argument to BzrDir.get_branch_reference.
1207
        format = BranchFormat.find_format(self, name=name)
1208
        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.
1209
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1210
    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.
1211
        """See BzrDir.get_branch_transport()."""
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1212
        if name is not None:
1213
            raise errors.NoColocatedBranchSupport(self)
4570.3.6 by Martin Pool
doc
1214
        # XXX: this shouldn't implicitly create the directory if it's just
1215
        # 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.
1216
        if branch_format is None:
1217
            return self.transport.clone('branch')
1218
        try:
1219
            branch_format.get_format_string()
1220
        except NotImplementedError:
1221
            raise errors.IncompatibleFormat(branch_format, self._format)
1222
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1223
            self.transport.mkdir('branch', mode=self._get_mkdir_mode())
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1224
        except errors.FileExists:
1225
            pass
1226
        return self.transport.clone('branch')
1227
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1228
    def get_repository_transport(self, repository_format):
1229
        """See BzrDir.get_repository_transport()."""
1230
        if repository_format is None:
1231
            return self.transport.clone('repository')
1232
        try:
1233
            repository_format.get_format_string()
1234
        except NotImplementedError:
1235
            raise errors.IncompatibleFormat(repository_format, self._format)
1236
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1237
            self.transport.mkdir('repository', mode=self._get_mkdir_mode())
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1238
        except errors.FileExists:
1239
            pass
1240
        return self.transport.clone('repository')
1241
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
1242
    def get_workingtree_transport(self, workingtree_format):
1243
        """See BzrDir.get_workingtree_transport()."""
1244
        if workingtree_format is None:
1245
            return self.transport.clone('checkout')
1246
        try:
1247
            workingtree_format.get_format_string()
1248
        except NotImplementedError:
1249
            raise errors.IncompatibleFormat(workingtree_format, self._format)
1250
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1251
            self.transport.mkdir('checkout', mode=self._get_mkdir_mode())
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
1252
        except errors.FileExists:
1253
            pass
1254
        return self.transport.clone('checkout')
1255
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.
1256
    def has_workingtree(self):
1257
        """Tell if this bzrdir contains a working tree.
1258
1259
        Note: if you're going to open the working tree, you should just go
1260
        ahead and try, and not ask permission first.
1261
        """
1262
        from bzrlib.workingtree import WorkingTreeFormat
1263
        try:
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
1264
            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.
1265
        except errors.NoWorkingTree:
1266
            return False
1267
        return True
1268
5670.1.1 by Jelmer Vernooij
Remove all methods and arguments that were deprecated before bzr 2.0.0.
1269
    def needs_format_conversion(self, format):
1534.5.16 by Robert Collins
Review feedback.
1270
        """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.
1271
        if not isinstance(self._format, format.__class__):
1272
            # it is not a meta dir format, conversion is needed.
1273
            return True
1274
        # we might want to push this down to the repository?
1275
        try:
1276
            if not isinstance(self.open_repository()._format,
1277
                              format.repository_format.__class__):
1278
                # the repository needs an upgrade.
1279
                return True
1280
        except errors.NoRepositoryPresent:
1281
            pass
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
1282
        for branch in self.list_branches():
1283
            if not isinstance(branch._format,
2230.3.55 by Aaron Bentley
Updates from review
1284
                              format.get_branch_format().__class__):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1285
                # the branch needs an upgrade.
1286
                return True
1287
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1288
            my_wt = self.open_workingtree(recommend_upgrade=False)
1289
            if not isinstance(my_wt._format,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1290
                              format.workingtree_format.__class__):
1291
                # the workingtree needs an upgrade.
1292
                return True
2255.2.196 by Robert Collins
Fix test_upgrade defects related to non local or absent working trees.
1293
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1294
            pass
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1295
        return False
1296
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
1297
    def open_branch(self, name=None, unsupported=False,
1298
                    ignore_fallbacks=False):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1299
        """See BzrDir.open_branch."""
5147.4.3 by Jelmer Vernooij
Support branch name argument to BzrDir.get_branch_reference.
1300
        format = self.find_branch_format(name=name)
5717.1.7 by Jelmer Vernooij
Rename check_status -> check_support_status.
1301
        format.check_support_status(unsupported)
5051.3.13 by Jelmer Vernooij
Pass colocated branch name around rather than raising an exception directly.
1302
        return format.open(self, name=name,
1303
            _found=True, ignore_fallbacks=ignore_fallbacks)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1304
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1305
    def open_repository(self, unsupported=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1306
        """See BzrDir.open_repository."""
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1307
        from bzrlib.repository import RepositoryFormat
1308
        format = RepositoryFormat.find_format(self)
5717.1.7 by Jelmer Vernooij
Rename check_status -> check_support_status.
1309
        format.check_support_status(unsupported)
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1310
        return format.open(self, _found=True)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1311
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1312
    def open_workingtree(self, unsupported=False,
1313
            recommend_upgrade=True):
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1314
        """See BzrDir.open_workingtree."""
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1315
        from bzrlib.workingtree import WorkingTreeFormat
1316
        format = WorkingTreeFormat.find_format(self)
5717.1.7 by Jelmer Vernooij
Rename check_status -> check_support_status.
1317
        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
1318
            basedir=self.root_transport.base)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1319
        return format.open(self, _found=True)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1320
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
1321
    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.
1322
        return config.TransportConfig(self.transport, 'control.conf')
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
1323
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1324
5363.2.20 by Jelmer Vernooij
use controldir.X
1325
class BzrProber(controldir.Prober):
5363.2.8 by Jelmer Vernooij
Docstrings.
1326
    """Prober for formats that use a .bzr/ control directory."""
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1327
5712.3.8 by Jelmer Vernooij
Support lazy registration of BzrDir formats.
1328
    formats = registry.FormatRegistry(controldir.network_format_registry)
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1329
    """The known .bzr formats."""
1330
1331
    @classmethod
5712.3.1 by Jelmer Vernooij
Use registry for BzrProber.formats.
1332
    @deprecated_method(deprecated_in((2, 4, 0)))
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1333
    def register_bzrdir_format(klass, format):
5712.3.8 by Jelmer Vernooij
Support lazy registration of BzrDir formats.
1334
        klass.formats.register(format.get_format_string(), format)
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1335
1336
    @classmethod
5712.3.1 by Jelmer Vernooij
Use registry for BzrProber.formats.
1337
    @deprecated_method(deprecated_in((2, 4, 0)))
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
1338
    def unregister_bzrdir_format(klass, format):
5712.3.8 by Jelmer Vernooij
Support lazy registration of BzrDir formats.
1339
        klass.formats.remove(format.get_format_string())
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1340
5363.2.7 by Jelmer Vernooij
Fix tests.
1341
    @classmethod
1342
    def probe_transport(klass, transport):
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1343
        """Return the .bzrdir style format present in a directory."""
1344
        try:
1345
            format_string = transport.get_bytes(".bzr/branch-format")
1346
        except errors.NoSuchFile:
1347
            raise errors.NotBranchError(path=transport.base)
1348
        try:
5712.3.1 by Jelmer Vernooij
Use registry for BzrProber.formats.
1349
            return klass.formats.get(format_string)
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1350
        except KeyError:
1351
            raise errors.UnknownFormatError(format=format_string, kind='bzrdir')
1352
5712.3.15 by Jelmer Vernooij
Remove unused register format functions.
1353
    @classmethod
1354
    def known_formats(cls):
5712.3.13 by Jelmer Vernooij
Add Prober.known_formats().
1355
        result = set()
5712.3.15 by Jelmer Vernooij
Remove unused register format functions.
1356
        for name, format in cls.formats.iteritems():
5712.4.9 by Jelmer Vernooij
Fix lazy control directory discovery.
1357
            if callable(format):
1358
                format = format()
5712.3.13 by Jelmer Vernooij
Add Prober.known_formats().
1359
            result.add(format)
1360
        return result
1361
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1362
5363.2.20 by Jelmer Vernooij
use controldir.X
1363
controldir.ControlDirFormat.register_prober(BzrProber)
1364
1365
1366
class RemoteBzrProber(controldir.Prober):
5363.2.8 by Jelmer Vernooij
Docstrings.
1367
    """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.
1368
1369
    @classmethod
1370
    def probe_transport(klass, transport):
1371
        """Return a RemoteBzrDirFormat object if it looks possible."""
1372
        try:
1373
            medium = transport.get_smart_medium()
1374
        except (NotImplementedError, AttributeError,
1375
                errors.TransportNotPossible, errors.NoSmartMedium,
1376
                errors.SmartProtocolError):
1377
            # no smart server, so not a branch for this format type.
1378
            raise errors.NotBranchError(path=transport.base)
1379
        else:
1380
            # Decline to open it if the server doesn't support our required
1381
            # version (3) so that the VFS-based transport will do it.
1382
            if medium.should_probe():
1383
                try:
1384
                    server_version = medium.protocol_version()
1385
                except errors.SmartProtocolError:
1386
                    # Apparently there's no usable smart server there, even though
1387
                    # the medium supports the smart protocol.
1388
                    raise errors.NotBranchError(path=transport.base)
1389
                if server_version != '2':
1390
                    raise errors.NotBranchError(path=transport.base)
5712.3.13 by Jelmer Vernooij
Add Prober.known_formats().
1391
            from bzrlib.remote import RemoteBzrDirFormat
5363.2.7 by Jelmer Vernooij
Fix tests.
1392
            return RemoteBzrDirFormat()
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1393
5712.3.15 by Jelmer Vernooij
Remove unused register format functions.
1394
    @classmethod
1395
    def known_formats(cls):
5712.3.13 by Jelmer Vernooij
Add Prober.known_formats().
1396
        from bzrlib.remote import RemoteBzrDirFormat
1397
        return set([RemoteBzrDirFormat()])
1398
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
1399
5363.2.20 by Jelmer Vernooij
use controldir.X
1400
class BzrDirFormat(controldir.ControlDirFormat):
5363.2.3 by Jelmer Vernooij
Add ControlDirFormat.
1401
    """ControlDirFormat base class for .bzr/ directories.
1534.4.39 by Robert Collins
Basic BzrDir support.
1402
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1403
    Formats are placed in a dict by their format string for reference
1534.4.39 by Robert Collins
Basic BzrDir support.
1404
    during bzrdir opening. These should be subclasses of BzrDirFormat
1405
    for consistency.
1406
1407
    Once a format is deprecated, just deprecate the initialize and open
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1408
    methods on the format class. Do not deprecate the object, as the
1534.4.39 by Robert Collins
Basic BzrDir support.
1409
    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.
1410
    """
1411
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1412
    _lock_file_name = 'branch-lock'
1413
1414
    # _lock_class must be set in subclasses to the lock type, typ.
1415
    # TransportLock or LockDir
1416
5712.3.15 by Jelmer Vernooij
Remove unused register format functions.
1417
    @classmethod
1418
    def get_format_string(cls):
1534.4.39 by Robert Collins
Basic BzrDir support.
1419
        """Return the ASCII format string that identifies this format."""
5904.1.2 by Martin Pool
Various pyflakes import fixes.
1420
        raise NotImplementedError(cls.get_format_string)
1534.4.39 by Robert Collins
Basic BzrDir support.
1421
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1422
    def initialize_on_transport(self, transport):
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1423
        """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)
1424
        try:
1425
            # can we hand off the request to the smart server rather than using
1426
            # vfs calls?
1427
            client_medium = transport.get_smart_medium()
1428
        except errors.NoSmartMedium:
1429
            return self._initialize_on_transport_vfs(transport)
1430
        else:
1431
            # Current RPC's only know how to create bzr metadir1 instances, so
1432
            # we still delegate to vfs methods if the requested format is not a
1433
            # metadir1
1434
            if type(self) != BzrDirMetaFormat1:
1435
                return self._initialize_on_transport_vfs(transport)
5712.3.13 by Jelmer Vernooij
Add Prober.known_formats().
1436
            from bzrlib.remote import RemoteBzrDirFormat
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
1437
            remote_format = RemoteBzrDirFormat()
1438
            self._supply_sub_formats_to(remote_format)
1439
            return remote_format.initialize_on_transport(transport)
1440
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1441
    def initialize_on_transport_ex(self, transport, use_existing_dir=False,
1442
        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.
1443
        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.
1444
        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.
1445
        """Create this format on transport.
1446
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
1447
        The directory to initialize will be created.
1448
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1449
        :param force_new_repo: Do not use a shared repository for the target,
1450
                               even if one is available.
1451
        :param create_prefix: Create any missing directories leading up to
1452
            to_transport.
1453
        :param use_existing_dir: Use an existing directory if one exists.
1454
        :param stacked_on: A url to stack any created branch on, None to follow
1455
            any target stacking policy.
1456
        :param stack_on_pwd: If stack_on is relative, the location it is
1457
            relative to.
1458
        :param repo_format_name: If non-None, a repository will be
1459
            made-or-found. Should none be found, or if force_new_repo is True
1460
            the repo_format_name is used to select the format of repository to
1461
            create.
1462
        :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.
1463
            for a new shared repository when one is made. None to use whatever
1464
            default the format has.
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1465
        :param shared_repo: Control whether made repositories are shared or
1466
            not.
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
1467
        :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.
1468
        :return: repo, bzrdir, require_stacking, repository_policy. repo is
1469
            None if none was created or found, bzrdir is always valid.
1470
            require_stacking is the result of examining the stacked_on
1471
            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.
1472
        """
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
1473
        if not vfs_only:
1474
            # Try to hand off to a smart server 
1475
            try:
1476
                client_medium = transport.get_smart_medium()
1477
            except errors.NoSmartMedium:
1478
                pass
1479
            else:
5712.3.15 by Jelmer Vernooij
Remove unused register format functions.
1480
                from bzrlib.remote import RemoteBzrDirFormat
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
1481
                # TODO: lookup the local format from a server hint.
1482
                remote_dir_format = RemoteBzrDirFormat()
1483
                remote_dir_format._network_name = self.network_name()
1484
                self._supply_sub_formats_to(remote_dir_format)
1485
                return remote_dir_format.initialize_on_transport_ex(transport,
1486
                    use_existing_dir=use_existing_dir, create_prefix=create_prefix,
1487
                    force_new_repo=force_new_repo, stacked_on=stacked_on,
1488
                    stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
1489
                    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.
1490
        # XXX: Refactor the create_prefix/no_create_prefix code into a
1491
        #      common helper function
1492
        # The destination may not exist - if so make it according to policy.
1493
        def make_directory(transport):
1494
            transport.mkdir('.')
1495
            return transport
1496
        def redirected(transport, e, redirection_notice):
1497
            note(redirection_notice)
1498
            return transport._redirected_to(e.source, e.target)
1499
        try:
1500
            transport = do_catching_redirections(make_directory, transport,
1501
                redirected)
1502
        except errors.FileExists:
1503
            if not use_existing_dir:
1504
                raise
1505
        except errors.NoSuchFile:
1506
            if not create_prefix:
1507
                raise
1508
            transport.create_prefix()
1509
1510
        require_stacking = (stacked_on is not None)
1511
        # Now the target directory exists, but doesn't have a .bzr
1512
        # directory. So we need to create it, along with any work to create
1513
        # all of the dependent branches, etc.
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
1514
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1515
        result = self.initialize_on_transport(transport)
1516
        if repo_format_name:
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
1517
            try:
1518
                # use a custom format
1519
                result._format.repository_format = \
1520
                    repository.network_format_registry.get(repo_format_name)
1521
            except AttributeError:
1522
                # The format didn't permit it to be set.
1523
                pass
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1524
            # A repository is desired, either in-place or shared.
1525
            repository_policy = result.determine_repository_policy(
1526
                force_new_repo, stacked_on, stack_on_pwd,
1527
                require_stacking=require_stacking)
1528
            result_repo, is_new_repo = repository_policy.acquire_repository(
1529
                make_working_trees, shared_repo)
1530
            if not require_stacking and repository_policy._require_stacking:
1531
                require_stacking = True
1532
                result._format.require_stacking()
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
1533
            result_repo.lock_write()
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1534
        else:
1535
            result_repo = None
1536
            repository_policy = None
1537
        return result_repo, result, require_stacking, repository_policy
1538
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
1539
    def _initialize_on_transport_vfs(self, transport):
1540
        """Initialize a new bzrdir using VFS calls.
4032.1.2 by John Arbash Meinel
Track down a few more files that have trailing whitespace.
1541
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
1542
        :param transport: The transport to create the .bzr directory in.
1543
        :return: A
1544
        """
1545
        # Since we are creating a .bzr directory, inherit the
1534.4.39 by Robert Collins
Basic BzrDir support.
1546
        # mode from the root directory
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1547
        temp_control = lockable_files.LockableFiles(transport,
1548
                            '', lockable_files.TransportLock)
1534.4.39 by Robert Collins
Basic BzrDir support.
1549
        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.
1550
                                      # FIXME: RBC 20060121 don't peek under
1534.4.39 by Robert Collins
Basic BzrDir support.
1551
                                      # the covers
1552
                                      mode=temp_control._dir_mode)
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
1553
        if sys.platform == 'win32' and isinstance(transport, local.LocalTransport):
3023.1.2 by Alexander Belchenko
Martin's review.
1554
            win32utils.set_file_attr_hidden(transport._abspath('.bzr'))
1534.4.39 by Robert Collins
Basic BzrDir support.
1555
        file_mode = temp_control._file_mode
1556
        del temp_control
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
1557
        bzrdir_transport = transport.clone('.bzr')
1558
        utf8_files = [('README',
3250.2.1 by Marius Kruger
update .bzr/README to not refer to Bazaar-NG, and add link to website.
1559
                       "This is a Bazaar control directory.\n"
1560
                       "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).
1561
                       "See http://bazaar.canonical.com/ for more information about Bazaar.\n"),
1534.4.39 by Robert Collins
Basic BzrDir support.
1562
                      ('branch-format', self.get_format_string()),
1563
                      ]
1564
        # NB: no need to escape relative paths that are url safe.
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
1565
        control_files = lockable_files.LockableFiles(bzrdir_transport,
1566
            self._lock_file_name, self._lock_class)
1553.5.60 by Martin Pool
New LockableFiles.create_lock() method
1567
        control_files.create_lock()
1534.4.39 by Robert Collins
Basic BzrDir support.
1568
        control_files.lock_write()
1569
        try:
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
1570
            for (filename, content) in utf8_files:
3407.2.12 by Martin Pool
Fix creation mode of control files
1571
                bzrdir_transport.put_bytes(filename, content,
1572
                    mode=file_mode)
1534.4.39 by Robert Collins
Basic BzrDir support.
1573
        finally:
1574
            control_files.unlock()
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
1575
        return self.open(transport, _found=True)
1534.4.39 by Robert Collins
Basic BzrDir support.
1576
1577
    def open(self, transport, _found=False):
1578
        """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
1579
1534.4.39 by Robert Collins
Basic BzrDir support.
1580
        _found is a private parameter, do not use it.
1581
        """
1582
        if not _found:
5363.2.20 by Jelmer Vernooij
use controldir.X
1583
            found_format = controldir.ControlDirFormat.find_format(transport)
2090.2.2 by Martin Pool
Fix an assertion with side effects
1584
            if not isinstance(found_format, self.__class__):
1585
                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
1586
                        "format %s"
2090.2.2 by Martin Pool
Fix an assertion with side effects
1587
                        % (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.
1588
            # Allow subclasses - use the found format.
1589
            self._supply_sub_formats_to(found_format)
1590
            return found_format._open(transport)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1591
        return self._open(transport)
1592
1593
    def _open(self, transport):
1594
        """Template method helper for opening BzrDirectories.
1595
1596
        This performs the actual open and any additional logic or parameter
1597
        passing.
1598
        """
1599
        raise NotImplementedError(self._open)
1534.4.39 by Robert Collins
Basic BzrDir support.
1600
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.
1601
    def _supply_sub_formats_to(self, other_format):
1602
        """Give other_format the same values for sub formats as this has.
1603
1604
        This method is expected to be used when parameterising a
1605
        RemoteBzrDirFormat instance with the parameters from a
1606
        BzrDirMetaFormat1 instance.
1607
1608
        :param other_format: other_format is a format which should be
1609
            compatible with whatever sub formats are supported by self.
1610
        :return: None.
1611
        """
1612
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1613
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1614
class BzrDirMetaFormat1(BzrDirFormat):
1615
    """Bzr meta control format 1
1616
1617
    This is the first format with split out working tree, branch and repository
1618
    disk storage.
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
1619
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1620
    It has:
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
1621
1622
    - Format 3 working trees [optional]
1623
    - Format 5 branches [optional]
1624
    - 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.
1625
    """
1626
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1627
    _lock_class = lockdir.LockDir
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1628
5673.1.3 by Jelmer Vernooij
Change flexible_components to fixed_components.
1629
    fixed_components = False
1630
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
1631
    def __init__(self):
1632
        self._workingtree_format = None
2230.3.1 by Aaron Bentley
Get branch6 creation working
1633
        self._branch_format = None
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
1634
        self._repository_format = None
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
1635
2100.3.15 by Aaron Bentley
get test suite passing
1636
    def __eq__(self, other):
1637
        if other.__class__ is not self.__class__:
1638
            return False
1639
        if other.repository_format != self.repository_format:
1640
            return False
1641
        if other.workingtree_format != self.workingtree_format:
1642
            return False
1643
        return True
1644
2100.3.35 by Aaron Bentley
equality operations on bzrdir
1645
    def __ne__(self, other):
1646
        return not self == other
1647
2230.3.55 by Aaron Bentley
Updates from review
1648
    def get_branch_format(self):
2230.3.1 by Aaron Bentley
Get branch6 creation working
1649
        if self._branch_format is None:
5662.2.2 by Jelmer Vernooij
Move most format registration functions to BranchFormatRegistry.
1650
            from bzrlib.branch import format_registry as branch_format_registry
1651
            self._branch_format = branch_format_registry.get_default()
2230.3.1 by Aaron Bentley
Get branch6 creation working
1652
        return self._branch_format
1653
2230.3.55 by Aaron Bentley
Updates from review
1654
    def set_branch_format(self, format):
2230.3.1 by Aaron Bentley
Get branch6 creation working
1655
        self._branch_format = format
1656
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.
1657
    def require_stacking(self, stack_on=None, possible_transports=None,
1658
            _skip_repo=False):
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
1659
        """We have a request to stack, try to ensure the formats support it.
1660
1661
        :param stack_on: If supplied, it is the URL to a branch that we want to
1662
            stack on. Check to see if that format supports stacking before
1663
            forcing an upgrade.
1664
        """
1665
        # Stacking is desired. requested by the target, but does the place it
1666
        # points at support stacking? If it doesn't then we should
1667
        # not implicitly upgrade. We check this here.
1668
        new_repo_format = None
1669
        new_branch_format = None
1670
1671
        # a bit of state for get_target_branch so that we don't try to open it
1672
        # 2 times, for both repo *and* branch
1673
        target = [None, False, None] # target_branch, checked, upgrade anyway
1674
        def get_target_branch():
1675
            if target[1]:
1676
                # We've checked, don't check again
1677
                return target
1678
            if stack_on is None:
1679
                # No target format, that means we want to force upgrading
1680
                target[:] = [None, True, True]
1681
                return target
1682
            try:
1683
                target_dir = BzrDir.open(stack_on,
1684
                    possible_transports=possible_transports)
1685
            except errors.NotBranchError:
1686
                # Nothing there, don't change formats
1687
                target[:] = [None, True, False]
1688
                return target
1689
            except errors.JailBreak:
1690
                # JailBreak, JFDI and upgrade anyway
1691
                target[:] = [None, True, True]
1692
                return target
1693
            try:
1694
                target_branch = target_dir.open_branch()
1695
            except errors.NotBranchError:
1696
                # No branch, don't upgrade formats
1697
                target[:] = [None, True, False]
1698
                return target
1699
            target[:] = [target_branch, True, False]
1700
            return target
1701
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.
1702
        if (not _skip_repo and
1703
                 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.
1704
            # We need to upgrade the Repository.
1705
            target_branch, _, do_upgrade = get_target_branch()
1706
            if target_branch is None:
1707
                # We don't have a target branch, should we upgrade anyway?
1708
                if do_upgrade:
1709
                    # stack_on is inaccessible, JFDI.
1710
                    # TODO: bad monkey, hard-coded formats...
1711
                    if self.repository_format.rich_root_data:
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
1712
                        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.
1713
                    else:
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
1714
                        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.
1715
            else:
1716
                # If the target already supports stacking, then we know the
1717
                # project is already able to use stacking, so auto-upgrade
1718
                # for them
1719
                new_repo_format = target_branch.repository._format
1720
                if not new_repo_format.supports_external_lookups:
1721
                    # target doesn't, source doesn't, so don't auto upgrade
1722
                    # repo
1723
                    new_repo_format = None
1724
            if new_repo_format is not None:
1725
                self.repository_format = new_repo_format
1726
                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.
1727
                     ' 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.
1728
                     new_repo_format.get_format_description())
1729
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
1730
        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.
1731
            # We just checked the repo, now lets check if we need to
1732
            # upgrade the branch format
1733
            target_branch, _, do_upgrade = get_target_branch()
1734
            if target_branch is None:
1735
                if do_upgrade:
1736
                    # TODO: bad monkey, hard-coded formats...
5675.2.6 by Jelmer Vernooij
Fix some tests.
1737
                    from bzrlib.branch import BzrBranchFormat7
1738
                    new_branch_format = BzrBranchFormat7()
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
1739
            else:
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
1740
                new_branch_format = target_branch._format
1741
                if not new_branch_format.supports_stacking():
1742
                    new_branch_format = None
1743
            if new_branch_format is not None:
1744
                # Does support stacking, use its format.
1745
                self.set_branch_format(new_branch_format)
1746
                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.
1747
                     ' 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.
1748
                     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.
1749
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.
1750
    def get_converter(self, format=None):
1751
        """See BzrDirFormat.get_converter()."""
1752
        if format is None:
1753
            format = BzrDirFormat.get_default_format()
1754
        if not isinstance(self, format.__class__):
1755
            # converting away from metadir is not implemented
1756
            raise NotImplementedError(self.get_converter)
1757
        return ConvertMetaToMeta(format)
1758
5712.3.15 by Jelmer Vernooij
Remove unused register format functions.
1759
    @classmethod
1760
    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.
1761
        """See BzrDirFormat.get_format_string()."""
1762
        return "Bazaar-NG meta directory, format 1\n"
1763
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
1764
    def get_format_description(self):
1765
        """See BzrDirFormat.get_format_description()."""
1766
        return "Meta directory format 1"
1767
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
1768
    def network_name(self):
1769
        return self.get_format_string()
1770
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1771
    def _open(self, transport):
1772
        """See BzrDirFormat._open."""
4294.2.12 by Robert Collins
Prevent aliasing issues with BzrDirMetaFormat1 by making a new format object in _open.
1773
        # Create a new format instance because otherwise initialisation of new
1774
        # metadirs share the global default format object leading to alias
1775
        # problems.
1776
        format = BzrDirMetaFormat1()
1777
        self._supply_sub_formats_to(format)
1778
        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.
1779
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1780
    def __return_repository_format(self):
1781
        """Circular import protection."""
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
1782
        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.
1783
            return self._repository_format
5651.3.2 by Jelmer Vernooij
Fix deprecation warnings in test suite.
1784
        from bzrlib.repository import format_registry
1785
        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.
1786
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.
1787
    def _set_repository_format(self, value):
3015.2.8 by Robert Collins
Typo in __set_repository_format's docstring.
1788
        """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.
1789
        self._repository_format = value
1553.5.72 by Martin Pool
Clean up test for Branch5 lockdirs
1790
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.
1791
    repository_format = property(__return_repository_format,
1792
        _set_repository_format)
1793
1794
    def _supply_sub_formats_to(self, other_format):
1795
        """Give other_format the same values for sub formats as this has.
1796
1797
        This method is expected to be used when parameterising a
1798
        RemoteBzrDirFormat instance with the parameters from a
1799
        BzrDirMetaFormat1 instance.
1800
1801
        :param other_format: other_format is a format which should be
1802
            compatible with whatever sub formats are supported by self.
1803
        :return: None.
1804
        """
1805
        if getattr(self, '_repository_format', None) is not None:
1806
            other_format.repository_format = self.repository_format
1807
        if self._branch_format is not None:
1808
            other_format._branch_format = self._branch_format
1809
        if self._workingtree_format is not None:
1810
            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.
1811
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
1812
    def __get_workingtree_format(self):
1813
        if self._workingtree_format is None:
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
1814
            from bzrlib.workingtree import (
1815
                format_registry as wt_format_registry,
1816
                )
1817
            self._workingtree_format = wt_format_registry.get_default()
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
1818
        return self._workingtree_format
1819
1820
    def __set_workingtree_format(self, wt_format):
1821
        self._workingtree_format = wt_format
1822
1823
    workingtree_format = property(__get_workingtree_format,
1824
                                  __set_workingtree_format)
1825
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1826
2164.2.13 by v.ladeuil+lp at free
Add tests for redirection. Preserve transport decorations.
1827
# 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.
1828
BzrProber.formats.register(BzrDirMetaFormat1.get_format_string(),
1829
    BzrDirMetaFormat1)
1830
controldir.ControlDirFormat._default_format = BzrDirMetaFormat1()
1534.4.39 by Robert Collins
Basic BzrDir support.
1831
1832
5692.1.1 by Jelmer Vernooij
Move Converter (which is generic) from bzrlib.bzrdir to bzrlib.controldir.
1833
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.
1834
    """Converts the components of metadirs."""
1835
1836
    def __init__(self, target_format):
1837
        """Create a metadir to metadir converter.
1838
1839
        :param target_format: The final metadir format that is desired.
1840
        """
1841
        self.target_format = target_format
1842
1843
    def convert(self, to_convert, pb):
1844
        """See Converter.convert()."""
1845
        self.bzrdir = to_convert
4961.2.14 by Martin Pool
Further pb cleanups
1846
        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.
1847
        self.count = 0
1848
        self.total = 1
1849
        self.step('checking repository format')
1850
        try:
1851
            repo = self.bzrdir.open_repository()
1852
        except errors.NoRepositoryPresent:
1853
            pass
1854
        else:
1855
            if not isinstance(repo._format, self.target_format.repository_format.__class__):
1856
                from bzrlib.repository import CopyConverter
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
1857
                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.
1858
                converter = CopyConverter(self.target_format.repository_format)
1859
                converter.convert(repo, pb)
4997.1.3 by Jelmer Vernooij
Use list_branches during upgrades.
1860
        for branch in self.bzrdir.list_branches():
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1861
            # TODO: conversions of Branch and Tree should be done by
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
1862
            # InterXFormat lookups/some sort of registry.
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
1863
            # Avoid circular imports
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
1864
            old = branch._format.__class__
1865
            new = self.target_format.get_branch_format().__class__
1866
            while old != new:
1867
                if (old == _mod_branch.BzrBranchFormat5 and
1868
                    new in (_mod_branch.BzrBranchFormat6,
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
1869
                        _mod_branch.BzrBranchFormat7,
1870
                        _mod_branch.BzrBranchFormat8)):
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
1871
                    branch_converter = _mod_branch.Converter5to6()
1872
                elif (old == _mod_branch.BzrBranchFormat6 and
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
1873
                    new in (_mod_branch.BzrBranchFormat7,
1874
                            _mod_branch.BzrBranchFormat8)):
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
1875
                    branch_converter = _mod_branch.Converter6to7()
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
1876
                elif (old == _mod_branch.BzrBranchFormat7 and
1877
                      new is _mod_branch.BzrBranchFormat8):
1878
                    branch_converter = _mod_branch.Converter7to8()
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
1879
                else:
4608.1.3 by Martin Pool
BadConversionTarget error includes source format
1880
                    raise errors.BadConversionTarget("No converter", new,
1881
                        branch._format)
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
1882
                branch_converter.convert(branch)
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
1883
                branch = self.bzrdir.open_branch()
1884
                old = branch._format.__class__
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1885
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1886
            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.
1887
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1888
            pass
1889
        else:
1890
            # TODO: conversions of Branch and Tree should be done by
1891
            # InterXFormat lookups
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
1892
            if (isinstance(tree, workingtree_3.WorkingTree3) and
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
1893
                not isinstance(tree, workingtree_4.DirStateWorkingTree) and
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1894
                isinstance(self.target_format.workingtree_format,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
1895
                    workingtree_4.DirStateWorkingTreeFormat)):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1896
                workingtree_4.Converter3to4().convert(tree)
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
1897
            if (isinstance(tree, workingtree_4.DirStateWorkingTree) and
1898
                not isinstance(tree, workingtree_4.WorkingTree5) and
3586.1.8 by Ian Clatworthy
add workingtree_5 and initial upgrade code
1899
                isinstance(self.target_format.workingtree_format,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
1900
                    workingtree_4.WorkingTreeFormat5)):
1901
                workingtree_4.Converter4to5().convert(tree)
4210.4.2 by Ian Clatworthy
split filtered views support out into WorkingTreeFormat6
1902
            if (isinstance(tree, workingtree_4.DirStateWorkingTree) and
1903
                not isinstance(tree, workingtree_4.WorkingTree6) and
1904
                isinstance(self.target_format.workingtree_format,
1905
                    workingtree_4.WorkingTreeFormat6)):
1906
                workingtree_4.Converter4or5to6().convert(tree)
4961.2.14 by Martin Pool
Further pb cleanups
1907
        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.
1908
        return to_convert
1731.2.18 by Aaron Bentley
Get extract in repository under test
1909
1910
5363.2.20 by Jelmer Vernooij
use controldir.X
1911
controldir.ControlDirFormat.register_server_prober(RemoteBzrProber)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
1912
1913
3242.2.14 by Aaron Bentley
Update from review comments
1914
class RepositoryAcquisitionPolicy(object):
1915
    """Abstract base class for repository acquisition policies.
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
1916
3242.2.14 by Aaron Bentley
Update from review comments
1917
    A repository acquisition policy decides how a BzrDir acquires a repository
1918
    for a branch that is being created.  The most basic policy decision is
1919
    whether to create a new repository or use an existing one.
1920
    """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1921
    def __init__(self, stack_on, stack_on_pwd, require_stacking):
3242.3.35 by Aaron Bentley
Cleanups and documentation
1922
        """Constructor.
1923
1924
        :param stack_on: A location to stack on
1925
        :param stack_on_pwd: If stack_on is relative, the location it is
1926
            relative to.
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1927
        :param require_stacking: If True, it is a failure to not stack.
3242.3.35 by Aaron Bentley
Cleanups and documentation
1928
        """
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
1929
        self._stack_on = stack_on
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
1930
        self._stack_on_pwd = stack_on_pwd
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1931
        self._require_stacking = require_stacking
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
1932
1933
    def configure_branch(self, branch):
3242.2.13 by Aaron Bentley
Update docs
1934
        """Apply any configuration data from this policy to the branch.
1935
3242.3.18 by Aaron Bentley
Clean up repository-policy work
1936
        Default implementation sets repository stacking.
3242.2.13 by Aaron Bentley
Update docs
1937
        """
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
1938
        if self._stack_on is None:
1939
            return
1940
        if self._stack_on_pwd is None:
1941
            stack_on = self._stack_on
1942
        else:
1943
            try:
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
1944
                stack_on = urlutils.rebase_url(self._stack_on,
1945
                    self._stack_on_pwd,
5158.6.9 by Martin Pool
Simplify various code to use user_url
1946
                    branch.user_url)
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
1947
            except errors.InvalidRebaseURLs:
1948
                stack_on = self._get_full_stack_on()
3242.3.37 by Aaron Bentley
Updates from reviews
1949
        try:
3537.3.5 by Martin Pool
merge trunk including stacking policy
1950
            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.
1951
        except (errors.UnstackableBranchFormat,
1952
                errors.UnstackableRepositoryFormat):
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1953
            if self._require_stacking:
1954
                raise
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
1955
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.
1956
    def requires_stacking(self):
1957
        """Return True if this policy requires stacking."""
1958
        return self._stack_on is not None and self._require_stacking
1959
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
1960
    def _get_full_stack_on(self):
3242.3.35 by Aaron Bentley
Cleanups and documentation
1961
        """Get a fully-qualified URL for the stack_on location."""
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
1962
        if self._stack_on is None:
1963
            return None
1964
        if self._stack_on_pwd is None:
1965
            return self._stack_on
1966
        else:
1967
            return urlutils.join(self._stack_on_pwd, self._stack_on)
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
1968
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
1969
    def _add_fallback(self, repository, possible_transports=None):
3242.3.35 by Aaron Bentley
Cleanups and documentation
1970
        """Add a fallback to the supplied repository, if stacking is set."""
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
1971
        stack_on = self._get_full_stack_on()
1972
        if stack_on is None:
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
1973
            return
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
1974
        try:
1975
            stacked_dir = BzrDir.open(stack_on,
1976
                                      possible_transports=possible_transports)
1977
        except errors.JailBreak:
1978
            # We keep the stacking details, but we are in the server code so
1979
            # actually stacking is not needed.
1980
            return
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
1981
        try:
1982
            stacked_repo = stacked_dir.open_branch().repository
1983
        except errors.NotBranchError:
1984
            stacked_repo = stacked_dir.open_repository()
3242.3.37 by Aaron Bentley
Updates from reviews
1985
        try:
1986
            repository.add_fallback_repository(stacked_repo)
1987
        except errors.UnstackableRepositoryFormat:
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1988
            if self._require_stacking:
1989
                raise
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
1990
        else:
1991
            self._require_stacking = True
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
1992
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
1993
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
1994
        """Acquire a repository for this bzrdir.
1995
1996
        Implementations may create a new repository or use a pre-exising
1997
        repository.
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
1998
3242.2.14 by Aaron Bentley
Update from review comments
1999
        :param make_working_trees: If creating a repository, set
2000
            make_working_trees to this value (if non-None)
2001
        :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.
2002
        :return: A repository, is_new_flag (True if the repository was
2003
            created).
3242.2.14 by Aaron Bentley
Update from review comments
2004
        """
2005
        raise NotImplemented(RepositoryAcquisitionPolicy.acquire_repository)
2006
2007
2008
class CreateRepository(RepositoryAcquisitionPolicy):
3242.2.13 by Aaron Bentley
Update docs
2009
    """A policy of creating a new repository"""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
2010
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
2011
    def __init__(self, bzrdir, stack_on=None, stack_on_pwd=None,
2012
                 require_stacking=False):
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
2013
        """Constructor.
2014
3242.3.35 by Aaron Bentley
Cleanups and documentation
2015
        :param bzrdir: The bzrdir to create the repository on.
2016
        :param stack_on: A location to stack on
2017
        :param stack_on_pwd: If stack_on is relative, the location it is
2018
            relative to.
2019
        """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
2020
        RepositoryAcquisitionPolicy.__init__(self, stack_on, stack_on_pwd,
2021
                                             require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
2022
        self._bzrdir = bzrdir
2023
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
2024
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
2025
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
3242.2.13 by Aaron Bentley
Update docs
2026
3242.2.14 by Aaron Bentley
Update from review comments
2027
        Creates the desired repository in the bzrdir we already have.
3242.2.13 by Aaron Bentley
Update docs
2028
        """
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.
2029
        stack_on = self._get_full_stack_on()
2030
        if stack_on:
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
2031
            format = self._bzrdir._format
2032
            format.require_stacking(stack_on=stack_on,
2033
                                    possible_transports=[self._bzrdir.root_transport])
2034
            if not self._require_stacking:
2035
                # We have picked up automatic stacking somewhere.
2036
                note('Using default stacking branch %s at %s', self._stack_on,
2037
                    self._stack_on_pwd)
3650.3.9 by Aaron Bentley
Move responsibility for stackable repo format to _get_metadir
2038
        repository = self._bzrdir.create_repository(shared=shared)
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
2039
        self._add_fallback(repository,
2040
                           possible_transports=[self._bzrdir.transport])
3242.2.4 by Aaron Bentley
Only set working tree policty when specified
2041
        if make_working_trees is not None:
3242.3.6 by Aaron Bentley
Work around strange test failure
2042
            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.
2043
        return repository, True
3242.2.2 by Aaron Bentley
Merge policy updates from stacked-policy thread
2044
2045
3242.2.14 by Aaron Bentley
Update from review comments
2046
class UseExistingRepository(RepositoryAcquisitionPolicy):
3242.2.13 by Aaron Bentley
Update docs
2047
    """A policy of reusing an existing repository"""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
2048
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
2049
    def __init__(self, repository, stack_on=None, stack_on_pwd=None,
2050
                 require_stacking=False):
3242.3.35 by Aaron Bentley
Cleanups and documentation
2051
        """Constructor.
2052
2053
        :param repository: The repository to use.
2054
        :param stack_on: A location to stack on
2055
        :param stack_on_pwd: If stack_on is relative, the location it is
2056
            relative to.
2057
        """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
2058
        RepositoryAcquisitionPolicy.__init__(self, stack_on, stack_on_pwd,
2059
                                             require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
2060
        self._repository = repository
2061
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
2062
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
2063
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
3242.2.13 by Aaron Bentley
Update docs
2064
4070.9.8 by Andrew Bennetts
Use MiniSearchResult in clone_on_transport down (further tightening the test_push ratchets), and improve acquire_repository docstrings.
2065
        Returns an existing repository to use.
3242.2.13 by Aaron Bentley
Update docs
2066
        """
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
2067
        self._add_fallback(self._repository,
2068
                       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.
2069
        return self._repository, False
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
2070
2071
5363.2.9 by Jelmer Vernooij
Fix some tests.
2072
def register_metadir(registry, key,
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
2073
         repository_format, help, native=True, deprecated=False,
2074
         branch_format=None,
2075
         tree_format=None,
2076
         hidden=False,
2077
         experimental=False,
2078
         alias=False):
2079
    """Register a metadir subformat.
2080
2081
    These all use a BzrDirMetaFormat1 bzrdir, but can be parameterized
2082
    by the Repository/Branch/WorkingTreeformats.
2083
2084
    :param repository_format: The fully-qualified repository format class
2085
        name as a string.
2086
    :param branch_format: Fully-qualified branch format class name as
2087
        a string.
2088
    :param tree_format: Fully-qualified tree format class name as
2089
        a string.
2090
    """
2091
    # This should be expanded to support setting WorkingTree and Branch
2092
    # formats, once BzrDirMetaFormat1 supports that.
2093
    def _load(full_name):
2094
        mod_name, factory_name = full_name.rsplit('.', 1)
2095
        try:
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
2096
            factory = pyutils.get_named_object(mod_name, factory_name)
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
2097
        except ImportError, e:
2098
            raise ImportError('failed to load %s: %s' % (full_name, e))
2099
        except AttributeError:
2100
            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__.
2101
                % (full_name, sys.modules[mod_name]))
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
2102
        return factory()
2103
2104
    def helper():
2105
        bd = BzrDirMetaFormat1()
2106
        if branch_format is not None:
2107
            bd.set_branch_format(_load(branch_format))
2108
        if tree_format is not None:
2109
            bd.workingtree_format = _load(tree_format)
2110
        if repository_format is not None:
2111
            bd.repository_format = _load(repository_format)
2112
        return bd
5363.2.9 by Jelmer Vernooij
Fix some tests.
2113
    registry.register(key, helper, help, native, deprecated, hidden,
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
2114
        experimental, alias)
2115
5363.2.20 by Jelmer Vernooij
use controldir.X
2116
register_metadir(controldir.format_registry, 'knit',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2117
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
2118
    'Format using knits.  Recommended for interoperation with bzr <= 0.14.',
2119
    branch_format='bzrlib.branch.BzrBranchFormat5',
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
2120
    tree_format='bzrlib.workingtree_3.WorkingTreeFormat3',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2121
    hidden=True,
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2122
    deprecated=True)
5363.2.20 by Jelmer Vernooij
use controldir.X
2123
register_metadir(controldir.format_registry, 'dirstate',
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2124
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
2125
    help='New in 0.15: Fast local operations. Compatible with bzr 0.8 and '
2126
        'above when accessed over the network.',
2127
    branch_format='bzrlib.branch.BzrBranchFormat5',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2128
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2129
    hidden=True,
3892.1.1 by Ian Clatworthy
improve help on storage formats
2130
    deprecated=True)
5363.2.20 by Jelmer Vernooij
use controldir.X
2131
register_metadir(controldir.format_registry, 'dirstate-tags',
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
2132
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
2133
    help='New in 0.15: Fast local operations and improved scaling for '
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2134
        'network operations. Additionally adds support for tags.'
2135
        ' Incompatible with bzr < 0.15.',
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
2136
    branch_format='bzrlib.branch.BzrBranchFormat6',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2137
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2138
    hidden=True,
3892.1.1 by Ian Clatworthy
improve help on storage formats
2139
    deprecated=True)
5363.2.20 by Jelmer Vernooij
use controldir.X
2140
register_metadir(controldir.format_registry, 'rich-root',
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
2141
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
2142
    help='New in 1.0.  Better handling of tree roots.  Incompatible with'
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2143
        ' bzr < 1.0.',
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
2144
    branch_format='bzrlib.branch.BzrBranchFormat6',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2145
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2146
    hidden=True,
3892.1.1 by Ian Clatworthy
improve help on storage formats
2147
    deprecated=True)
5363.2.20 by Jelmer Vernooij
use controldir.X
2148
register_metadir(controldir.format_registry, 'dirstate-with-subtree',
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2149
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
2150
    help='New in 0.15: Fast local operations and improved scaling for '
2151
        'network operations. Additionally adds support for versioning nested '
2152
        'bzr branches. Incompatible with bzr < 0.15.',
2153
    branch_format='bzrlib.branch.BzrBranchFormat6',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2154
    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.
2155
    experimental=True,
3170.4.4 by Adeodato Simó
Keep the hidden flag for subtree formats after review from Aaron.
2156
    hidden=True,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2157
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2158
register_metadir(controldir.format_registry, 'pack-0.92',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2159
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack1',
2939.2.1 by Ian Clatworthy
use 'knitpack' naming instead of 'experimental' for pack formats
2160
    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
2161
        'dirstate-tags format repositories. Interoperates with '
2162
        '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
2163
        ,
2592.3.22 by Robert Collins
Add new experimental repository formats.
2164
    branch_format='bzrlib.branch.BzrBranchFormat6',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2165
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
2592.3.22 by Robert Collins
Add new experimental repository formats.
2166
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2167
register_metadir(controldir.format_registry, 'pack-0.92-subtree',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2168
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack3',
2939.2.1 by Ian Clatworthy
use 'knitpack' naming instead of 'experimental' for pack formats
2169
    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
2170
        'dirstate-with-subtree format repositories. Interoperates with '
2171
        '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
2172
        ,
2592.3.22 by Robert Collins
Add new experimental repository formats.
2173
    branch_format='bzrlib.branch.BzrBranchFormat6',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2174
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
3190.1.2 by Aaron Bentley
Undo spurious change
2175
    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.
2176
    experimental=True,
2592.3.22 by Robert Collins
Add new experimental repository formats.
2177
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2178
register_metadir(controldir.format_registry, 'rich-root-pack',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2179
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack4',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2180
    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.
2181
         '(needed for bzr-svn and bzr-git).',
2996.2.11 by Aaron Bentley
Implement rich-root-pack format ( #164639)
2182
    branch_format='bzrlib.branch.BzrBranchFormat6',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2183
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2184
    hidden=True,
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
2185
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2186
register_metadir(controldir.format_registry, '1.6',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2187
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack5',
3892.1.6 by Ian Clatworthy
include feedback from poolie
2188
    help='A format that allows a branch to indicate that there is another '
2189
         '(stacked) repository that should be used to access data that is '
2190
         'not present locally.',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
2191
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2192
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2193
    hidden=True,
3549.1.5 by Martin Pool
Add stable format names for stacked branches
2194
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2195
register_metadir(controldir.format_registry, '1.6.1-rich-root',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2196
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack5RichRoot',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2197
    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.
2198
         '(needed for bzr-svn and bzr-git).',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
2199
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2200
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2201
    hidden=True,
3549.1.5 by Martin Pool
Add stable format names for stacked branches
2202
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2203
register_metadir(controldir.format_registry, '1.9',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2204
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack6',
3892.1.6 by Ian Clatworthy
include feedback from poolie
2205
    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
2206
         'are smaller in size, have smarter caching and provide faster '
2207
         'performance for most operations.',
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
2208
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2209
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2210
    hidden=True,
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
2211
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2212
register_metadir(controldir.format_registry, '1.9-rich-root',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2213
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack6RichRoot',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2214
    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.
2215
         '(needed for bzr-svn and bzr-git).',
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
2216
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2217
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
2218
    hidden=True,
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
2219
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2220
register_metadir(controldir.format_registry, '1.14',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2221
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack6',
4210.4.2 by Ian Clatworthy
split filtered views support out into WorkingTreeFormat6
2222
    help='A working-tree format that supports content filtering.',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
2223
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2224
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat5',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
2225
    )
5363.2.20 by Jelmer Vernooij
use controldir.X
2226
register_metadir(controldir.format_registry, '1.14-rich-root',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2227
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatKnitPack6RichRoot',
4210.4.1 by Ian Clatworthy
replace experimental development-wt5 formats with 1.14 formats
2228
    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.
2229
         '(needed for bzr-svn and bzr-git).',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
2230
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2231
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat5',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
2232
    )
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)
2233
# The following un-numbered 'development' formats should always just be aliases.
5363.2.20 by Jelmer Vernooij
use controldir.X
2234
register_metadir(controldir.format_registry, 'development-subtree',
5389.1.1 by Jelmer Vernooij
Add development8-subtree.
2235
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2aSubtree',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
2236
    help='Current development format, subtree variant. Can convert data to and '
3221.11.7 by Robert Collins
Merge in real stacked repository work.
2237
        'from pack-0.92-subtree (and anything compatible with '
2238
        'pack-0.92-subtree) format repositories. Repositories and branches in '
2239
        '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
2240
        '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
2241
        'before use.',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
2242
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2243
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
2244
    experimental=True,
4976.2.1 by Ian Clatworthy
Hide most storage formats
2245
    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)
2246
    alias=False, # Restore to being an alias when an actual development subtree format is added
2247
                 # This current non-alias status is simply because we did not introduce a
2248
                 # chk based subtree format.
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
2249
    )
5546.1.1 by Andrew Bennetts
Remove RepositoryFormatCHK1 and RepositoryFormatCHK2.
2250
register_metadir(controldir.format_registry, 'development5-subtree',
5757.1.2 by Jelmer Vernooij
Add separate file for knit pack repository formats.
2251
    'bzrlib.repofmt.knitpack_repo.RepositoryFormatPackDevelopment2Subtree',
5546.1.1 by Andrew Bennetts
Remove RepositoryFormatCHK1 and RepositoryFormatCHK2.
2252
    help='Development format, subtree variant. Can convert data to and '
2253
        'from pack-0.92-subtree (and anything compatible with '
2254
        'pack-0.92-subtree) format repositories. Repositories and branches in '
2255
        'this format can only be read by bzr.dev. Please read '
2256
        'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
2257
        'before use.',
2258
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2259
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
5546.1.1 by Andrew Bennetts
Remove RepositoryFormatCHK1 and RepositoryFormatCHK2.
2260
    experimental=True,
2261
    hidden=True,
2262
    alias=False,
2263
    )
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)
2264
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
2265
# And the development formats above will have aliased one of the following:
5546.1.1 by Andrew Bennetts
Remove RepositoryFormatCHK1 and RepositoryFormatCHK2.
2266
2267
# Finally, the current format.
5363.2.20 by Jelmer Vernooij
use controldir.X
2268
register_metadir(controldir.format_registry, '2a',
4428.2.1 by Martin Pool
Add 2a format
2269
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
2270
    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
2271
        'Uses group-compress storage.\n'
4428.2.6 by Martin Pool
Stupid typo fix
2272
        '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
2273
        # 'storage in packs, 255-way hashed CHK inventory, bencode revision, group compress, '
2274
        # 'rich roots. Supported by bzr 1.16 and later.',
4428.2.1 by Martin Pool
Add 2a format
2275
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2276
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
5389.1.1 by Jelmer Vernooij
Add development8-subtree.
2277
    experimental=False,
4428.2.1 by Martin Pool
Add 2a format
2278
    )
4428.2.2 by Martin Pool
Format 2a should not be hidden
2279
4119.6.2 by Jelmer Vernooij
Use existing alias mechanism for default-rich-root.
2280
# The following format should be an alias for the rich root equivalent 
2281
# of the default format
5363.2.20 by Jelmer Vernooij
use controldir.X
2282
register_metadir(controldir.format_registry, 'default-rich-root',
4599.4.37 by Robert Collins
Fix registration of default-rich-root as 2a.
2283
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
2284
    branch_format='bzrlib.branch.BzrBranchFormat7',
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2285
    tree_format='bzrlib.workingtree_4.WorkingTreeFormat6',
4599.4.23 by Robert Collins
default-rich-root should be an alias still.
2286
    alias=True,
4976.2.1 by Ian Clatworthy
Hide most storage formats
2287
    hidden=True,
4599.4.22 by mbp at sourcefrog
Don't forget to set default-rich-root to 2a too.
2288
    help='Same as 2a.')
2289
3221.11.2 by Robert Collins
Create basic stackable branch facility.
2290
# The current format that is made on 'bzr init'.
6056.2.2 by Vincent Ladeuil
Migrate default_format.
2291
format_name = config.GlobalStack().get('default_format')
2292
controldir.format_registry.set_default(format_name)
5363.2.22 by Jelmer Vernooij
Provide bzrlib.bzrdir.format_registry.
2293
2294
# XXX 2010-08-20 JRV: There is still a lot of code relying on
2295
# bzrlib.bzrdir.format_registry existing. When BzrDir.create/BzrDir.open/etc
2296
# get changed to ControlDir.create/ControlDir.open/etc this should be removed.
2297
format_registry = controldir.format_registry