~bzr-pqm/bzr/bzr.dev

4988.10.3 by John Arbash Meinel
Merge bzr.dev 5007, resolve conflict, update NEWS
1
# Copyright (C) 2006-2010 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
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
28
# TODO: Move old formats into a plugin to make this file smaller.
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
29
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
30
import os
3023.1.1 by Alexander Belchenko
Mark .bzr directories as "hidden" on Windows (#71147)
31
import sys
4961.2.14 by Martin Pool
Further pb cleanups
32
import warnings
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
33
34
from bzrlib.lazy_import import lazy_import
35
lazy_import(globals(), """
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
36
from stat import S_ISDIR
2711.2.1 by Martin Pool
Deprecate BzrDir.create_repository
37
import textwrap
1534.4.39 by Robert Collins
Basic BzrDir support.
38
39
import bzrlib
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
40
from bzrlib import (
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
41
    branch,
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
42
    config,
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
43
    errors,
2776.1.5 by Robert Collins
Add reasonably comprehensive tests for path last modified and per file graph behaviour.
44
    graph,
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
45
    lockable_files,
46
    lockdir,
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
47
    osutils,
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
48
    remote,
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
49
    repository,
1996.3.12 by John Arbash Meinel
Change how 'revision' is imported to avoid problems later
50
    revision as _mod_revision,
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
51
    ui,
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
52
    urlutils,
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
53
    versionedfile,
3023.1.2 by Alexander Belchenko
Martin's review.
54
    win32utils,
55
    workingtree,
56
    workingtree_4,
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
57
    xml4,
58
    xml5,
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
59
    )
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
60
from bzrlib.osutils import (
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
61
    sha_string,
62
    )
3978.3.14 by Jelmer Vernooij
Move BranchBzrDirInter.push() to BzrDir.push().
63
from bzrlib.push import (
64
    PushResult,
65
    )
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
66
from bzrlib.repofmt import pack_repo
2018.5.159 by Andrew Bennetts
Rename SmartClient to _SmartClient.
67
from bzrlib.smart.client import _SmartClient
1563.2.25 by Robert Collins
Merge in upstream.
68
from bzrlib.store.versioned import WeaveStore
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
69
from bzrlib.transactions import WriteTransaction
2164.2.21 by Vincent Ladeuil
Take bundles into account.
70
from bzrlib.transport import (
71
    do_catching_redirections,
72
    get_transport,
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
73
    local,
2164.2.21 by Vincent Ladeuil
Take bundles into account.
74
    )
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
75
from bzrlib.weave import Weave
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
76
""")
77
2164.2.1 by v.ladeuil+lp at free
First rough http branch redirection implementation.
78
from bzrlib.trace import (
79
    mutter,
80
    note,
4580.4.1 by Martin Pool
Give a warning if --hardlink can't be supported
81
    warning,
2164.2.1 by v.ladeuil+lp at free
First rough http branch redirection implementation.
82
    )
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
83
84
from bzrlib import (
4160.1.1 by Robert Collins
Add a BzrDir.pre_open hook for use by the smart server gaol.
85
    hooks,
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
86
    registry,
87
    symbol_versioning,
2711.2.1 by Martin Pool
Deprecate BzrDir.create_repository
88
    )
5158.6.1 by Martin Pool
Add ControlComponent interface and make BzrDir implement it
89
    
90
    
91
class ControlComponent(object):
92
    """Abstract base class for control directory components.
93
    
94
    This provides interfaces that are common across bzrdirs, 
95
    repositories, branches, and workingtree control directories.
96
    
97
    They all expose two urls and transports: the *user* URL is the 
98
    one that stops above the control directory (eg .bzr) and that 
99
    should normally be used in messages, and the *control* URL is
100
    under that in eg .bzr/checkout and is used to read the control
101
    files.
102
    
103
    This can be used as a mixin and is intended to fit with 
104
    foreign formats.
105
    """
106
    
107
    @property
108
    def control_transport(self):
5158.6.4 by Martin Pool
Repository implements ControlComponent too
109
        raise NotImplementedError
5158.6.1 by Martin Pool
Add ControlComponent interface and make BzrDir implement it
110
   
111
    @property
112
    def control_url(self):
113
        return self.control_transport.base
114
    
115
    @property
116
    def user_transport(self):
5158.6.4 by Martin Pool
Repository implements ControlComponent too
117
        raise NotImplementedError
5158.6.1 by Martin Pool
Add ControlComponent interface and make BzrDir implement it
118
        
119
    @property
120
    def user_url(self):
121
        return self.user_transport.base
122
    
123
124
class BzrDir(ControlComponent):
1534.4.39 by Robert Collins
Basic BzrDir support.
125
    """A .bzr control diretory.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
126
1534.4.39 by Robert Collins
Basic BzrDir support.
127
    BzrDir instances let you create or open any of the things that can be
128
    found within .bzr - checkouts, branches and repositories.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
129
3407.2.13 by Martin Pool
Remove indirection through control_files to get transports
130
    :ivar transport:
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
131
        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
132
    :ivar root_transport:
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
133
        a transport connected to the directory this bzr was opened from
134
        (i.e. the parent directory holding the .bzr directory).
3416.2.1 by Martin Pool
Add BzrDir._get_file_mode and _get_dir_mode
135
136
    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.
137
138
    :cvar hooks: An instance of BzrDirHooks.
1534.4.39 by Robert Collins
Basic BzrDir support.
139
    """
140
1687.1.12 by Robert Collins
Hook in the full break-lock ui.
141
    def break_lock(self):
142
        """Invoke break_lock on the first object in the bzrdir.
143
144
        If there is a tree, the tree is opened and break_lock() called.
145
        Otherwise, branch is tried, and finally repository.
146
        """
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
147
        # XXX: This seems more like a UI function than something that really
148
        # belongs in this class.
1687.1.12 by Robert Collins
Hook in the full break-lock ui.
149
        try:
150
            thing_to_unlock = self.open_workingtree()
151
        except (errors.NotLocalUrl, errors.NoWorkingTree):
152
            try:
153
                thing_to_unlock = self.open_branch()
154
            except errors.NotBranchError:
155
                try:
156
                    thing_to_unlock = self.open_repository()
157
                except errors.NoRepositoryPresent:
158
                    return
159
        thing_to_unlock.break_lock()
160
1534.5.16 by Robert Collins
Review feedback.
161
    def can_convert_format(self):
162
        """Return true if this bzrdir is one whose format we can convert from."""
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
163
        return True
164
1910.2.12 by Aaron Bentley
Implement knit repo format 2
165
    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.
166
        """Check that a bzrdir as a whole can be converted to a new format."""
167
        # The only current restriction is that the repository content can be 
168
        # fetched compatibly with the target.
1910.2.12 by Aaron Bentley
Implement knit repo format 2
169
        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.
170
        try:
171
            self.open_repository()._format.check_conversion_target(
172
                target_repo_format)
173
        except errors.NoRepositoryPresent:
174
            # No repo, no problem.
175
            pass
1910.2.12 by Aaron Bentley
Implement knit repo format 2
176
1596.2.1 by Robert Collins
Fix BzrDir.open_containing of unsupported branches.
177
    @staticmethod
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
178
    def _check_supported(format, allow_unsupported,
179
        recommend_upgrade=True,
180
        basedir=None):
181
        """Give an error or warning on old formats.
182
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
183
        :param format: may be any kind of format - workingtree, branch,
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
184
        or repository.
185
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
186
        :param allow_unsupported: If true, allow opening
187
        formats that are strongly deprecated, and which may
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
188
        have limited functionality.
189
190
        :param recommend_upgrade: If true (default), warn
191
        the user through the ui object that they may wish
192
        to upgrade the object.
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
193
        """
2323.5.19 by Martin Pool
No upgrade recommendation on source when cloning
194
        # TODO: perhaps move this into a base Format class; it's not BzrDir
195
        # specific. mbp 20070323
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
196
        if not allow_unsupported and not format.is_supported():
1596.2.1 by Robert Collins
Fix BzrDir.open_containing of unsupported branches.
197
            # see open_downlevel to open legacy branches.
1740.5.6 by Martin Pool
Clean up many exception classes.
198
            raise errors.UnsupportedFormatError(format=format)
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
199
        if recommend_upgrade \
200
            and getattr(format, 'upgrade_recommended', False):
201
            ui.ui_factory.recommend_upgrade(
202
                format.get_format_description(),
203
                basedir)
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
204
3242.3.24 by Aaron Bentley
Fix test failures
205
    def clone(self, url, revision_id=None, force_new_repo=False,
206
              preserve_stacking=False):
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.
207
        """Clone this bzrdir and its contents to url verbatim.
208
3242.3.36 by Aaron Bentley
Updates from review comments
209
        :param url: The url create the clone at.  If url's last component does
210
            not exist, it will be created.
211
        :param revision_id: The tip revision-id to use for any branch or
212
            working tree.  If not None, then the clone operation may tune
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.
213
            itself to download less data.
3242.3.36 by Aaron Bentley
Updates from review comments
214
        :param force_new_repo: Do not use a shared repository for the target
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.
215
                               even if one is available.
3242.3.36 by Aaron Bentley
Updates from review comments
216
        :param preserve_stacking: When cloning a stacked branch, stack the
217
            new branch on top of the other branch's stacked-on branch.
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.
218
        """
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
219
        return self.clone_on_transport(get_transport(url),
220
                                       revision_id=revision_id,
3242.3.24 by Aaron Bentley
Fix test failures
221
                                       force_new_repo=force_new_repo,
222
                                       preserve_stacking=preserve_stacking)
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
223
224
    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.
225
        force_new_repo=False, preserve_stacking=False, stacked_on=None,
4294.2.6 by Robert Collins
Report errors back in the UI layer for push, to use the url the user gave us.
226
        create_prefix=False, use_existing_dir=True):
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
227
        """Clone this bzrdir and its contents to transport verbatim.
228
3242.3.36 by Aaron Bentley
Updates from review comments
229
        :param transport: The transport for the location to produce the clone
230
            at.  If the target directory does not exist, it will be created.
231
        :param revision_id: The tip revision-id to use for any branch or
232
            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()
233
            itself to download less data.
3242.3.35 by Aaron Bentley
Cleanups and documentation
234
        :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()
235
                               even if one is available.
3242.3.22 by Aaron Bentley
Make clone stacking optional
236
        :param preserve_stacking: When cloning a stacked branch, stack the
237
            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.
238
        :param create_prefix: Create any missing directories leading up to
239
            to_transport.
240
        :param use_existing_dir: Use an existing directory if one exists.
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
241
        """
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
242
        # Overview: put together a broad description of what we want to end up
243
        # with; then make as few api calls as possible to do it.
244
        
245
        # We may want to create a repo/branch/tree, if we do so what format
246
        # would we want for each:
3650.5.1 by Aaron Bentley
Fix push to use clone all the time.
247
        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.
248
        format = self.cloning_metadir(require_stacking)
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
249
        
250
        # 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.
251
        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.
252
            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.
253
        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.
254
            local_repo = None
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
255
        try:
256
            local_branch = self.open_branch()
257
        except errors.NotBranchError:
258
            local_branch = None
259
        else:
260
            # enable fallbacks when branch is not a branch reference
261
            if local_branch.repository.has_same_location(local_repo):
262
                local_repo = local_branch.repository
263
            if preserve_stacking:
264
                try:
3650.5.1 by Aaron Bentley
Fix push to use clone all the time.
265
                    stacked_on = local_branch.get_stacked_on_url()
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
266
                except (errors.UnstackableBranchFormat,
267
                        errors.UnstackableRepositoryFormat,
268
                        errors.NotStacked):
269
                    pass
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
270
        # Bug: We create a metadir without knowing if it can support stacking,
271
        # we should look up the policy needs first, or just use it as a hint,
272
        # 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.
273
        if local_repo:
3242.2.14 by Aaron Bentley
Update from review comments
274
            make_working_trees = local_repo.make_working_trees()
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
275
            want_shared = local_repo.is_shared()
276
            repo_format_name = format.repository_format.network_name()
277
        else:
278
            make_working_trees = False
279
            want_shared = False
280
            repo_format_name = None
281
282
        result_repo, result, require_stacking, repository_policy = \
283
            format.initialize_on_transport_ex(transport,
284
            use_existing_dir=use_existing_dir, create_prefix=create_prefix,
285
            force_new_repo=force_new_repo, stacked_on=stacked_on,
286
            stack_on_pwd=self.root_transport.base,
287
            repo_format_name=repo_format_name,
288
            make_working_trees=make_working_trees, shared_repo=want_shared)
289
        if repo_format_name:
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
290
            try:
291
                # If the result repository is in the same place as the
292
                # resulting bzr dir, it will have no content, further if the
293
                # result is not stacked then we know all content should be
294
                # copied, and finally if we are copying up to a specific
295
                # revision_id then we can use the pending-ancestry-result which
296
                # does not require traversing all of history to describe it.
5158.6.9 by Martin Pool
Simplify various code to use user_url
297
                if (result_repo.user_url == result.user_url
298
                    and not require_stacking and
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
299
                    revision_id is not None):
300
                    fetch_spec = graph.PendingAncestryResult(
301
                        [revision_id], local_repo)
302
                    result_repo.fetch(local_repo, fetch_spec=fetch_spec)
303
                else:
304
                    result_repo.fetch(local_repo, revision_id=revision_id)
305
            finally:
306
                result_repo.unlock()
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
307
        else:
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
308
            if result_repo is not None:
309
                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.
310
        # 1 if there is a branch present
311
        #   make sure its content is available in the target repository
312
        #   clone it.
3242.3.37 by Aaron Bentley
Updates from reviews
313
        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.
314
            result_branch = local_branch.clone(result, revision_id=revision_id,
315
                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.
316
        try:
317
            # Cheaper to check if the target is not local, than to try making
318
            # the tree and fail.
319
            result.root_transport.local_abspath('.')
320
            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.
321
                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.
322
        except (errors.NoWorkingTree, errors.NotLocalUrl):
323
            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.
324
        return result
325
1685.1.61 by Martin Pool
[broken] Change BzrDir._make_tail to use urlutils.split
326
    # TODO: This should be given a Transport, and should chdir up; otherwise
327
    # 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.
328
    def _make_tail(self, url):
2475.3.3 by John Arbash Meinel
Change calls to try/mkdir('.')/except FileExists to ensure_base()
329
        t = get_transport(url)
330
        t.ensure_base()
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
331
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
332
    @classmethod
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
333
    def create(cls, base, format=None, possible_transports=None):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
334
        """Create a new BzrDir at the url 'base'.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
335
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
336
        :param format: If supplied, the format of branch to create.  If not
337
            supplied, the default is used.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
338
        :param possible_transports: If supplied, a list of transports that
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
339
            can be reused to share a remote connection.
1534.4.39 by Robert Collins
Basic BzrDir support.
340
        """
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
341
        if cls is not BzrDir:
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
342
            raise AssertionError("BzrDir.create always creates the default"
343
                " format, not one of %r" % cls)
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
344
        t = get_transport(base, possible_transports)
2475.3.3 by John Arbash Meinel
Change calls to try/mkdir('.')/except FileExists to ensure_base()
345
        t.ensure_base()
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
346
        if format is None:
347
            format = BzrDirFormat.get_default_format()
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
348
        return format.initialize_on_transport(t)
1534.4.39 by Robert Collins
Basic BzrDir support.
349
3140.1.1 by Aaron Bentley
Implement find_bzrdir functionality
350
    @staticmethod
351
    def find_bzrdirs(transport, evaluate=None, list_current=None):
352
        """Find bzrdirs recursively from current location.
353
354
        This is intended primarily as a building block for more sophisticated
355
        functionality, like finding trees under a directory, or finding
356
        branches that use a given repository.
357
        :param evaluate: An optional callable that yields recurse, value,
358
            where recurse controls whether this bzrdir is recursed into
359
            and value is the value to yield.  By default, all bzrdirs
360
            are recursed into, and the return value is the bzrdir.
361
        :param list_current: if supplied, use this function to list the current
362
            directory, instead of Transport.list_dir
363
        :return: a generator of found bzrdirs, or whatever evaluate returns.
364
        """
365
        if list_current is None:
366
            def list_current(transport):
367
                return transport.list_dir('')
368
        if evaluate is None:
369
            def evaluate(bzrdir):
370
                return True, bzrdir
371
372
        pending = [transport]
373
        while len(pending) > 0:
374
            current_transport = pending.pop()
375
            recurse = True
376
            try:
377
                bzrdir = BzrDir.open_from_transport(current_transport)
378
            except errors.NotBranchError:
379
                pass
380
            else:
381
                recurse, value = evaluate(bzrdir)
382
                yield value
383
            try:
384
                subdirs = list_current(current_transport)
385
            except errors.NoSuchFile:
386
                continue
387
            if recurse:
388
                for subdir in sorted(subdirs, reverse=True):
389
                    pending.append(current_transport.clone(subdir))
390
4997.1.1 by Jelmer Vernooij
Add BzrDir.list_branches().
391
    def list_branches(self):
4997.1.3 by Jelmer Vernooij
Use list_branches during upgrades.
392
        """Return a sequence of all branches local to this control directory.
4997.1.1 by Jelmer Vernooij
Add BzrDir.list_branches().
393
394
        """
395
        try:
396
            return [self.open_branch()]
397
        except errors.NotBranchError:
398
            return []
399
3140.1.3 by Aaron Bentley
Add support for finding branches to BzrDir
400
    @staticmethod
401
    def find_branches(transport):
3140.1.7 by Aaron Bentley
Update docs
402
        """Find all branches under a transport.
403
404
        This will find all branches below the transport, including branches
405
        inside other branches.  Where possible, it will use
406
        Repository.find_branches.
407
408
        To list all the branches that use a particular Repository, see
409
        Repository.find_branches
410
        """
3140.1.3 by Aaron Bentley
Add support for finding branches to BzrDir
411
        def evaluate(bzrdir):
412
            try:
413
                repository = bzrdir.open_repository()
414
            except errors.NoRepositoryPresent:
415
                pass
416
            else:
4997.1.2 by Jelmer Vernooij
Use list_branches rather than open_branch in find_branches.
417
                return False, ([], repository)
418
            return True, (bzrdir.list_branches(), None)
419
        ret = []
420
        for branches, repo in BzrDir.find_bzrdirs(transport,
421
                                                  evaluate=evaluate):
3140.1.3 by Aaron Bentley
Add support for finding branches to BzrDir
422
            if repo is not None:
4997.1.2 by Jelmer Vernooij
Use list_branches rather than open_branch in find_branches.
423
                ret.extend(repo.find_branches())
424
            if branches is not None:
425
                ret.extend(branches)
426
        return ret
3140.1.3 by Aaron Bentley
Add support for finding branches to BzrDir
427
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
428
    def destroy_repository(self):
429
        """Destroy the repository in this BzrDir"""
430
        raise NotImplementedError(self.destroy_repository)
431
5051.3.2 by Jelmer Vernooij
Add name argument to BzrDir.create_branch().
432
    def create_branch(self, name=None):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
433
        """Create a branch in this BzrDir.
434
5051.3.2 by Jelmer Vernooij
Add name argument to BzrDir.create_branch().
435
        :param name: Name of the colocated branch to create, None for
436
            the default branch.
437
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
438
        The bzrdir's format will control what branch format is created.
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
439
        For more control see BranchFormatXX.create(a_bzrdir).
440
        """
441
        raise NotImplementedError(self.create_branch)
442
5051.3.1 by Jelmer Vernooij
Add optional name argument to BzrDir.destroy_branch.
443
    def destroy_branch(self, name=None):
5051.3.2 by Jelmer Vernooij
Add name argument to BzrDir.create_branch().
444
        """Destroy a branch in this BzrDir.
445
        
446
        :param name: Name of the branch to destroy, None for the default 
447
            branch.
448
        """
2796.2.6 by Aaron Bentley
Implement destroy_branch
449
        raise NotImplementedError(self.destroy_branch)
450
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
451
    @staticmethod
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
452
    def create_branch_and_repo(base, force_new_repo=False, format=None):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
453
        """Create a new BzrDir, Branch and Repository at the url 'base'.
454
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
455
        This will use the current default BzrDirFormat unless one is
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
456
        specified, and use whatever
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
457
        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.
458
        create_repository. If a shared repository is available that is used
459
        preferentially.
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
460
461
        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.
462
463
        :param base: The URL to create the branch at.
464
        :param force_new_repo: If True a new repository is always created.
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
465
        :param format: If supplied, the format of branch to create.  If not
466
            supplied, the default is used.
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
467
        """
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
468
        bzrdir = BzrDir.create(base, format)
1534.6.11 by Robert Collins
Review feedback.
469
        bzrdir._find_or_create_repository(force_new_repo)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
470
        return bzrdir.create_branch()
1534.6.11 by Robert Collins
Review feedback.
471
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
472
    def determine_repository_policy(self, force_new_repo=False, stack_on=None,
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
473
                                    stack_on_pwd=None, require_stacking=False):
3242.2.13 by Aaron Bentley
Update docs
474
        """Return an object representing a policy to use.
475
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.
476
        This controls whether a new repository is created, and the format of
477
        that repository, or some existing shared repository used instead.
3242.3.35 by Aaron Bentley
Cleanups and documentation
478
479
        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
480
3242.3.35 by Aaron Bentley
Cleanups and documentation
481
        :param force_new_repo: If True, require a new repository to be created.
482
        :param stack_on: If supplied, the location to stack on.  If not
483
            supplied, a default_stack_on location may be used.
484
        :param stack_on_pwd: If stack_on is relative, the location it is
485
            relative to.
3242.2.13 by Aaron Bentley
Update docs
486
        """
3242.3.3 by Aaron Bentley
Use _find_containing to determine repository policy
487
        def repository_policy(found_bzrdir):
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
488
            stack_on = None
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
489
            stack_on_pwd = None
3641.1.1 by John Arbash Meinel
Merge in 1.6rc5 and revert disabling default stack on policy
490
            config = found_bzrdir.get_config()
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
491
            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.
492
            stack_on = config.get_default_stack_on()
493
            if stack_on is not None:
5158.6.9 by Martin Pool
Simplify various code to use user_url
494
                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.
495
                stop = True
3242.3.3 by Aaron Bentley
Use _find_containing to determine repository policy
496
            # does it have a repository ?
497
            try:
498
                repository = found_bzrdir.open_repository()
499
            except errors.NoRepositoryPresent:
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
500
                repository = None
501
            else:
5158.6.9 by Martin Pool
Simplify various code to use user_url
502
                if (found_bzrdir.user_url != self.user_url 
503
                    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.
504
                    # Don't look higher, can't use a higher shared repo.
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
505
                    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.
506
                    stop = True
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
507
                else:
508
                    stop = True
509
            if not stop:
3242.3.3 by Aaron Bentley
Use _find_containing to determine repository policy
510
                return None, False
3242.3.4 by Aaron Bentley
Initial determination of stacking policy
511
            if repository:
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
512
                return UseExistingRepository(repository, stack_on,
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
513
                    stack_on_pwd, require_stacking=require_stacking), True
3242.3.3 by Aaron Bentley
Use _find_containing to determine repository policy
514
            else:
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
515
                return CreateRepository(self, stack_on, stack_on_pwd,
516
                    require_stacking=require_stacking), True
3242.3.3 by Aaron Bentley
Use _find_containing to determine repository policy
517
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
518
        if not force_new_repo:
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
519
            if stack_on is None:
520
                policy = self._find_containing(repository_policy)
521
                if policy is not None:
522
                    return policy
523
            else:
524
                try:
525
                    return UseExistingRepository(self.open_repository(),
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
526
                        stack_on, stack_on_pwd,
527
                        require_stacking=require_stacking)
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
528
                except errors.NoRepositoryPresent:
529
                    pass
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
530
        return CreateRepository(self, stack_on, stack_on_pwd,
531
                                require_stacking=require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
532
1534.6.11 by Robert Collins
Review feedback.
533
    def _find_or_create_repository(self, force_new_repo):
534
        """Create a new repository if needed, returning the repository."""
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
535
        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.
536
        return policy.acquire_repository()[0]
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
537
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
538
    @staticmethod
2476.3.6 by Vincent Ladeuil
Fix the 'init connects multiple times' in a different way.
539
    def create_branch_convenience(base, force_new_repo=False,
540
                                  force_new_tree=None, format=None,
2476.3.11 by Vincent Ladeuil
Cosmetic changes.
541
                                  possible_transports=None):
1534.6.10 by Robert Collins
Finish use of repositories support.
542
        """Create a new BzrDir, Branch and Repository at the url 'base'.
543
544
        This is a convenience function - it will use an existing repository
545
        if possible, can be told explicitly whether to create a working tree or
1534.6.12 by Robert Collins
Typo found by John Meinel.
546
        not.
1534.6.10 by Robert Collins
Finish use of repositories support.
547
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
548
        This will use the current default BzrDirFormat unless one is
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
549
        specified, and use whatever
1534.6.10 by Robert Collins
Finish use of repositories support.
550
        repository format that that uses via bzrdir.create_branch and
551
        create_repository. If a shared repository is available that is used
552
        preferentially. Whatever repository is used, its tree creation policy
553
        is followed.
554
555
        The created Branch object is returned.
556
        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
557
        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.
558
        data is created on disk and NotLocalUrl is raised.
1534.6.10 by Robert Collins
Finish use of repositories support.
559
560
        :param base: The URL to create the branch at.
561
        :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
562
        :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.
563
                               prevent such creation respectively.
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
564
        :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
565
        :param possible_transports: An optional reusable transports list.
1534.6.10 by Robert Collins
Finish use of repositories support.
566
        """
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.
567
        if force_new_tree:
568
            # check for non local urls
2485.8.45 by Vincent Ladeuil
Take jam's remarks into account.
569
            t = get_transport(base, possible_transports)
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
570
            if not isinstance(t, local.LocalTransport):
2476.3.6 by Vincent Ladeuil
Fix the 'init connects multiple times' in a different way.
571
                raise errors.NotLocalUrl(base)
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
572
        bzrdir = BzrDir.create(base, format, possible_transports)
1534.6.11 by Robert Collins
Review feedback.
573
        repo = bzrdir._find_or_create_repository(force_new_repo)
1534.6.10 by Robert Collins
Finish use of repositories support.
574
        result = bzrdir.create_branch()
2476.3.4 by Vincent Ladeuil
Add tests.
575
        if force_new_tree or (repo.make_working_trees() and
1534.6.10 by Robert Collins
Finish use of repositories support.
576
                              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.
577
            try:
578
                bzrdir.create_workingtree()
579
            except errors.NotLocalUrl:
580
                pass
1534.6.10 by Robert Collins
Finish use of repositories support.
581
        return result
2476.3.4 by Vincent Ladeuil
Add tests.
582
1551.8.2 by Aaron Bentley
Add create_checkout_convenience
583
    @staticmethod
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
584
    def create_standalone_workingtree(base, format=None):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
585
        """Create a new BzrDir, WorkingTree, Branch and Repository at 'base'.
586
587
        'base' must be a local path or a file:// url.
588
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
589
        This will use the current default BzrDirFormat unless one is
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
590
        specified, and use whatever
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
591
        repository format that that uses for bzrdirformat.create_workingtree,
592
        create_branch and create_repository.
593
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
594
        :param format: Override for the bzrdir format to create.
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
595
        :return: The WorkingTree object.
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
596
        """
2485.8.45 by Vincent Ladeuil
Take jam's remarks into account.
597
        t = get_transport(base)
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
598
        if not isinstance(t, local.LocalTransport):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
599
            raise errors.NotLocalUrl(base)
2485.8.45 by Vincent Ladeuil
Take jam's remarks into account.
600
        bzrdir = BzrDir.create_branch_and_repo(base,
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
601
                                               force_new_repo=True,
602
                                               format=format).bzrdir
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
603
        return bzrdir.create_workingtree()
604
3123.5.17 by Aaron Bentley
Update docs
605
    def create_workingtree(self, revision_id=None, from_branch=None,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
606
        accelerator_tree=None, hardlink=False):
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
607
        """Create a working tree at this BzrDir.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
608
2955.5.3 by Vincent Ladeuil
Fix second unwanted connection by providing the right branch to create_checkout.
609
        :param revision_id: create it as of this revision id.
610
        :param from_branch: override bzrdir branch (for lightweight checkouts)
3123.5.17 by Aaron Bentley
Update docs
611
        :param accelerator_tree: A tree which can be used for retrieving file
612
            contents more quickly than the revision tree, i.e. a workingtree.
613
            The revision tree will be used for cases where accelerator_tree's
614
            content is different.
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
615
        """
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
616
        raise NotImplementedError(self.create_workingtree)
617
3872.3.2 by Jelmer Vernooij
make backup_bzrdir determine the name for the backup files.
618
    def backup_bzrdir(self):
3872.3.1 by Jelmer Vernooij
Allow BzrDir implementation to implement backing up of control directory.
619
        """Backup this bzr control directory.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
620
3872.3.2 by Jelmer Vernooij
make backup_bzrdir determine the name for the backup files.
621
        :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.
622
        """
5035.4.1 by Parth Malwankar
fixes 335033.
623
        def name_gen(base='backup.bzr'):
624
            counter = 1
625
            name = "%s.~%d~" % (base, counter)
5035.4.2 by Parth Malwankar
name_gen now works with all transports.
626
            while self.root_transport.has(name):
5035.4.1 by Parth Malwankar
fixes 335033.
627
                counter += 1
628
                name = "%s.~%d~" % (base, counter)
629
            return name
630
5035.4.2 by Parth Malwankar
name_gen now works with all transports.
631
        backup_dir=name_gen()
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
            # FIXME: bug 300001 -- the backup fails if the backup directory
635
            # already exists, but it should instead either remove it or make
636
            # a new backup directory.
637
            #
638
            old_path = self.root_transport.abspath('.bzr')
5035.4.2 by Parth Malwankar
name_gen now works with all transports.
639
            new_path = self.root_transport.abspath(backup_dir)
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
640
            ui.ui_factory.note('making backup of %s\n  to %s' % (old_path, new_path,))
5035.4.2 by Parth Malwankar
name_gen now works with all transports.
641
            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
642
            return (old_path, new_path)
643
        finally:
644
            pb.finished()
3872.3.1 by Jelmer Vernooij
Allow BzrDir implementation to implement backing up of control directory.
645
2830.1.2 by Ian Clatworthy
Incorporate feedback from poolie's review
646
    def retire_bzrdir(self, limit=10000):
2255.14.1 by Martin Pool
Add BzrDir.retire_bzrdir and partly fix subsume
647
        """Permanently disable the bzrdir.
648
649
        This is done by renaming it to give the user some ability to recover
650
        if there was a problem.
651
652
        This will have horrible consequences if anyone has anything locked or
653
        in use.
2830.1.2 by Ian Clatworthy
Incorporate feedback from poolie's review
654
        :param limit: number of times to retry
2255.14.1 by Martin Pool
Add BzrDir.retire_bzrdir and partly fix subsume
655
        """
2830.1.2 by Ian Clatworthy
Incorporate feedback from poolie's review
656
        i  = 0
657
        while True:
2255.14.1 by Martin Pool
Add BzrDir.retire_bzrdir and partly fix subsume
658
            try:
659
                to_path = '.bzr.retired.%d' % i
660
                self.root_transport.rename('.bzr', to_path)
661
                note("renamed %s to %s"
662
                    % (self.root_transport.abspath('.bzr'), to_path))
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
663
                return
2255.14.1 by Martin Pool
Add BzrDir.retire_bzrdir and partly fix subsume
664
            except (errors.TransportError, IOError, errors.PathError):
2830.1.2 by Ian Clatworthy
Incorporate feedback from poolie's review
665
                i += 1
666
                if i > limit:
667
                    raise
668
                else:
669
                    pass
2255.14.1 by Martin Pool
Add BzrDir.retire_bzrdir and partly fix subsume
670
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
671
    def destroy_workingtree(self):
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
672
        """Destroy the working tree at this BzrDir.
673
674
        Formats that do not support this may raise UnsupportedOperation.
675
        """
676
        raise NotImplementedError(self.destroy_workingtree)
677
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
678
    def destroy_workingtree_metadata(self):
679
        """Destroy the control files for the working tree at this BzrDir.
680
681
        The contents of working tree files are not affected.
682
        Formats that do not support this may raise UnsupportedOperation.
683
        """
684
        raise NotImplementedError(self.destroy_workingtree_metadata)
685
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
686
    def _find_containing(self, evaluate):
3242.2.13 by Aaron Bentley
Update docs
687
        """Find something in a containing control directory.
688
689
        This method will scan containing control dirs, until it finds what
690
        it is looking for, decides that it will never find it, or runs out
691
        of containing control directories to check.
692
693
        It is used to implement find_repository and
694
        determine_repository_policy.
695
696
        :param evaluate: A function returning (value, stop).  If stop is True,
697
            the value will be returned.
698
        """
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
699
        found_bzrdir = self
700
        while True:
701
            result, stop = evaluate(found_bzrdir)
702
            if stop:
703
                return result
704
            next_transport = found_bzrdir.root_transport.clone('..')
5158.6.9 by Martin Pool
Simplify various code to use user_url
705
            if (found_bzrdir.user_url == next_transport.base):
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
706
                # top of the file system
707
                return None
708
            # find the next containing bzrdir
709
            try:
710
                found_bzrdir = BzrDir.open_containing_from_transport(
711
                    next_transport)[0]
712
            except errors.NotBranchError:
713
                return None
714
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.
715
    def find_repository(self):
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
716
        """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.
717
718
        This does not require a branch as we use it to find the repo for
719
        new branches as well as to hook existing branches up to their
720
        repository.
721
        """
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
722
        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
723
            # 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.
724
            try:
725
                repository = found_bzrdir.open_repository()
726
            except errors.NoRepositoryPresent:
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
727
                return None, False
5158.6.9 by Martin Pool
Simplify various code to use user_url
728
            if found_bzrdir.user_url == self.user_url:
3242.2.5 by Aaron Bentley
Avoid unnecessary is_shared check
729
                return repository, True
730
            elif repository.is_shared():
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
731
                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.
732
            else:
3242.2.5 by Aaron Bentley
Avoid unnecessary is_shared check
733
                return None, True
3242.3.2 by Aaron Bentley
Split _find_containing out of find_repository
734
735
        found_repo = self._find_containing(usable_repository)
736
        if found_repo is None:
737
            raise errors.NoRepositoryPresent(self)
738
        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.
739
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
740
    def get_branch_reference(self):
741
        """Return the referenced URL for the branch in this bzrdir.
742
743
        :raises NotBranchError: If there is no Branch.
744
        :return: The URL the branch in this bzrdir references if it is a
745
            reference branch, or None for regular branches.
746
        """
747
        return None
748
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
749
    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.
750
        """Get the transport for use by branch format in this BzrDir.
751
752
        Note that bzr dirs that do not support format strings will raise
753
        IncompatibleFormat if the branch format they are given has
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
754
        a format string, and vice versa.
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
755
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
756
        If branch_format is None, the transport is returned with no
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
757
        checking. If it is not None, then the returned transport is
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
758
        guaranteed to point to an existing directory ready for use.
759
        """
760
        raise NotImplementedError(self.get_branch_transport)
3416.2.1 by Martin Pool
Add BzrDir._get_file_mode and _get_dir_mode
761
762
    def _find_creation_modes(self):
763
        """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
764
3416.2.1 by Martin Pool
Add BzrDir._get_file_mode and _get_dir_mode
765
        They're always set to be consistent with the base directory,
766
        assuming that this transport allows setting modes.
767
        """
768
        # TODO: Do we need or want an option (maybe a config setting) to turn
769
        # this off or override it for particular locations? -- mbp 20080512
770
        if self._mode_check_done:
771
            return
772
        self._mode_check_done = True
773
        try:
774
            st = self.transport.stat('.')
775
        except errors.TransportNotPossible:
776
            self._dir_mode = None
777
            self._file_mode = None
778
        else:
779
            # Check the directory mode, but also make sure the created
780
            # directories and files are read-write for this user. This is
781
            # mostly a workaround for filesystems which lie about being able to
782
            # 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
783
            if (st.st_mode & 07777 == 00000):
784
                # FTP allows stat but does not return dir/file modes
785
                self._dir_mode = None
786
                self._file_mode = None
787
            else:
788
                self._dir_mode = (st.st_mode & 07777) | 00700
789
                # Remove the sticky and execute bits for files
790
                self._file_mode = self._dir_mode & ~07111
3416.2.1 by Martin Pool
Add BzrDir._get_file_mode and _get_dir_mode
791
792
    def _get_file_mode(self):
793
        """Return Unix mode for newly created files, or None.
794
        """
795
        if not self._mode_check_done:
796
            self._find_creation_modes()
797
        return self._file_mode
798
799
    def _get_dir_mode(self):
800
        """Return Unix mode for newly created directories, or None.
801
        """
802
        if not self._mode_check_done:
803
            self._find_creation_modes()
804
        return self._dir_mode
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
805
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
806
    def get_repository_transport(self, repository_format):
807
        """Get the transport for use by repository format in this BzrDir.
808
809
        Note that bzr dirs that do not support format strings will raise
810
        IncompatibleFormat if the repository format they are given has
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
811
        a format string, and vice versa.
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
812
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
813
        If repository_format is None, the transport is returned with no
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
814
        checking. If it is not None, then the returned transport is
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
815
        guaranteed to point to an existing directory ready for use.
816
        """
817
        raise NotImplementedError(self.get_repository_transport)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
818
1534.4.53 by Robert Collins
Review feedback from John Meinel.
819
    def get_workingtree_transport(self, tree_format):
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
820
        """Get the transport for use by workingtree format in this BzrDir.
821
822
        Note that bzr dirs that do not support format strings will raise
2100.3.11 by Aaron Bentley
Add join --reference support
823
        IncompatibleFormat if the workingtree format they are given has a
824
        format string, and vice versa.
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
825
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
826
        If workingtree_format is None, the transport is returned with no
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
827
        checking. If it is not None, then the returned transport is
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
828
        guaranteed to point to an existing directory ready for use.
829
        """
830
        raise NotImplementedError(self.get_workingtree_transport)
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
831
832
    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.
833
        """Get configuration for this BzrDir."""
834
        return config.BzrDirConfig(self)
835
836
    def _get_config(self):
837
        """By default, no configuration is available."""
838
        return None
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
839
1534.4.39 by Robert Collins
Basic BzrDir support.
840
    def __init__(self, _transport, _format):
841
        """Initialize a Bzr control dir object.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
842
1534.4.39 by Robert Collins
Basic BzrDir support.
843
        Only really common logic should reside here, concrete classes should be
844
        made with varying behaviours.
845
1534.4.53 by Robert Collins
Review feedback from John Meinel.
846
        :param _format: the format that is creating this BzrDir instance.
847
        :param _transport: the transport this dir is based at.
1534.4.39 by Robert Collins
Basic BzrDir support.
848
        """
849
        self._format = _format
5158.6.1 by Martin Pool
Add ControlComponent interface and make BzrDir implement it
850
        # these are also under the more standard names of 
851
        # control_transport and user_transport
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
852
        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.
853
        self.root_transport = _transport
3416.2.1 by Martin Pool
Add BzrDir._get_file_mode and _get_dir_mode
854
        self._mode_check_done = False
5158.6.1 by Martin Pool
Add ControlComponent interface and make BzrDir implement it
855
        
856
    @property 
857
    def user_transport(self):
858
        return self.root_transport
859
        
860
    @property
861
    def control_transport(self):
862
        return self.transport
1534.4.39 by Robert Collins
Basic BzrDir support.
863
1713.1.9 by Robert Collins
Paired performance tuning of bzr add. (Robert Collins, Martin Pool).
864
    def is_control_filename(self, filename):
865
        """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
866
1713.1.9 by Robert Collins
Paired performance tuning of bzr add. (Robert Collins, Martin Pool).
867
        :param filename: A filename within the root transport of this bzrdir.
868
869
        This is true IF and ONLY IF the filename is part of the namespace reserved
870
        for bzr control dirs. Currently this is the '.bzr' directory in the root
871
        of the root_transport. it is expected that plugins will need to extend
872
        this in the future - for instance to make bzr talk with svn working
873
        trees.
874
        """
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
875
        # this might be better on the BzrDirFormat class because it refers to
876
        # all the possible bzrdir disk formats.
877
        # This method is tested via the workingtree is_control_filename tests-
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
878
        # it was extracted from WorkingTree.is_control_filename. If the method's
879
        # 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).
880
        # add new tests for it to the appropriate place.
881
        return filename == '.bzr' or filename.startswith('.bzr/')
882
1534.5.16 by Robert Collins
Review feedback.
883
    def needs_format_conversion(self, format=None):
884
        """Return true if this bzrdir needs convert_format run on it.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
885
886
        For instance, if the repository format is out of date but the
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
887
        branch and working tree are not, this should return True.
1534.5.13 by Robert Collins
Correct buggy test.
888
889
        :param format: Optional parameter indicating a specific desired
1534.5.16 by Robert Collins
Review feedback.
890
                       format we plan to arrive at.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
891
        """
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.
892
        raise NotImplementedError(self.needs_format_conversion)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
893
1534.4.39 by Robert Collins
Basic BzrDir support.
894
    @staticmethod
895
    def open_unsupported(base):
896
        """Open a branch which is not supported."""
897
        return BzrDir.open(base, _unsupported=True)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
898
1534.4.39 by Robert Collins
Basic BzrDir support.
899
    @staticmethod
2806.2.2 by Vincent Ladeuil
Fix #128076 and #131396 by reusing bound branch transport.
900
    def open(base, _unsupported=False, possible_transports=None):
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
901
        """Open an existing bzrdir, rooted at 'base' (url).
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
902
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
903
        :param _unsupported: a private parameter to the BzrDir class.
1534.4.39 by Robert Collins
Basic BzrDir support.
904
        """
2806.2.2 by Vincent Ladeuil
Fix #128076 and #131396 by reusing bound branch transport.
905
        t = get_transport(base, possible_transports=possible_transports)
1910.11.1 by Andrew Bennetts
Add BzrDir.open_from_transport, refactored from duplicate code, no explicit tests.
906
        return BzrDir.open_from_transport(t, _unsupported=_unsupported)
907
908
    @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.
909
    def open_from_transport(transport, _unsupported=False,
910
                            _server_formats=True):
1910.11.1 by Andrew Bennetts
Add BzrDir.open_from_transport, refactored from duplicate code, no explicit tests.
911
        """Open a bzrdir within a particular directory.
912
913
        :param transport: Transport containing the bzrdir.
914
        :param _unsupported: private.
915
        """
4160.1.1 by Robert Collins
Add a BzrDir.pre_open hook for use by the smart server gaol.
916
        for hook in BzrDir.hooks['pre_open']:
917
            hook(transport)
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
918
        # Keep initial base since 'transport' may be modified while following
919
        # the redirections.
2164.2.21 by Vincent Ladeuil
Take bundles into account.
920
        base = transport.base
921
        def find_format(transport):
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.
922
            return transport, BzrDirFormat.find_format(
923
                transport, _server_formats=_server_formats)
2164.2.21 by Vincent Ladeuil
Take bundles into account.
924
925
        def redirected(transport, e, redirection_notice):
3878.4.5 by Vincent Ladeuil
Don't use the exception as a parameter for _redirected_to.
926
            redirected_transport = transport._redirected_to(e.source, e.target)
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
927
            if redirected_transport is None:
928
                raise errors.NotBranchError(base)
2164.2.21 by Vincent Ladeuil
Take bundles into account.
929
            note('%s is%s redirected to %s',
3878.4.1 by Vincent Ladeuil
Fix bug #245964 by preserving decorators during redirections (when
930
                 transport.base, e.permanently, redirected_transport.base)
931
            return redirected_transport
2164.2.21 by Vincent Ladeuil
Take bundles into account.
932
2164.2.22 by Vincent Ladeuil
Take Aaron's review comments into account.
933
        try:
2164.2.28 by Vincent Ladeuil
TestingHTTPServer.test_case_server renamed from test_case to avoid confusions.
934
            transport, format = do_catching_redirections(find_format,
935
                                                         transport,
2164.2.22 by Vincent Ladeuil
Take Aaron's review comments into account.
936
                                                         redirected)
937
        except errors.TooManyRedirections:
938
            raise errors.NotBranchError(base)
2164.2.21 by Vincent Ladeuil
Take bundles into account.
939
1596.2.1 by Robert Collins
Fix BzrDir.open_containing of unsupported branches.
940
        BzrDir._check_supported(format, _unsupported)
1910.11.1 by Andrew Bennetts
Add BzrDir.open_from_transport, refactored from duplicate code, no explicit tests.
941
        return format.open(transport, _found=True)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
942
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
943
    def open_branch(self, name=None, unsupported=False,
944
                    ignore_fallbacks=False):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
945
        """Open the branch object at this BzrDir if one is present.
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
946
947
        If unsupported is True, then no longer supported branch formats can
948
        still be opened.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
949
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
950
        TODO: static convenience version of this?
951
        """
952
        raise NotImplementedError(self.open_branch)
1534.4.39 by Robert Collins
Basic BzrDir support.
953
954
    @staticmethod
2485.8.37 by Vincent Ladeuil
Fix merge multiple connections. Test suite *not* passing (sftp
955
    def open_containing(url, possible_transports=None):
1534.4.39 by Robert Collins
Basic BzrDir support.
956
        """Open an existing branch which contains url.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
957
1534.6.3 by Robert Collins
find_repository sufficiently robust.
958
        :param url: url to search from.
1534.6.11 by Robert Collins
Review feedback.
959
        See open_containing_from_transport for more detail.
1534.6.3 by Robert Collins
find_repository sufficiently robust.
960
        """
2485.8.37 by Vincent Ladeuil
Fix merge multiple connections. Test suite *not* passing (sftp
961
        transport = get_transport(url, possible_transports)
962
        return BzrDir.open_containing_from_transport(transport)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
963
1534.6.3 by Robert Collins
find_repository sufficiently robust.
964
    @staticmethod
1534.6.11 by Robert Collins
Review feedback.
965
    def open_containing_from_transport(a_transport):
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
966
        """Open an existing branch which contains a_transport.base.
1534.6.3 by Robert Collins
find_repository sufficiently robust.
967
968
        This probes for a branch at a_transport, and searches upwards from there.
1534.4.39 by Robert Collins
Basic BzrDir support.
969
970
        Basically we keep looking up until we find the control directory or
971
        run into the root.  If there isn't one, raises NotBranchError.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
972
        If there is one and it is either an unrecognised format or an unsupported
1534.4.39 by Robert Collins
Basic BzrDir support.
973
        format, UnknownFormatError or UnsupportedFormatError are raised.
974
        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
975
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
976
        :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.
977
                for the rest of the URL.
1534.4.39 by Robert Collins
Basic BzrDir support.
978
        """
979
        # this gets the normalised url back. I.e. '.' -> the full path.
1534.6.3 by Robert Collins
find_repository sufficiently robust.
980
        url = a_transport.base
1534.4.39 by Robert Collins
Basic BzrDir support.
981
        while True:
982
            try:
1910.11.1 by Andrew Bennetts
Add BzrDir.open_from_transport, refactored from duplicate code, no explicit tests.
983
                result = BzrDir.open_from_transport(a_transport)
984
                return result, urlutils.unescape(a_transport.relpath(url))
1534.4.39 by Robert Collins
Basic BzrDir support.
985
            except errors.NotBranchError, e:
1685.1.60 by Martin Pool
[broken] NotBranchError should unescape the url if possible
986
                pass
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
987
            try:
988
                new_t = a_transport.clone('..')
989
            except errors.InvalidURLJoin:
990
                # reached the root, whatever that may be
991
                raise errors.NotBranchError(path=url)
1534.6.3 by Robert Collins
find_repository sufficiently robust.
992
            if new_t.base == a_transport.base:
1534.4.39 by Robert Collins
Basic BzrDir support.
993
                # reached the root, whatever that may be
994
                raise errors.NotBranchError(path=url)
1534.6.3 by Robert Collins
find_repository sufficiently robust.
995
            a_transport = new_t
1534.4.39 by Robert Collins
Basic BzrDir support.
996
3123.5.11 by Aaron Bentley
Accelerate branching from a lightweight checkout
997
    def _get_tree_branch(self):
998
        """Return the branch and tree, if any, for this bzrdir.
999
3211.4.1 by Robert Collins
* ``RemoteBzrDir._get_tree_branch`` no longer triggers ``_ensure_real``,
1000
        Return None for tree if not present or inaccessible.
3123.5.11 by Aaron Bentley
Accelerate branching from a lightweight checkout
1001
        Raise NotBranchError if no branch is present.
1002
        :return: (tree, branch)
1003
        """
1004
        try:
1005
            tree = self.open_workingtree()
1006
        except (errors.NoWorkingTree, errors.NotLocalUrl):
1007
            tree = None
1008
            branch = self.open_branch()
1009
        else:
1010
            branch = tree.branch
1011
        return tree, branch
1012
1013
    @classmethod
1014
    def open_tree_or_branch(klass, location):
1015
        """Return the branch and working tree at a location.
1016
1017
        If there is no tree at the location, tree will be None.
1018
        If there is no branch at the location, an exception will be
1019
        raised
1020
        :return: (tree, branch)
1021
        """
1022
        bzrdir = klass.open(location)
1023
        return bzrdir._get_tree_branch()
1024
2215.3.2 by Aaron Bentley
Add open_containing_tree_or_branch
1025
    @classmethod
1026
    def open_containing_tree_or_branch(klass, location):
1027
        """Return the branch and working tree contained by a location.
1028
1029
        Returns (tree, branch, relpath).
1030
        If there is no tree at containing the location, tree will be None.
1031
        If there is no branch containing the location, an exception will be
1032
        raised
1033
        relpath is the portion of the path that is contained by the branch.
1034
        """
1035
        bzrdir, relpath = klass.open_containing(location)
3123.5.11 by Aaron Bentley
Accelerate branching from a lightweight checkout
1036
        tree, branch = bzrdir._get_tree_branch()
2215.3.2 by Aaron Bentley
Add open_containing_tree_or_branch
1037
        return tree, branch, relpath
1038
3015.3.39 by Daniel Watkins
Added classmethod bzrlib.bzrdir.BzrDir.open_containing_tree_branch_or_repository.
1039
    @classmethod
1040
    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.
1041
        """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.
1042
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
1043
        Returns (tree, branch, repository, relpath).
3015.3.39 by Daniel Watkins
Added classmethod bzrlib.bzrdir.BzrDir.open_containing_tree_branch_or_repository.
1044
        If there is no tree containing the location, tree will be None.
1045
        If there is no branch containing the location, branch will be None.
1046
        If there is no repository containing the location, repository will be
1047
        None.
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
1048
        relpath is the portion of the path that is contained by the innermost
1049
        BzrDir.
3015.3.39 by Daniel Watkins
Added classmethod bzrlib.bzrdir.BzrDir.open_containing_tree_branch_or_repository.
1050
3015.3.59 by Daniel Watkins
Further tweaks as requested on-list.
1051
        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.
1052
        """
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
1053
        bzrdir, relpath = klass.open_containing(location)
3015.3.39 by Daniel Watkins
Added classmethod bzrlib.bzrdir.BzrDir.open_containing_tree_branch_or_repository.
1054
        try:
3015.3.51 by Daniel Watkins
Modified open_containing_tree_branch_or_repository as per Aaron's suggestion.
1055
            tree, branch = bzrdir._get_tree_branch()
3015.3.39 by Daniel Watkins
Added classmethod bzrlib.bzrdir.BzrDir.open_containing_tree_branch_or_repository.
1056
        except errors.NotBranchError:
1057
            try:
3015.3.59 by Daniel Watkins
Further tweaks as requested on-list.
1058
                repo = bzrdir.find_repository()
3015.3.57 by Daniel Watkins
Made changes to BzrDir.open_containing_tree_branch_or_repository suggested on list.
1059
                return None, None, repo, relpath
1060
            except (errors.NoRepositoryPresent):
1061
                raise errors.NotBranchError(location)
1062
        return tree, branch, branch.repository, relpath
3015.3.39 by Daniel Watkins
Added classmethod bzrlib.bzrdir.BzrDir.open_containing_tree_branch_or_repository.
1063
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1064
    def open_repository(self, _unsupported=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1065
        """Open the repository object at this BzrDir if one is present.
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1066
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
1067
        This will not follow the Branch object pointer - it's strictly a direct
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1068
        open facility. Most client code should use open_branch().repository to
1069
        get at a repository.
1070
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
1071
        :param _unsupported: a private parameter, not part of the api.
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1072
        TODO: static convenience version of this?
1073
        """
1074
        raise NotImplementedError(self.open_repository)
1075
2400.2.2 by Robert Collins
Document BzrDir.open_workingtree's new recommend_upgrade parameter.
1076
    def open_workingtree(self, _unsupported=False,
2955.5.3 by Vincent Ladeuil
Fix second unwanted connection by providing the right branch to create_checkout.
1077
                         recommend_upgrade=True, from_branch=None):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1078
        """Open the workingtree object at this BzrDir if one is present.
2400.2.2 by Robert Collins
Document BzrDir.open_workingtree's new recommend_upgrade parameter.
1079
1080
        :param recommend_upgrade: Optional keyword parameter, when True (the
1081
            default), emit through the ui module a recommendation that the user
1082
            upgrade the working tree when the workingtree being opened is old
1083
            (but still fully supported).
2955.5.3 by Vincent Ladeuil
Fix second unwanted connection by providing the right branch to create_checkout.
1084
        :param from_branch: override bzrdir branch (for lightweight checkouts)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1085
        """
1086
        raise NotImplementedError(self.open_workingtree)
1087
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
1088
    def has_branch(self, name=None):
1662.1.19 by Martin Pool
Better error message when initting existing tree
1089
        """Tell if this bzrdir contains a branch.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1090
1662.1.19 by Martin Pool
Better error message when initting existing tree
1091
        Note: if you're going to open the branch, you should just go ahead
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1092
        and try, and not ask permission first.  (This method just opens the
1093
        branch and discards it, and that's somewhat expensive.)
1662.1.19 by Martin Pool
Better error message when initting existing tree
1094
        """
1095
        try:
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
1096
            self.open_branch(name)
1662.1.19 by Martin Pool
Better error message when initting existing tree
1097
            return True
1098
        except errors.NotBranchError:
1099
            return False
1100
1101
    def has_workingtree(self):
1102
        """Tell if this bzrdir contains a working tree.
1103
1104
        This will still raise an exception if the bzrdir has a workingtree that
1105
        is remote & inaccessible.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1106
1662.1.19 by Martin Pool
Better error message when initting existing tree
1107
        Note: if you're going to open the working tree, you should just go ahead
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1108
        and try, and not ask permission first.  (This method just opens the
1109
        workingtree and discards it, and that's somewhat expensive.)
1662.1.19 by Martin Pool
Better error message when initting existing tree
1110
        """
1111
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1112
            self.open_workingtree(recommend_upgrade=False)
1662.1.19 by Martin Pool
Better error message when initting existing tree
1113
            return True
1114
        except errors.NoWorkingTree:
1115
            return False
1116
2018.5.96 by Andrew Bennetts
Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's
1117
    def _cloning_metadir(self):
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
1118
        """Produce a metadir suitable for cloning with.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1119
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
1120
        :returns: (destination_bzrdir_format, source_repository)
1121
        """
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
1122
        result_format = self._format.__class__()
1123
        try:
1910.2.41 by Aaron Bentley
Clean up clone format creation
1124
            try:
4160.2.6 by Andrew Bennetts
Add ignore_fallbacks flag.
1125
                branch = self.open_branch(ignore_fallbacks=True)
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
1126
                source_repository = branch.repository
3650.2.5 by Aaron Bentley
Stop creating a new instance
1127
                result_format._branch_format = branch._format
1910.2.41 by Aaron Bentley
Clean up clone format creation
1128
            except errors.NotBranchError:
1129
                source_branch = None
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
1130
                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.
1131
        except errors.NoRepositoryPresent:
2100.3.24 by Aaron Bentley
Get all tests passing again
1132
            source_repository = None
2305.3.1 by Andrew Bennetts
Tidy up BzrDir.cloning_metadir: bogus try/except, and basis argument isn't actually used.
1133
        else:
2018.5.138 by Robert Collins
Merge bzr.dev.
1134
            # XXX TODO: This isinstance is here because we have not implemented
1135
            # the fix recommended in bug # 103195 - to delegate this choice the
1136
            # repository itself.
2018.5.94 by Andrew Bennetts
Various small changes in aid of making tests pass (including deleting one invalid test).
1137
            repo_format = source_repository._format
3705.2.1 by Andrew Bennetts
Possible fix for bug 269214
1138
            if isinstance(repo_format, remote.RemoteRepositoryFormat):
1139
                source_repository._ensure_real()
1140
                repo_format = source_repository._real_repository._format
1141
            result_format.repository_format = repo_format
2100.3.28 by Aaron Bentley
Make sprout recursive
1142
        try:
2323.5.19 by Martin Pool
No upgrade recommendation on source when cloning
1143
            # TODO: Couldn't we just probe for the format in these cases,
1144
            # rather than opening the whole tree?  It would be a little
1145
            # faster. mbp 20070401
1146
            tree = self.open_workingtree(recommend_upgrade=False)
2100.3.28 by Aaron Bentley
Make sprout recursive
1147
        except (errors.NoWorkingTree, errors.NotLocalUrl):
1148
            result_format.workingtree_format = None
1149
        else:
1150
            result_format.workingtree_format = tree._format.__class__()
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
1151
        return result_format, source_repository
1152
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
1153
    def cloning_metadir(self, require_stacking=False):
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
1154
        """Produce a metadir suitable for cloning or sprouting with.
1910.2.41 by Aaron Bentley
Clean up clone format creation
1155
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
1156
        These operations may produce workingtrees (yes, even though they're
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
1157
        "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
1158
        format must be selected.
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
1159
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
1160
        :require_stacking: If True, non-stackable formats will be upgraded
1161
            to similar stackable formats.
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
1162
        :returns: a BzrDirFormat with all component formats either set
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
1163
            appropriately or set to None if that component should not be
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
1164
            created.
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
1165
        """
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
1166
        format, repository = self._cloning_metadir()
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
1167
        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.
1168
            # No tree in self.
2100.3.34 by Aaron Bentley
Fix BzrDir.cloning_metadir with no format
1169
            if repository is None:
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1170
                # No repository either
2100.3.34 by Aaron Bentley
Fix BzrDir.cloning_metadir with no format
1171
                return format
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1172
            # We have a repository, so set a working tree? (Why? This seems to
1173
            # contradict the stated return value in the docstring).
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
1174
            tree_format = repository._format._matchingbzrdir.workingtree_format
2100.3.28 by Aaron Bentley
Make sprout recursive
1175
            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.
1176
        if require_stacking:
1177
            format.require_stacking()
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
1178
        return format
1179
1180
    def checkout_metadir(self):
1181
        return self.cloning_metadir()
3650.3.1 by Aaron Bentley
Ensure stacking policy does not cause format upgrades
1182
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
1183
    def sprout(self, url, revision_id=None, force_new_repo=False,
3123.5.8 by Aaron Bentley
Work around double-opening lock issue
1184
               recurse='down', possible_transports=None,
3823.5.1 by John Arbash Meinel
Allow the source branch to pass itself into BzrDir.sprout.
1185
               accelerator_tree=None, hardlink=False, stacked=False,
3983.1.7 by Daniel Watkins
Review comments from jam.
1186
               source_branch=None, create_tree_if_local=True):
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.
1187
        """Create a copy of this bzrdir prepared for use as a new line of
1188
        development.
1189
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
1190
        If url's last component does not exist, it will be created.
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.
1191
1192
        Attributes related to the identity of the source branch like
1193
        branch nickname will be cleaned, a working tree is created
1194
        whether one existed before or not; and a local branch is always
1195
        created.
1196
1197
        if revision_id is not None, then the clone operation may tune
1198
            itself to download less data.
3123.5.17 by Aaron Bentley
Update docs
1199
        :param accelerator_tree: A tree which can be used for retrieving file
1200
            contents more quickly than the revision tree, i.e. a workingtree.
1201
            The revision tree will be used for cases where accelerator_tree's
1202
            content is different.
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1203
        :param hardlink: If true, hard-link files from accelerator_tree,
1204
            where possible.
3221.18.4 by Ian Clatworthy
shallow -> stacked
1205
        :param stacked: If true, create a stacked branch referring to the
3221.13.2 by Robert Collins
Add a shallow parameter to bzrdir.sprout, which involved fixing a lateny bug in pack to pack fetching with ghost discovery.
1206
            location of this control directory.
3983.1.7 by Daniel Watkins
Review comments from jam.
1207
        :param create_tree_if_local: If true, a working-tree will be created
1208
            when working locally.
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.
1209
        """
2485.8.56 by Vincent Ladeuil
Fix bug #112173 and bzr branch multiple connections.
1210
        target_transport = get_transport(url, possible_transports)
2475.3.3 by John Arbash Meinel
Change calls to try/mkdir('.')/except FileExists to ensure_base()
1211
        target_transport.ensure_base()
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
1212
        cloning_format = self.cloning_metadir(stacked)
3650.3.1 by Aaron Bentley
Ensure stacking policy does not cause format upgrades
1213
        # Create/update the result branch
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
1214
        result = cloning_format.initialize_on_transport(target_transport)
3823.5.1 by John Arbash Meinel
Allow the source branch to pass itself into BzrDir.sprout.
1215
        # if a stacked branch wasn't requested, we don't create one
1216
        # even if the origin was stacked
1217
        stacked_branch_url = None
1218
        if source_branch is not None:
3221.18.4 by Ian Clatworthy
shallow -> stacked
1219
            if stacked:
1220
                stacked_branch_url = self.root_transport.base
3823.5.1 by John Arbash Meinel
Allow the source branch to pass itself into BzrDir.sprout.
1221
            source_repository = source_branch.repository
1222
        else:
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.
1223
            try:
3823.5.1 by John Arbash Meinel
Allow the source branch to pass itself into BzrDir.sprout.
1224
                source_branch = self.open_branch()
1225
                source_repository = source_branch.repository
1226
                if stacked:
1227
                    stacked_branch_url = self.root_transport.base
1228
            except errors.NotBranchError:
1229
                source_branch = None
1230
                try:
1231
                    source_repository = self.open_repository()
1232
                except errors.NoRepositoryPresent:
1233
                    source_repository = None
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
1234
        repository_policy = result.determine_repository_policy(
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
1235
            force_new_repo, stacked_branch_url, require_stacking=stacked)
4070.9.2 by Andrew Bennetts
Rough prototype of allowing a SearchResult to be passed to fetch, and using that to improve network conversations.
1236
        result_repo, is_new_repo = repository_policy.acquire_repository()
4070.9.17 by Andrew Bennetts
Don't use PendingAncestrySearch when creating a stacked branch.
1237
        if is_new_repo and revision_id is not None and not stacked:
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1238
            fetch_spec = graph.PendingAncestryResult(
1239
                [revision_id], source_repository)
4070.9.2 by Andrew Bennetts
Rough prototype of allowing a SearchResult to be passed to fetch, and using that to improve network conversations.
1240
        else:
1241
            fetch_spec = None
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
1242
        if source_repository is not None:
3650.3.1 by Aaron Bentley
Ensure stacking policy does not cause format upgrades
1243
            # Fetch while stacked to prevent unstacked fetch from
1244
            # Branch.sprout.
4070.9.2 by Andrew Bennetts
Rough prototype of allowing a SearchResult to be passed to fetch, and using that to improve network conversations.
1245
            if fetch_spec is None:
1246
                result_repo.fetch(source_repository, revision_id=revision_id)
1247
            else:
1248
                result_repo.fetch(source_repository, fetch_spec=fetch_spec)
3221.18.1 by Ian Clatworthy
tweaks by ianc during review
1249
3650.3.1 by Aaron Bentley
Ensure stacking policy does not cause format upgrades
1250
        if source_branch is None:
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
1251
            # this is for sprouting a bzrdir without a branch; is that
1252
            # actually useful?
3650.3.1 by Aaron Bentley
Ensure stacking policy does not cause format upgrades
1253
            # Not especially, but it's part of the contract.
3221.11.20 by Robert Collins
Support --shallow on branch.
1254
            result_branch = result.create_branch()
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
1255
        else:
4070.3.1 by Robert Collins
Alter branch sprouting with an alternate fix for stacked branches that does not require multiple copy_content_into and set_parent calls, reducing IO and round trips.
1256
            result_branch = source_branch.sprout(result,
1257
                revision_id=revision_id, repository_policy=repository_policy)
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
1258
        mutter("created new branch %r" % (result_branch,))
3221.18.1 by Ian Clatworthy
tweaks by ianc during review
1259
1260
        # Create/update the result working tree
3983.1.7 by Daniel Watkins
Review comments from jam.
1261
        if (create_tree_if_local and
1262
            isinstance(target_transport, local.LocalTransport) and
1263
            (result_repo is None or result_repo.make_working_trees())):
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1264
            wt = result.create_workingtree(accelerator_tree=accelerator_tree,
1265
                hardlink=hardlink)
2255.2.77 by Robert Collins
Tune working inventory generation more: walk the blocks, skipping deleted rows.
1266
            wt.lock_write()
1267
            try:
1268
                if wt.path2id('') is None:
3123.5.10 by Aaron Bentley
Restore old handling of set_root_id
1269
                    try:
1270
                        wt.set_root_id(self.open_workingtree.get_root_id())
1271
                    except errors.NoWorkingTree:
1272
                        pass
2255.2.77 by Robert Collins
Tune working inventory generation more: walk the blocks, skipping deleted rows.
1273
            finally:
1274
                wt.unlock()
2100.3.28 by Aaron Bentley
Make sprout recursive
1275
        else:
1276
            wt = None
4370.3.2 by Ian Clatworthy
apply jam's review feedback
1277
        if recurse == 'down':
2100.3.28 by Aaron Bentley
Make sprout recursive
1278
            if wt is not None:
2255.2.226 by Robert Collins
Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.
1279
                basis = wt.basis_tree()
1280
                basis.lock_read()
1281
                subtrees = basis.iter_references()
3744.1.1 by John Arbash Meinel
When branching into a tree-less repository, use the target branch
1282
            elif result_branch is not None:
1283
                basis = result_branch.basis_tree()
1284
                basis.lock_read()
1285
                subtrees = basis.iter_references()
2100.3.28 by Aaron Bentley
Make sprout recursive
1286
            elif source_branch is not None:
2255.2.226 by Robert Collins
Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.
1287
                basis = source_branch.basis_tree()
1288
                basis.lock_read()
1289
                subtrees = basis.iter_references()
2100.3.28 by Aaron Bentley
Make sprout recursive
1290
            else:
2255.2.226 by Robert Collins
Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.
1291
                subtrees = []
1292
                basis = None
1293
            try:
1294
                for path, file_id in subtrees:
1295
                    target = urlutils.join(url, urlutils.escape(path))
1296
                    sublocation = source_branch.reference_parent(file_id, path)
1297
                    sublocation.bzrdir.sprout(target,
1298
                        basis.get_reference_revision(file_id, path),
3221.18.1 by Ian Clatworthy
tweaks by ianc during review
1299
                        force_new_repo=force_new_repo, recurse=recurse,
3221.18.4 by Ian Clatworthy
shallow -> stacked
1300
                        stacked=stacked)
2255.2.226 by Robert Collins
Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.
1301
            finally:
1302
                if basis is not None:
1303
                    basis.unlock()
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.
1304
        return result
1305
3978.3.15 by Jelmer Vernooij
Rename BzrDir.push() to BzrDir.push_branch().
1306
    def push_branch(self, source, revision_id=None, overwrite=False, 
4416.8.1 by Jelmer Vernooij
Pass create_prefix paremeter to BzrDir.push_branch.
1307
        remember=False, create_prefix=False):
3978.3.14 by Jelmer Vernooij
Move BranchBzrDirInter.push() to BzrDir.push().
1308
        """Push the source branch into this BzrDir."""
1309
        br_to = None
1310
        # If we can open a branch, use its direct repository, otherwise see
1311
        # if there is a repository without a branch.
1312
        try:
1313
            br_to = self.open_branch()
1314
        except errors.NotBranchError:
1315
            # Didn't find a branch, can we find a repository?
1316
            repository_to = self.find_repository()
1317
        else:
1318
            # Found a branch, so we must have found a repository
1319
            repository_to = br_to.repository
1320
1321
        push_result = PushResult()
3978.3.16 by Jelmer Vernooij
Add some smoke tests for BzrDir.push_branch().
1322
        push_result.source_branch = source
3978.3.14 by Jelmer Vernooij
Move BranchBzrDirInter.push() to BzrDir.push().
1323
        if br_to is None:
1324
            # We have a repository but no branch, copy the revisions, and then
1325
            # create a branch.
1326
            repository_to.fetch(source.repository, revision_id=revision_id)
1327
            br_to = source.clone(self, revision_id=revision_id)
1328
            if source.get_push_location() is None or remember:
1329
                source.set_push_location(br_to.base)
1330
            push_result.stacked_on = None
1331
            push_result.branch_push_result = None
1332
            push_result.old_revno = None
1333
            push_result.old_revid = _mod_revision.NULL_REVISION
1334
            push_result.target_branch = br_to
1335
            push_result.master_branch = None
1336
            push_result.workingtree_updated = False
1337
        else:
1338
            # We have successfully opened the branch, remember if necessary:
1339
            if source.get_push_location() is None or remember:
1340
                source.set_push_location(br_to.base)
1341
            try:
1342
                tree_to = self.open_workingtree()
1343
            except errors.NotLocalUrl:
1344
                push_result.branch_push_result = source.push(br_to, 
1345
                    overwrite, stop_revision=revision_id)
1346
                push_result.workingtree_updated = False
1347
            except errors.NoWorkingTree:
1348
                push_result.branch_push_result = source.push(br_to,
1349
                    overwrite, stop_revision=revision_id)
1350
                push_result.workingtree_updated = None # Not applicable
1351
            else:
1352
                tree_to.lock_write()
1353
                try:
1354
                    push_result.branch_push_result = source.push(
1355
                        tree_to.branch, overwrite, stop_revision=revision_id)
1356
                    tree_to.update()
1357
                finally:
1358
                    tree_to.unlock()
1359
                push_result.workingtree_updated = True
1360
            push_result.old_revno = push_result.branch_push_result.old_revno
1361
            push_result.old_revid = push_result.branch_push_result.old_revid
3978.3.15 by Jelmer Vernooij
Rename BzrDir.push() to BzrDir.push_branch().
1362
            push_result.target_branch = \
1363
                push_result.branch_push_result.target_branch
3978.3.14 by Jelmer Vernooij
Move BranchBzrDirInter.push() to BzrDir.push().
1364
        return push_result
1365
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1366
4160.1.1 by Robert Collins
Add a BzrDir.pre_open hook for use by the smart server gaol.
1367
class BzrDirHooks(hooks.Hooks):
1368
    """Hooks for BzrDir operations."""
1369
1370
    def __init__(self):
1371
        """Create the default hooks."""
1372
        hooks.Hooks.__init__(self)
1373
        self.create_hook(hooks.HookPoint('pre_open',
1374
            "Invoked before attempting to open a BzrDir with the transport "
1375
            "that the open will use.", (1, 14), None))
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
1376
        self.create_hook(hooks.HookPoint('post_repo_init',
1377
            "Invoked after a repository has been initialized. "
1378
            "post_repo_init is called with a "
1379
            "bzrlib.bzrdir.RepoInitHookParams.",
1380
            (2, 2), None))
4160.1.1 by Robert Collins
Add a BzrDir.pre_open hook for use by the smart server gaol.
1381
1382
# install the default hooks
1383
BzrDir.hooks = BzrDirHooks()
1384
1385
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
1386
class RepoInitHookParams(object):
1387
    """Object holding parameters passed to *_repo_init hooks.
1388
1389
    There are 4 fields that hooks may wish to access:
1390
1391
    :ivar repository: Repository created
1392
    :ivar format: Repository format
1393
    :ivar bzrdir: The bzrdir for the repository
1394
    :ivar shared: The repository is shared
1395
    """
1396
1397
    def __init__(self, repository, format, a_bzrdir, shared):
1398
        """Create a group of RepoInitHook parameters.
1399
1400
        :param repository: Repository created
1401
        :param format: Repository format
1402
        :param bzrdir: The bzrdir for the repository
1403
        :param shared: The repository is shared
1404
        """
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
1405
        self.repository = repository
1406
        self.format = format
1407
        self.bzrdir = a_bzrdir
1408
        self.shared = shared
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
1409
1410
    def __eq__(self, other):
1411
        return self.__dict__ == other.__dict__
1412
1413
    def __repr__(self):
1414
        if self.repository:
1415
            return "<%s for %s>" % (self.__class__.__name__,
1416
                self.repository)
1417
        else:
1418
            return "<%s for %s>" % (self.__class__.__name__,
1419
                self.bzrdir)
1420
1421
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1422
class BzrDirPreSplitOut(BzrDir):
1423
    """A common class for the all-in-one formats."""
1424
1534.5.3 by Robert Collins
Make format 4/5/6 branches share a single LockableFiles instance across wt/branch/repository.
1425
    def __init__(self, _transport, _format):
1426
        """See BzrDir.__init__."""
1427
        super(BzrDirPreSplitOut, self).__init__(_transport, _format)
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1428
        self._control_files = lockable_files.LockableFiles(
1429
                                            self.get_branch_transport(None),
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1430
                                            self._format._lock_file_name,
1431
                                            self._format._lock_class)
1534.5.3 by Robert Collins
Make format 4/5/6 branches share a single LockableFiles instance across wt/branch/repository.
1432
1687.1.12 by Robert Collins
Hook in the full break-lock ui.
1433
    def break_lock(self):
1434
        """Pre-splitout bzrdirs do not suffer from stale locks."""
1435
        raise NotImplementedError(self.break_lock)
1436
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
1437
    def cloning_metadir(self, require_stacking=False):
3242.2.12 by Aaron Bentley
Get cloning_metadir working properly for old formats
1438
        """Produce a metadir suitable for cloning with."""
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
1439
        if require_stacking:
1440
            return format_registry.make_bzrdir('1.6')
3242.2.12 by Aaron Bentley
Get cloning_metadir working properly for old formats
1441
        return self._format.__class__()
1442
3242.3.37 by Aaron Bentley
Updates from reviews
1443
    def clone(self, url, revision_id=None, force_new_repo=False,
1444
              preserve_stacking=False):
1445
        """See BzrDir.clone().
1446
1447
        force_new_repo has no effect, since this family of formats always
1448
        require a new repository.
1449
        preserve_stacking has no effect, since no source branch using this
1450
        family of formats can be stacked, so there is no stacking to preserve.
1451
        """
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.
1452
        self._make_tail(url)
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1453
        result = self._format._initialize_for_clone(url)
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
1454
        self.open_repository().clone(result, revision_id=revision_id)
1692.7.9 by Martin Pool
Don't create broken standalone branches over sftp (Malone #43064)
1455
        from_branch = self.open_branch()
1456
        from_branch.clone(result, revision_id=revision_id)
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.
1457
        try:
3650.5.7 by Aaron Bentley
Fix working tree initialization
1458
            tree = self.open_workingtree()
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.
1459
        except errors.NotLocalUrl:
1460
            # make a new one, this format always has to have one.
3650.5.7 by Aaron Bentley
Fix working tree initialization
1461
            result._init_workingtree()
1462
        else:
1463
            tree.clone(result)
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.
1464
        return result
1465
5051.3.2 by Jelmer Vernooij
Add name argument to BzrDir.create_branch().
1466
    def create_branch(self, name=None):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1467
        """See BzrDir.create_branch."""
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1468
        return self._format.get_branch_format().initialize(self, name=name)
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.
1469
5051.3.1 by Jelmer Vernooij
Add optional name argument to BzrDir.destroy_branch.
1470
    def destroy_branch(self, name=None):
2796.2.16 by Aaron Bentley
Documentation updates from review
1471
        """See BzrDir.destroy_branch."""
2796.2.6 by Aaron Bentley
Implement destroy_branch
1472
        raise errors.UnsupportedOperation(self.destroy_branch, self)
1473
1534.6.1 by Robert Collins
allow API creation of shared repositories
1474
    def create_repository(self, shared=False):
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.
1475
        """See BzrDir.create_repository."""
1534.6.1 by Robert Collins
allow API creation of shared repositories
1476
        if shared:
1477
            raise errors.IncompatibleFormat('shared repository', self._format)
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.
1478
        return self.open_repository()
1479
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
1480
    def destroy_repository(self):
1481
        """See BzrDir.destroy_repository."""
1482
        raise errors.UnsupportedOperation(self.destroy_repository, self)
1483
3123.5.2 by Aaron Bentley
Allow checkout --files_from
1484
    def create_workingtree(self, revision_id=None, from_branch=None,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1485
                           accelerator_tree=None, hardlink=False):
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.
1486
        """See BzrDir.create_workingtree."""
3650.5.6 by Aaron Bentley
Fix cloning problems by creating missing working tree files
1487
        # The workingtree is sometimes created when the bzrdir is created,
1488
        # but not when cloning.
1489
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1490
        # this looks buggy but is not -really-
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1491
        # because this format creates the workingtree when the bzrdir is
1492
        # created
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1493
        # clone and sprout will have set the revision_id
1494
        # and that will have set it for us, its only
1495
        # specific uses of create_workingtree in isolation
1496
        # that can do wonky stuff here, and that only
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1497
        # happens for creating checkouts, which cannot be
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1498
        # done on this format anyway. So - acceptable wart.
4580.4.1 by Martin Pool
Give a warning if --hardlink can't be supported
1499
        if hardlink:
1500
            warning("can't support hardlinked working trees in %r"
1501
                % (self,))
3650.5.6 by Aaron Bentley
Fix cloning problems by creating missing working tree files
1502
        try:
1503
            result = self.open_workingtree(recommend_upgrade=False)
1504
        except errors.NoSuchFile:
1505
            result = self._init_workingtree()
1508.1.24 by Robert Collins
Add update command for use with checkouts.
1506
        if revision_id is not None:
1996.3.12 by John Arbash Meinel
Change how 'revision' is imported to avoid problems later
1507
            if revision_id == _mod_revision.NULL_REVISION:
1551.8.20 by Aaron Bentley
Fix BzrDir.create_workingtree for NULL_REVISION
1508
                result.set_parent_ids([])
1509
            else:
1510
                result.set_parent_ids([revision_id])
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1511
        return result
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1512
3650.5.6 by Aaron Bentley
Fix cloning problems by creating missing working tree files
1513
    def _init_workingtree(self):
1514
        from bzrlib.workingtree import WorkingTreeFormat2
1515
        try:
1516
            return WorkingTreeFormat2().initialize(self)
1517
        except errors.NotLocalUrl:
1518
            # Even though we can't access the working tree, we need to
1519
            # create its control files.
3650.5.7 by Aaron Bentley
Fix working tree initialization
1520
            return WorkingTreeFormat2()._stub_initialize_on_transport(
1521
                self.transport, self._control_files._file_mode)
3650.5.6 by Aaron Bentley
Fix cloning problems by creating missing working tree files
1522
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1523
    def destroy_workingtree(self):
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
1524
        """See BzrDir.destroy_workingtree."""
1525
        raise errors.UnsupportedOperation(self.destroy_workingtree, self)
1526
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1527
    def destroy_workingtree_metadata(self):
1528
        """See BzrDir.destroy_workingtree_metadata."""
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1529
        raise errors.UnsupportedOperation(self.destroy_workingtree_metadata,
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1530
                                          self)
1531
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1532
    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.
1533
        """See BzrDir.get_branch_transport()."""
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1534
        if name is not None:
1535
            raise errors.NoColocatedBranchSupport(self)
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1536
        if branch_format is None:
1537
            return self.transport
1538
        try:
1539
            branch_format.get_format_string()
1540
        except NotImplementedError:
1541
            return self.transport
1542
        raise errors.IncompatibleFormat(branch_format, self._format)
1543
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1544
    def get_repository_transport(self, repository_format):
1545
        """See BzrDir.get_repository_transport()."""
1546
        if repository_format is None:
1547
            return self.transport
1548
        try:
1549
            repository_format.get_format_string()
1550
        except NotImplementedError:
1551
            return self.transport
1552
        raise errors.IncompatibleFormat(repository_format, self._format)
1553
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
1554
    def get_workingtree_transport(self, workingtree_format):
1555
        """See BzrDir.get_workingtree_transport()."""
1556
        if workingtree_format is None:
1557
            return self.transport
1558
        try:
1559
            workingtree_format.get_format_string()
1560
        except NotImplementedError:
1561
            return self.transport
1562
        raise errors.IncompatibleFormat(workingtree_format, self._format)
1563
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1564
    def needs_format_conversion(self, format=None):
1565
        """See BzrDir.needs_format_conversion()."""
1566
        # if the format is not the same as the system default,
1567
        # an upgrade is needed.
1568
        if format is None:
3943.2.5 by Martin Pool
deprecate needs_format_conversion(format=None)
1569
            symbol_versioning.warn(symbol_versioning.deprecated_in((1, 13, 0))
1570
                % 'needs_format_conversion(format=None)')
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
1571
            format = BzrDirFormat.get_default_format()
1572
        return not isinstance(self._format, format.__class__)
1573
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
1574
    def open_branch(self, name=None, unsupported=False,
1575
                    ignore_fallbacks=False):
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)
1576
        """See BzrDir.open_branch."""
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1577
        from bzrlib.branch import BzrBranchFormat4
1578
        format = BzrBranchFormat4()
1579
        self._check_supported(format, unsupported)
5051.3.13 by Jelmer Vernooij
Pass colocated branch name around rather than raising an exception directly.
1580
        return format.open(self, name, _found=True)
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1581
2485.8.56 by Vincent Ladeuil
Fix bug #112173 and bzr branch multiple connections.
1582
    def sprout(self, url, revision_id=None, force_new_repo=False,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1583
               possible_transports=None, accelerator_tree=None,
4054.3.1 by Martin Pool
BzrDirPreSplitOut.sprout should accept source_branch parameter
1584
               hardlink=False, stacked=False, create_tree_if_local=True,
1585
               source_branch=None):
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.
1586
        """See BzrDir.sprout()."""
4054.3.1 by Martin Pool
BzrDirPreSplitOut.sprout should accept source_branch parameter
1587
        if source_branch is not None:
1588
            my_branch = self.open_branch()
1589
            if source_branch.base != my_branch.base:
1590
                raise AssertionError(
1591
                    "source branch %r is not within %r with branch %r" %
1592
                    (source_branch, self, my_branch))
3221.18.4 by Ian Clatworthy
shallow -> stacked
1593
        if stacked:
3221.13.2 by Robert Collins
Add a shallow parameter to bzrdir.sprout, which involved fixing a lateny bug in pack to pack fetching with ghost discovery.
1594
            raise errors.UnstackableBranchFormat(
1595
                self._format, self.root_transport.base)
3983.1.11 by Daniel Watkins
Old BzrDirs which must have working trees are now allowed for in the test.
1596
        if not create_tree_if_local:
1597
            raise errors.MustHaveWorkingTree(
1598
                self._format, self.root_transport.base)
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.
1599
        from bzrlib.workingtree import WorkingTreeFormat2
1600
        self._make_tail(url)
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1601
        result = self._format._initialize_for_clone(url)
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.
1602
        try:
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
1603
            self.open_repository().clone(result, revision_id=revision_id)
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.
1604
        except errors.NoRepositoryPresent:
1605
            pass
1606
        try:
1607
            self.open_branch().sprout(result, revision_id=revision_id)
1608
        except errors.NotBranchError:
1609
            pass
3983.1.4 by Daniel Watkins
Added 'no_tree' parameter to BzrDirPreSplitOut.
1610
3983.1.7 by Daniel Watkins
Review comments from jam.
1611
        # we always want a working tree
1612
        WorkingTreeFormat2().initialize(result,
1613
                                        accelerator_tree=accelerator_tree,
1614
                                        hardlink=hardlink)
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.
1615
        return result
1616
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1617
1618
class BzrDir4(BzrDirPreSplitOut):
1508.1.25 by Robert Collins
Update per review comments.
1619
    """A .bzr version 4 control object.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1620
1508.1.25 by Robert Collins
Update per review comments.
1621
    This is a deprecated format and may be removed after sept 2006.
1622
    """
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1623
1534.6.1 by Robert Collins
allow API creation of shared repositories
1624
    def create_repository(self, shared=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1625
        """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.
1626
        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.
1627
1534.5.16 by Robert Collins
Review feedback.
1628
    def needs_format_conversion(self, format=None):
1629
        """Format 4 dirs are always in need of conversion."""
3943.2.5 by Martin Pool
deprecate needs_format_conversion(format=None)
1630
        if format is None:
1631
            symbol_versioning.warn(symbol_versioning.deprecated_in((1, 13, 0))
1632
                % 'needs_format_conversion(format=None)')
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1633
        return True
1634
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1635
    def open_repository(self):
1636
        """See BzrDir.open_repository."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1637
        from bzrlib.repofmt.weaverepo import RepositoryFormat4
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1638
        return RepositoryFormat4().open(self, _found=True)
1639
1640
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1641
class BzrDir5(BzrDirPreSplitOut):
1508.1.25 by Robert Collins
Update per review comments.
1642
    """A .bzr version 5 control object.
1643
1644
    This is a deprecated format and may be removed after sept 2006.
1645
    """
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1646
4634.47.9 by Andrew Bennetts
has_workingtree is always true for BzrDirFormat5 and BzrDirFormat6.
1647
    def has_workingtree(self):
1648
        """See BzrDir.has_workingtree."""
1649
        return True
1650
    
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1651
    def open_repository(self):
1652
        """See BzrDir.open_repository."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1653
        from bzrlib.repofmt.weaverepo import RepositoryFormat5
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1654
        return RepositoryFormat5().open(self, _found=True)
1655
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1656
    def open_workingtree(self, _unsupported=False,
1657
            recommend_upgrade=True):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1658
        """See BzrDir.create_workingtree."""
1659
        from bzrlib.workingtree import WorkingTreeFormat2
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1660
        wt_format = WorkingTreeFormat2()
1661
        # we don't warn here about upgrades; that ought to be handled for the
1662
        # bzrdir as a whole
1663
        return wt_format.open(self, _found=True)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1664
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1665
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1666
class BzrDir6(BzrDirPreSplitOut):
1508.1.25 by Robert Collins
Update per review comments.
1667
    """A .bzr version 6 control object.
1668
1669
    This is a deprecated format and may be removed after sept 2006.
1670
    """
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1671
4634.47.9 by Andrew Bennetts
has_workingtree is always true for BzrDirFormat5 and BzrDirFormat6.
1672
    def has_workingtree(self):
1673
        """See BzrDir.has_workingtree."""
1674
        return True
1675
    
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1676
    def open_repository(self):
1677
        """See BzrDir.open_repository."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1678
        from bzrlib.repofmt.weaverepo import RepositoryFormat6
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1679
        return RepositoryFormat6().open(self, _found=True)
1680
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1681
    def open_workingtree(self, _unsupported=False,
1682
        recommend_upgrade=True):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1683
        """See BzrDir.create_workingtree."""
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1684
        # we don't warn here about upgrades; that ought to be handled for the
1685
        # bzrdir as a whole
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1686
        from bzrlib.workingtree import WorkingTreeFormat2
1687
        return WorkingTreeFormat2().open(self, _found=True)
1688
1689
1690
class BzrDirMeta1(BzrDir):
1691
    """A .bzr meta version 1 control object.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1692
1693
    This is the first control object where the
1553.5.67 by Martin Pool
doc
1694
    individual aspects are really split out: there are separate repository,
1695
    workingtree and branch subdirectories and any subset of the three can be
1696
    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.
1697
    """
1698
1534.5.16 by Robert Collins
Review feedback.
1699
    def can_convert_format(self):
1700
        """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.
1701
        return True
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1702
5051.3.2 by Jelmer Vernooij
Add name argument to BzrDir.create_branch().
1703
    def create_branch(self, name=None):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1704
        """See BzrDir.create_branch."""
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1705
        return self._format.get_branch_format().initialize(self, name=name)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1706
5051.3.1 by Jelmer Vernooij
Add optional name argument to BzrDir.destroy_branch.
1707
    def destroy_branch(self, name=None):
2796.2.6 by Aaron Bentley
Implement destroy_branch
1708
        """See BzrDir.create_branch."""
5051.3.1 by Jelmer Vernooij
Add optional name argument to BzrDir.destroy_branch.
1709
        if name is not None:
1710
            raise errors.NoColocatedBranchSupport(self)
2796.2.6 by Aaron Bentley
Implement destroy_branch
1711
        self.transport.delete_tree('branch')
1712
1534.6.1 by Robert Collins
allow API creation of shared repositories
1713
    def create_repository(self, shared=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1714
        """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.
1715
        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.
1716
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
1717
    def destroy_repository(self):
1718
        """See BzrDir.destroy_repository."""
1719
        self.transport.delete_tree('repository')
1720
3123.5.2 by Aaron Bentley
Allow checkout --files_from
1721
    def create_workingtree(self, revision_id=None, from_branch=None,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1722
                           accelerator_tree=None, hardlink=False):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1723
        """See BzrDir.create_workingtree."""
2955.5.3 by Vincent Ladeuil
Fix second unwanted connection by providing the right branch to create_checkout.
1724
        return self._format.workingtree_format.initialize(
3123.5.2 by Aaron Bentley
Allow checkout --files_from
1725
            self, revision_id, from_branch=from_branch,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1726
            accelerator_tree=accelerator_tree, hardlink=hardlink)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1727
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1728
    def destroy_workingtree(self):
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
1729
        """See BzrDir.destroy_workingtree."""
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1730
        wt = self.open_workingtree(recommend_upgrade=False)
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1731
        repository = wt.branch.repository
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
1732
        empty = repository.revision_tree(_mod_revision.NULL_REVISION)
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
1733
        wt.revert(old_tree=empty)
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1734
        self.destroy_workingtree_metadata()
1735
1736
    def destroy_workingtree_metadata(self):
1737
        self.transport.delete_tree('checkout')
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
1738
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
1739
    def find_branch_format(self):
1740
        """Find the branch 'format' for this bzrdir.
1741
1742
        This might be a synthetic object for e.g. RemoteBranch and SVN.
1743
        """
1744
        from bzrlib.branch import BranchFormat
1745
        return BranchFormat.find_format(self)
1746
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1747
    def _get_mkdir_mode(self):
1748
        """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
1749
        temp_control = lockable_files.LockableFiles(self.transport, '',
1750
                                     lockable_files.TransportLock)
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1751
        return temp_control._dir_mode
1752
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
1753
    def get_branch_reference(self):
1754
        """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)
1755
        from bzrlib.branch import BranchFormat
1756
        format = BranchFormat.find_format(self)
1757
        return format.get_reference(self)
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
1758
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1759
    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.
1760
        """See BzrDir.get_branch_transport()."""
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1761
        if name is not None:
1762
            raise errors.NoColocatedBranchSupport(self)
4570.3.6 by Martin Pool
doc
1763
        # XXX: this shouldn't implicitly create the directory if it's just
1764
        # 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.
1765
        if branch_format is None:
1766
            return self.transport.clone('branch')
1767
        try:
1768
            branch_format.get_format_string()
1769
        except NotImplementedError:
1770
            raise errors.IncompatibleFormat(branch_format, self._format)
1771
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1772
            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.
1773
        except errors.FileExists:
1774
            pass
1775
        return self.transport.clone('branch')
1776
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1777
    def get_repository_transport(self, repository_format):
1778
        """See BzrDir.get_repository_transport()."""
1779
        if repository_format is None:
1780
            return self.transport.clone('repository')
1781
        try:
1782
            repository_format.get_format_string()
1783
        except NotImplementedError:
1784
            raise errors.IncompatibleFormat(repository_format, self._format)
1785
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1786
            self.transport.mkdir('repository', mode=self._get_mkdir_mode())
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1787
        except errors.FileExists:
1788
            pass
1789
        return self.transport.clone('repository')
1790
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
1791
    def get_workingtree_transport(self, workingtree_format):
1792
        """See BzrDir.get_workingtree_transport()."""
1793
        if workingtree_format is None:
1794
            return self.transport.clone('checkout')
1795
        try:
1796
            workingtree_format.get_format_string()
1797
        except NotImplementedError:
1798
            raise errors.IncompatibleFormat(workingtree_format, self._format)
1799
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1800
            self.transport.mkdir('checkout', mode=self._get_mkdir_mode())
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
1801
        except errors.FileExists:
1802
            pass
1803
        return self.transport.clone('checkout')
1804
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.
1805
    def has_workingtree(self):
1806
        """Tell if this bzrdir contains a working tree.
1807
1808
        This will still raise an exception if the bzrdir has a workingtree that
1809
        is remote & inaccessible.
1810
1811
        Note: if you're going to open the working tree, you should just go
1812
        ahead and try, and not ask permission first.
1813
        """
1814
        from bzrlib.workingtree import WorkingTreeFormat
1815
        try:
1816
            WorkingTreeFormat.find_format(self)
1817
        except errors.NoWorkingTree:
1818
            return False
1819
        return True
1820
1534.5.16 by Robert Collins
Review feedback.
1821
    def needs_format_conversion(self, format=None):
1822
        """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.
1823
        if format is None:
3943.2.5 by Martin Pool
deprecate needs_format_conversion(format=None)
1824
            symbol_versioning.warn(symbol_versioning.deprecated_in((1, 13, 0))
1825
                % 'needs_format_conversion(format=None)')
1826
        if format is None:
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.
1827
            format = BzrDirFormat.get_default_format()
1828
        if not isinstance(self._format, format.__class__):
1829
            # it is not a meta dir format, conversion is needed.
1830
            return True
1831
        # we might want to push this down to the repository?
1832
        try:
1833
            if not isinstance(self.open_repository()._format,
1834
                              format.repository_format.__class__):
1835
                # the repository needs an upgrade.
1836
                return True
1837
        except errors.NoRepositoryPresent:
1838
            pass
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
1839
        for branch in self.list_branches():
1840
            if not isinstance(branch._format,
2230.3.55 by Aaron Bentley
Updates from review
1841
                              format.get_branch_format().__class__):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1842
                # the branch needs an upgrade.
1843
                return True
1844
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1845
            my_wt = self.open_workingtree(recommend_upgrade=False)
1846
            if not isinstance(my_wt._format,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1847
                              format.workingtree_format.__class__):
1848
                # the workingtree needs an upgrade.
1849
                return True
2255.2.196 by Robert Collins
Fix test_upgrade defects related to non local or absent working trees.
1850
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1851
            pass
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1852
        return False
1853
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
1854
    def open_branch(self, name=None, unsupported=False,
1855
                    ignore_fallbacks=False):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1856
        """See BzrDir.open_branch."""
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)
1857
        format = self.find_branch_format()
1858
        self._check_supported(format, unsupported)
5051.3.13 by Jelmer Vernooij
Pass colocated branch name around rather than raising an exception directly.
1859
        return format.open(self, name=name,
1860
            _found=True, ignore_fallbacks=ignore_fallbacks)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1861
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1862
    def open_repository(self, unsupported=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1863
        """See BzrDir.open_repository."""
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1864
        from bzrlib.repository import RepositoryFormat
1865
        format = RepositoryFormat.find_format(self)
1866
        self._check_supported(format, unsupported)
1867
        return format.open(self, _found=True)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1868
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1869
    def open_workingtree(self, unsupported=False,
1870
            recommend_upgrade=True):
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1871
        """See BzrDir.open_workingtree."""
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1872
        from bzrlib.workingtree import WorkingTreeFormat
1873
        format = WorkingTreeFormat.find_format(self)
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1874
        self._check_supported(format, unsupported,
1875
            recommend_upgrade,
2323.6.5 by Martin Pool
Recommended-upgrade message should give base dir not the control dir url
1876
            basedir=self.root_transport.base)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1877
        return format.open(self, _found=True)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1878
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
1879
    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.
1880
        return config.TransportConfig(self.transport, 'control.conf')
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
1881
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1882
1534.4.39 by Robert Collins
Basic BzrDir support.
1883
class BzrDirFormat(object):
1884
    """An encapsulation of the initialization and open routines for a format.
1885
1886
    Formats provide three things:
1887
     * An initialization routine,
1888
     * a format string,
1889
     * an open routine.
1890
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1891
    Formats are placed in a dict by their format string for reference
1534.4.39 by Robert Collins
Basic BzrDir support.
1892
    during bzrdir opening. These should be subclasses of BzrDirFormat
1893
    for consistency.
1894
1895
    Once a format is deprecated, just deprecate the initialize and open
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1896
    methods on the format class. Do not deprecate the object, as the
1534.4.39 by Robert Collins
Basic BzrDir support.
1897
    object will be created every system load.
5075.1.1 by Jelmer Vernooij
Document that BzrDirFormat.colocated_branches is a cvar.
1898
1899
    :cvar colocated_branches: Whether this formats supports colocated branches.
1534.4.39 by Robert Collins
Basic BzrDir support.
1900
    """
1901
1902
    _default_format = None
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1903
    """The default format used for new .bzr dirs."""
1534.4.39 by Robert Collins
Basic BzrDir support.
1904
1905
    _formats = {}
1906
    """The known formats."""
1907
1733.1.7 by Jelmer Vernooij
Change set of control dir formats to list.
1908
    _control_formats = []
1733.1.6 by Jelmer Vernooij
Fix a couple of minor issues after review by Martin.
1909
    """The registered control formats - .bzr, ....
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1910
1733.1.7 by Jelmer Vernooij
Change set of control dir formats to list.
1911
    This is a list of BzrDirFormat objects.
1733.1.6 by Jelmer Vernooij
Fix a couple of minor issues after review by Martin.
1912
    """
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1913
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.
1914
    _control_server_formats = []
1915
    """The registered control server formats, e.g. RemoteBzrDirs.
1916
1917
    This is a list of BzrDirFormat objects.
1918
    """
1919
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1920
    _lock_file_name = 'branch-lock'
1921
5051.3.3 by Jelmer Vernooij
Add tests for colo branches.
1922
    colocated_branches = False
1923
    """Whether co-located branches are supported for this control dir format.
1924
    """
1925
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1926
    # _lock_class must be set in subclasses to the lock type, typ.
1927
    # TransportLock or LockDir
1928
1534.4.39 by Robert Collins
Basic BzrDir support.
1929
    @classmethod
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.
1930
    def find_format(klass, transport, _server_formats=True):
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1931
        """Return the format present at transport."""
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.
1932
        if _server_formats:
1933
            formats = klass._control_server_formats + klass._control_formats
1934
        else:
1935
            formats = klass._control_formats
1936
        for format in formats:
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1937
            try:
1938
                return format.probe_transport(transport)
1939
            except errors.NotBranchError:
1940
                # this format does not find a control dir here.
1941
                pass
1942
        raise errors.NotBranchError(path=transport.base)
1943
1944
    @classmethod
1945
    def probe_transport(klass, transport):
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
1946
        """Return the .bzrdir style format present in a directory."""
1534.4.39 by Robert Collins
Basic BzrDir support.
1947
        try:
4852.1.3 by John Arbash Meinel
Read .bzr/branch-format via get_bytes()
1948
            format_string = transport.get_bytes(".bzr/branch-format")
1733.2.3 by Michael Ellerman
Don't coallesce try blocks, it can lead to confusing exceptions.
1949
        except errors.NoSuchFile:
1950
            raise errors.NotBranchError(path=transport.base)
1951
1952
        try:
1534.4.39 by Robert Collins
Basic BzrDir support.
1953
            return klass._formats[format_string]
1954
        except KeyError:
3246.3.2 by Daniel Watkins
Modified uses of errors.UnknownFormatError.
1955
            raise errors.UnknownFormatError(format=format_string, kind='bzrdir')
1534.4.39 by Robert Collins
Basic BzrDir support.
1956
1957
    @classmethod
1958
    def get_default_format(klass):
1959
        """Return the current default format."""
1960
        return klass._default_format
1961
1962
    def get_format_string(self):
1963
        """Return the ASCII format string that identifies this format."""
1964
        raise NotImplementedError(self.get_format_string)
1965
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
1966
    def get_format_description(self):
1967
        """Return the short description for this format."""
1968
        raise NotImplementedError(self.get_format_description)
1969
1534.5.16 by Robert Collins
Review feedback.
1970
    def get_converter(self, format=None):
1971
        """Return the converter to use to convert bzrdirs needing converts.
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1972
1973
        This returns a bzrlib.bzrdir.Converter object.
1974
1975
        This should return the best upgrader to step this format towards the
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
1976
        current default format. In the case of plugins we can/should provide
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1977
        some means for them to extend the range of returnable converters.
1534.5.13 by Robert Collins
Correct buggy test.
1978
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1979
        :param format: Optional format to override the default format of the
1534.5.13 by Robert Collins
Correct buggy test.
1980
                       library.
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1981
        """
1534.5.16 by Robert Collins
Review feedback.
1982
        raise NotImplementedError(self.get_converter)
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1983
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
1984
    def initialize(self, url, possible_transports=None):
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1985
        """Create a bzr control dir at this url and return an opened copy.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1986
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
1987
        While not deprecated, this method is very specific and its use will
1988
        lead to many round trips to setup a working environment. See
1989
        initialize_on_transport_ex for a [nearly] all-in-one method.
1990
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1991
        Subclasses should typically override initialize_on_transport
1992
        instead of this method.
1993
        """
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
1994
        return self.initialize_on_transport(get_transport(url,
1995
                                                          possible_transports))
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1996
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1997
    def initialize_on_transport(self, transport):
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1998
        """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)
1999
        try:
2000
            # can we hand off the request to the smart server rather than using
2001
            # vfs calls?
2002
            client_medium = transport.get_smart_medium()
2003
        except errors.NoSmartMedium:
2004
            return self._initialize_on_transport_vfs(transport)
2005
        else:
2006
            # Current RPC's only know how to create bzr metadir1 instances, so
2007
            # we still delegate to vfs methods if the requested format is not a
2008
            # metadir1
2009
            if type(self) != BzrDirMetaFormat1:
2010
                return self._initialize_on_transport_vfs(transport)
2011
            remote_format = RemoteBzrDirFormat()
2012
            self._supply_sub_formats_to(remote_format)
2013
            return remote_format.initialize_on_transport(transport)
2014
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
2015
    def initialize_on_transport_ex(self, transport, use_existing_dir=False,
2016
        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.
2017
        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.
2018
        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.
2019
        """Create this format on transport.
2020
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
2021
        The directory to initialize will be created.
2022
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
2023
        :param force_new_repo: Do not use a shared repository for the target,
2024
                               even if one is available.
2025
        :param create_prefix: Create any missing directories leading up to
2026
            to_transport.
2027
        :param use_existing_dir: Use an existing directory if one exists.
2028
        :param stacked_on: A url to stack any created branch on, None to follow
2029
            any target stacking policy.
2030
        :param stack_on_pwd: If stack_on is relative, the location it is
2031
            relative to.
2032
        :param repo_format_name: If non-None, a repository will be
2033
            made-or-found. Should none be found, or if force_new_repo is True
2034
            the repo_format_name is used to select the format of repository to
2035
            create.
2036
        :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.
2037
            for a new shared repository when one is made. None to use whatever
2038
            default the format has.
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
2039
        :param shared_repo: Control whether made repositories are shared or
2040
            not.
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
2041
        :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.
2042
        :return: repo, bzrdir, require_stacking, repository_policy. repo is
2043
            None if none was created or found, bzrdir is always valid.
2044
            require_stacking is the result of examining the stacked_on
2045
            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.
2046
        """
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
2047
        if not vfs_only:
2048
            # Try to hand off to a smart server 
2049
            try:
2050
                client_medium = transport.get_smart_medium()
2051
            except errors.NoSmartMedium:
2052
                pass
2053
            else:
2054
                # TODO: lookup the local format from a server hint.
2055
                remote_dir_format = RemoteBzrDirFormat()
2056
                remote_dir_format._network_name = self.network_name()
2057
                self._supply_sub_formats_to(remote_dir_format)
2058
                return remote_dir_format.initialize_on_transport_ex(transport,
2059
                    use_existing_dir=use_existing_dir, create_prefix=create_prefix,
2060
                    force_new_repo=force_new_repo, stacked_on=stacked_on,
2061
                    stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
2062
                    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.
2063
        # XXX: Refactor the create_prefix/no_create_prefix code into a
2064
        #      common helper function
2065
        # The destination may not exist - if so make it according to policy.
2066
        def make_directory(transport):
2067
            transport.mkdir('.')
2068
            return transport
2069
        def redirected(transport, e, redirection_notice):
2070
            note(redirection_notice)
2071
            return transport._redirected_to(e.source, e.target)
2072
        try:
2073
            transport = do_catching_redirections(make_directory, transport,
2074
                redirected)
2075
        except errors.FileExists:
2076
            if not use_existing_dir:
2077
                raise
2078
        except errors.NoSuchFile:
2079
            if not create_prefix:
2080
                raise
2081
            transport.create_prefix()
2082
2083
        require_stacking = (stacked_on is not None)
2084
        # Now the target directory exists, but doesn't have a .bzr
2085
        # directory. So we need to create it, along with any work to create
2086
        # all of the dependent branches, etc.
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
2087
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
2088
        result = self.initialize_on_transport(transport)
2089
        if repo_format_name:
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
2090
            try:
2091
                # use a custom format
2092
                result._format.repository_format = \
2093
                    repository.network_format_registry.get(repo_format_name)
2094
            except AttributeError:
2095
                # The format didn't permit it to be set.
2096
                pass
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
2097
            # A repository is desired, either in-place or shared.
2098
            repository_policy = result.determine_repository_policy(
2099
                force_new_repo, stacked_on, stack_on_pwd,
2100
                require_stacking=require_stacking)
2101
            result_repo, is_new_repo = repository_policy.acquire_repository(
2102
                make_working_trees, shared_repo)
2103
            if not require_stacking and repository_policy._require_stacking:
2104
                require_stacking = True
2105
                result._format.require_stacking()
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
2106
            result_repo.lock_write()
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
2107
        else:
2108
            result_repo = None
2109
            repository_policy = None
2110
        return result_repo, result, require_stacking, repository_policy
2111
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
2112
    def _initialize_on_transport_vfs(self, transport):
2113
        """Initialize a new bzrdir using VFS calls.
4032.1.2 by John Arbash Meinel
Track down a few more files that have trailing whitespace.
2114
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
2115
        :param transport: The transport to create the .bzr directory in.
2116
        :return: A
2117
        """
2118
        # Since we are creating a .bzr directory, inherit the
1534.4.39 by Robert Collins
Basic BzrDir support.
2119
        # mode from the root directory
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2120
        temp_control = lockable_files.LockableFiles(transport,
2121
                            '', lockable_files.TransportLock)
1534.4.39 by Robert Collins
Basic BzrDir support.
2122
        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.
2123
                                      # FIXME: RBC 20060121 don't peek under
1534.4.39 by Robert Collins
Basic BzrDir support.
2124
                                      # the covers
2125
                                      mode=temp_control._dir_mode)
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
2126
        if sys.platform == 'win32' and isinstance(transport, local.LocalTransport):
3023.1.2 by Alexander Belchenko
Martin's review.
2127
            win32utils.set_file_attr_hidden(transport._abspath('.bzr'))
1534.4.39 by Robert Collins
Basic BzrDir support.
2128
        file_mode = temp_control._file_mode
2129
        del temp_control
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2130
        bzrdir_transport = transport.clone('.bzr')
2131
        utf8_files = [('README',
3250.2.1 by Marius Kruger
update .bzr/README to not refer to Bazaar-NG, and add link to website.
2132
                       "This is a Bazaar control directory.\n"
2133
                       "Do not change any files in this directory.\n"
2134
                       "See http://bazaar-vcs.org/ for more information about Bazaar.\n"),
1534.4.39 by Robert Collins
Basic BzrDir support.
2135
                      ('branch-format', self.get_format_string()),
2136
                      ]
2137
        # NB: no need to escape relative paths that are url safe.
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2138
        control_files = lockable_files.LockableFiles(bzrdir_transport,
2139
            self._lock_file_name, self._lock_class)
1553.5.60 by Martin Pool
New LockableFiles.create_lock() method
2140
        control_files.create_lock()
1534.4.39 by Robert Collins
Basic BzrDir support.
2141
        control_files.lock_write()
2142
        try:
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2143
            for (filename, content) in utf8_files:
3407.2.12 by Martin Pool
Fix creation mode of control files
2144
                bzrdir_transport.put_bytes(filename, content,
2145
                    mode=file_mode)
1534.4.39 by Robert Collins
Basic BzrDir support.
2146
        finally:
2147
            control_files.unlock()
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
2148
        return self.open(transport, _found=True)
1534.4.39 by Robert Collins
Basic BzrDir support.
2149
2150
    def is_supported(self):
2151
        """Is this format supported?
2152
2153
        Supported formats must be initializable and openable.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2154
        Unsupported formats may not support initialization or committing or
1534.4.39 by Robert Collins
Basic BzrDir support.
2155
        some other features depending on the reason for not being supported.
2156
        """
2157
        return True
2158
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2159
    def network_name(self):
2160
        """A simple byte string uniquely identifying this format for RPC calls.
2161
2162
        Bzr control formats use thir disk format string to identify the format
2163
        over the wire. Its possible that other control formats have more
2164
        complex detection requirements, so we permit them to use any unique and
2165
        immutable string they desire.
2166
        """
2167
        raise NotImplementedError(self.network_name)
2168
1910.2.14 by Aaron Bentley
Fail when trying to use interrepository on Knit2 and Knit1
2169
    def same_model(self, target_format):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2170
        return (self.repository_format.rich_root_data ==
1910.2.14 by Aaron Bentley
Fail when trying to use interrepository on Knit2 and Knit1
2171
            target_format.rich_root_data)
2172
1733.1.3 by Robert Collins
Extend the test suite to run bzrdir conformance tests on non .bzr based control dirs.
2173
    @classmethod
2174
    def known_formats(klass):
2175
        """Return all the known formats.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2176
1733.1.3 by Robert Collins
Extend the test suite to run bzrdir conformance tests on non .bzr based control dirs.
2177
        Concrete formats should override _known_formats.
2178
        """
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2179
        # There is double indirection here to make sure that control
2180
        # formats used by more than one dir format will only be probed
1733.1.6 by Jelmer Vernooij
Fix a couple of minor issues after review by Martin.
2181
        # once. This can otherwise be quite expensive for remote connections.
1733.1.3 by Robert Collins
Extend the test suite to run bzrdir conformance tests on non .bzr based control dirs.
2182
        result = set()
2183
        for format in klass._control_formats:
2184
            result.update(format._known_formats())
2185
        return result
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2186
1733.1.3 by Robert Collins
Extend the test suite to run bzrdir conformance tests on non .bzr based control dirs.
2187
    @classmethod
2188
    def _known_formats(klass):
2189
        """Return the known format instances for this control format."""
2190
        return set(klass._formats.values())
2191
1534.4.39 by Robert Collins
Basic BzrDir support.
2192
    def open(self, transport, _found=False):
2193
        """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
2194
1534.4.39 by Robert Collins
Basic BzrDir support.
2195
        _found is a private parameter, do not use it.
2196
        """
2197
        if not _found:
2090.2.2 by Martin Pool
Fix an assertion with side effects
2198
            found_format = BzrDirFormat.find_format(transport)
2199
            if not isinstance(found_format, self.__class__):
2200
                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
2201
                        "format %s"
2090.2.2 by Martin Pool
Fix an assertion with side effects
2202
                        % (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.
2203
            # Allow subclasses - use the found format.
2204
            self._supply_sub_formats_to(found_format)
2205
            return found_format._open(transport)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
2206
        return self._open(transport)
2207
2208
    def _open(self, transport):
2209
        """Template method helper for opening BzrDirectories.
2210
2211
        This performs the actual open and any additional logic or parameter
2212
        passing.
2213
        """
2214
        raise NotImplementedError(self._open)
1534.4.39 by Robert Collins
Basic BzrDir support.
2215
2216
    @classmethod
2217
    def register_format(klass, format):
2218
        klass._formats[format.get_format_string()] = format
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2219
        # bzr native formats have a network name of their format string.
4075.2.1 by Robert Collins
Audit and make sure we are registering network_name's as factories, not instances.
2220
        network_format_registry.register(format.get_format_string(), format.__class__)
1534.4.39 by Robert Collins
Basic BzrDir support.
2221
2222
    @classmethod
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
2223
    def register_control_format(klass, format):
2164.2.13 by v.ladeuil+lp at free
Add tests for redirection. Preserve transport decorations.
2224
        """Register a format that does not use '.bzr' for its control dir.
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
2225
2226
        TODO: This should be pulled up into a 'ControlDirFormat' base class
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2227
        which BzrDirFormat can inherit from, and renamed to register_format
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
2228
        there. It has been done without that for now for simplicity of
2229
        implementation.
2230
        """
1733.1.7 by Jelmer Vernooij
Change set of control dir formats to list.
2231
        klass._control_formats.append(format)
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
2232
2233
    @classmethod
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
2234
    def register_control_server_format(klass, format):
2235
        """Register a control format for client-server environments.
2236
2237
        These formats will be tried before ones registered with
2238
        register_control_format.  This gives implementations that decide to the
2239
        chance to grab it before anything looks at the contents of the format
2240
        file.
2241
        """
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.
2242
        klass._control_server_formats.append(format)
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
2243
2244
    @classmethod
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
2245
    def _set_default_format(klass, format):
2246
        """Set default format (for testing behavior of defaults only)"""
2247
        klass._default_format = format
2248
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
2249
    def __str__(self):
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
2250
        # Trim the newline
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
2251
        return self.get_format_description().rstrip()
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
2252
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.
2253
    def _supply_sub_formats_to(self, other_format):
2254
        """Give other_format the same values for sub formats as this has.
2255
2256
        This method is expected to be used when parameterising a
2257
        RemoteBzrDirFormat instance with the parameters from a
2258
        BzrDirMetaFormat1 instance.
2259
2260
        :param other_format: other_format is a format which should be
2261
            compatible with whatever sub formats are supported by self.
2262
        :return: None.
2263
        """
2264
1534.4.39 by Robert Collins
Basic BzrDir support.
2265
    @classmethod
2266
    def unregister_format(klass, format):
2267
        del klass._formats[format.get_format_string()]
2268
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
2269
    @classmethod
2270
    def unregister_control_format(klass, format):
2271
        klass._control_formats.remove(format)
2272
2273
1534.4.39 by Robert Collins
Basic BzrDir support.
2274
class BzrDirFormat4(BzrDirFormat):
2275
    """Bzr dir format 4.
2276
2277
    This format is a combined format for working tree, branch and repository.
2278
    It has:
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
2279
     - Format 1 working trees [always]
2280
     - Format 4 branches [always]
2281
     - Format 4 repositories [always]
1534.4.39 by Robert Collins
Basic BzrDir support.
2282
2283
    This format is deprecated: it indexes texts using a text it which is
2284
    removed in format 5; write support for this format has been removed.
2285
    """
2286
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2287
    _lock_class = lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
2288
1534.4.39 by Robert Collins
Basic BzrDir support.
2289
    def get_format_string(self):
2290
        """See BzrDirFormat.get_format_string()."""
2291
        return "Bazaar-NG branch, format 0.0.4\n"
2292
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
2293
    def get_format_description(self):
2294
        """See BzrDirFormat.get_format_description()."""
2295
        return "All-in-one format 4"
2296
1534.5.16 by Robert Collins
Review feedback.
2297
    def get_converter(self, format=None):
2298
        """See BzrDirFormat.get_converter()."""
1534.5.13 by Robert Collins
Correct buggy test.
2299
        # there is one and only one upgrade path here.
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2300
        return ConvertBzrDir4To5()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2301
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
2302
    def initialize_on_transport(self, transport):
1534.4.39 by Robert Collins
Basic BzrDir support.
2303
        """Format 4 branches cannot be created."""
2304
        raise errors.UninitializableFormat(self)
2305
2306
    def is_supported(self):
2307
        """Format 4 is not supported.
2308
2309
        It is not supported because the model changed from 4 to 5 and the
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2310
        conversion logic is expensive - so doing it on the fly was not
1534.4.39 by Robert Collins
Basic BzrDir support.
2311
        feasible.
2312
        """
2313
        return False
2314
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2315
    def network_name(self):
2316
        return self.get_format_string()
2317
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
2318
    def _open(self, transport):
2319
        """See BzrDirFormat._open."""
2320
        return BzrDir4(transport, self)
2321
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.
2322
    def __return_repository_format(self):
2323
        """Circular import protection."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2324
        from bzrlib.repofmt.weaverepo import RepositoryFormat4
1910.2.12 by Aaron Bentley
Implement knit repo format 2
2325
        return RepositoryFormat4()
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.
2326
    repository_format = property(__return_repository_format)
2327
1534.4.39 by Robert Collins
Basic BzrDir support.
2328
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
2329
class BzrDirFormatAllInOne(BzrDirFormat):
2330
    """Common class for formats before meta-dirs."""
2331
2332
    def initialize_on_transport_ex(self, transport, use_existing_dir=False,
2333
        create_prefix=False, force_new_repo=False, stacked_on=None,
2334
        stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
2335
        shared_repo=False):
2336
        """See BzrDirFormat.initialize_on_transport_ex."""
2337
        require_stacking = (stacked_on is not None)
4294.2.10 by Robert Collins
Review feedback.
2338
        # Format 5 cannot stack, but we've been asked to - actually init
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
2339
        # a Meta1Dir
2340
        if require_stacking:
2341
            format = BzrDirMetaFormat1()
2342
            return format.initialize_on_transport_ex(transport,
2343
                use_existing_dir=use_existing_dir, create_prefix=create_prefix,
2344
                force_new_repo=force_new_repo, stacked_on=stacked_on,
2345
                stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
2346
                make_working_trees=make_working_trees, shared_repo=shared_repo)
2347
        return BzrDirFormat.initialize_on_transport_ex(self, transport,
2348
            use_existing_dir=use_existing_dir, create_prefix=create_prefix,
2349
            force_new_repo=force_new_repo, stacked_on=stacked_on,
2350
            stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
2351
            make_working_trees=make_working_trees, shared_repo=shared_repo)
2352
2353
2354
class BzrDirFormat5(BzrDirFormatAllInOne):
1534.4.39 by Robert Collins
Basic BzrDir support.
2355
    """Bzr control format 5.
2356
2357
    This format is a combined format for working tree, branch and repository.
2358
    It has:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2359
     - Format 2 working trees [always]
2360
     - Format 4 branches [always]
1534.4.53 by Robert Collins
Review feedback from John Meinel.
2361
     - Format 5 repositories [always]
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.
2362
       Unhashed stores in the repository.
1534.4.39 by Robert Collins
Basic BzrDir support.
2363
    """
2364
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2365
    _lock_class = lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
2366
1534.4.39 by Robert Collins
Basic BzrDir support.
2367
    def get_format_string(self):
2368
        """See BzrDirFormat.get_format_string()."""
2369
        return "Bazaar-NG branch, format 5\n"
2370
3650.2.2 by Aaron Bentley
Implement get_branch_format, to unify branch creation code
2371
    def get_branch_format(self):
2372
        from bzrlib import branch
2373
        return branch.BzrBranchFormat4()
2374
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
2375
    def get_format_description(self):
2376
        """See BzrDirFormat.get_format_description()."""
2377
        return "All-in-one format 5"
2378
1534.5.16 by Robert Collins
Review feedback.
2379
    def get_converter(self, format=None):
2380
        """See BzrDirFormat.get_converter()."""
1534.5.13 by Robert Collins
Correct buggy test.
2381
        # there is one and only one upgrade path here.
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2382
        return ConvertBzrDir5To6()
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
2383
2384
    def _initialize_for_clone(self, url):
2385
        return self.initialize_on_transport(get_transport(url), _cloning=True)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2386
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
2387
    def initialize_on_transport(self, transport, _cloning=False):
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.
2388
        """Format 5 dirs always have working tree, branch and repository.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2389
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.
2390
        Except when they are being cloned.
2391
        """
2392
        from bzrlib.branch import BzrBranchFormat4
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2393
        from bzrlib.repofmt.weaverepo import RepositoryFormat5
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
2394
        result = (super(BzrDirFormat5, self).initialize_on_transport(transport))
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.
2395
        RepositoryFormat5().initialize(result, _internal=True)
2396
        if not _cloning:
1910.5.1 by Andrew Bennetts
Make some old formats create at least a stub working tree rather than incomplete bzrdirs, and change some tests to use the test suite transport rather than hard-coded to local-only.
2397
            branch = BzrBranchFormat4().initialize(result)
3650.5.6 by Aaron Bentley
Fix cloning problems by creating missing working tree files
2398
            result._init_workingtree()
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.
2399
        return result
2400
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2401
    def network_name(self):
2402
        return self.get_format_string()
2403
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
2404
    def _open(self, transport):
2405
        """See BzrDirFormat._open."""
2406
        return BzrDir5(transport, self)
2407
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.
2408
    def __return_repository_format(self):
2409
        """Circular import protection."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2410
        from bzrlib.repofmt.weaverepo import RepositoryFormat5
1910.2.12 by Aaron Bentley
Implement knit repo format 2
2411
        return RepositoryFormat5()
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.
2412
    repository_format = property(__return_repository_format)
2413
1534.4.39 by Robert Collins
Basic BzrDir support.
2414
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
2415
class BzrDirFormat6(BzrDirFormatAllInOne):
1534.4.39 by Robert Collins
Basic BzrDir support.
2416
    """Bzr control format 6.
2417
2418
    This format is a combined format for working tree, branch and repository.
2419
    It has:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2420
     - Format 2 working trees [always]
2421
     - Format 4 branches [always]
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.
2422
     - Format 6 repositories [always]
1534.4.39 by Robert Collins
Basic BzrDir support.
2423
    """
2424
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2425
    _lock_class = lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
2426
1534.4.39 by Robert Collins
Basic BzrDir support.
2427
    def get_format_string(self):
2428
        """See BzrDirFormat.get_format_string()."""
2429
        return "Bazaar-NG branch, format 6\n"
2430
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
2431
    def get_format_description(self):
2432
        """See BzrDirFormat.get_format_description()."""
2433
        return "All-in-one format 6"
2434
3650.2.2 by Aaron Bentley
Implement get_branch_format, to unify branch creation code
2435
    def get_branch_format(self):
2436
        from bzrlib import branch
2437
        return branch.BzrBranchFormat4()
2438
1534.5.16 by Robert Collins
Review feedback.
2439
    def get_converter(self, format=None):
2440
        """See BzrDirFormat.get_converter()."""
1534.5.13 by Robert Collins
Correct buggy test.
2441
        # there is one and only one upgrade path here.
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2442
        return ConvertBzrDir6ToMeta()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2443
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
2444
    def _initialize_for_clone(self, url):
2445
        return self.initialize_on_transport(get_transport(url), _cloning=True)
2446
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
2447
    def initialize_on_transport(self, transport, _cloning=False):
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.
2448
        """Format 6 dirs always have working tree, branch and repository.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2449
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.
2450
        Except when they are being cloned.
2451
        """
2452
        from bzrlib.branch import BzrBranchFormat4
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2453
        from bzrlib.repofmt.weaverepo import RepositoryFormat6
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
2454
        result = super(BzrDirFormat6, self).initialize_on_transport(transport)
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.
2455
        RepositoryFormat6().initialize(result, _internal=True)
2456
        if not _cloning:
1910.5.1 by Andrew Bennetts
Make some old formats create at least a stub working tree rather than incomplete bzrdirs, and change some tests to use the test suite transport rather than hard-coded to local-only.
2457
            branch = BzrBranchFormat4().initialize(result)
3650.5.7 by Aaron Bentley
Fix working tree initialization
2458
            result._init_workingtree()
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.
2459
        return result
2460
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2461
    def network_name(self):
2462
        return self.get_format_string()
2463
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
2464
    def _open(self, transport):
2465
        """See BzrDirFormat._open."""
2466
        return BzrDir6(transport, self)
2467
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.
2468
    def __return_repository_format(self):
2469
        """Circular import protection."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2470
        from bzrlib.repofmt.weaverepo import RepositoryFormat6
1910.2.12 by Aaron Bentley
Implement knit repo format 2
2471
        return RepositoryFormat6()
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.
2472
    repository_format = property(__return_repository_format)
2473
1534.4.39 by Robert Collins
Basic BzrDir support.
2474
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
2475
class BzrDirMetaFormat1(BzrDirFormat):
2476
    """Bzr meta control format 1
2477
2478
    This is the first format with split out working tree, branch and repository
2479
    disk storage.
2480
    It has:
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
2481
     - Format 3 working trees [optional]
2482
     - Format 5 branches [optional]
2483
     - 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.
2484
    """
2485
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2486
    _lock_class = lockdir.LockDir
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
2487
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
2488
    def __init__(self):
2489
        self._workingtree_format = None
2230.3.1 by Aaron Bentley
Get branch6 creation working
2490
        self._branch_format = None
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
2491
        self._repository_format = None
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
2492
2100.3.15 by Aaron Bentley
get test suite passing
2493
    def __eq__(self, other):
2494
        if other.__class__ is not self.__class__:
2495
            return False
2496
        if other.repository_format != self.repository_format:
2497
            return False
2498
        if other.workingtree_format != self.workingtree_format:
2499
            return False
2500
        return True
2501
2100.3.35 by Aaron Bentley
equality operations on bzrdir
2502
    def __ne__(self, other):
2503
        return not self == other
2504
2230.3.55 by Aaron Bentley
Updates from review
2505
    def get_branch_format(self):
2230.3.1 by Aaron Bentley
Get branch6 creation working
2506
        if self._branch_format is None:
2507
            from bzrlib.branch import BranchFormat
2508
            self._branch_format = BranchFormat.get_default_format()
2509
        return self._branch_format
2510
2230.3.55 by Aaron Bentley
Updates from review
2511
    def set_branch_format(self, format):
2230.3.1 by Aaron Bentley
Get branch6 creation working
2512
        self._branch_format = format
2513
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.
2514
    def require_stacking(self, stack_on=None, possible_transports=None,
2515
            _skip_repo=False):
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
2516
        """We have a request to stack, try to ensure the formats support it.
2517
2518
        :param stack_on: If supplied, it is the URL to a branch that we want to
2519
            stack on. Check to see if that format supports stacking before
2520
            forcing an upgrade.
2521
        """
2522
        # Stacking is desired. requested by the target, but does the place it
2523
        # points at support stacking? If it doesn't then we should
2524
        # not implicitly upgrade. We check this here.
2525
        new_repo_format = None
2526
        new_branch_format = None
2527
2528
        # a bit of state for get_target_branch so that we don't try to open it
2529
        # 2 times, for both repo *and* branch
2530
        target = [None, False, None] # target_branch, checked, upgrade anyway
2531
        def get_target_branch():
2532
            if target[1]:
2533
                # We've checked, don't check again
2534
                return target
2535
            if stack_on is None:
2536
                # No target format, that means we want to force upgrading
2537
                target[:] = [None, True, True]
2538
                return target
2539
            try:
2540
                target_dir = BzrDir.open(stack_on,
2541
                    possible_transports=possible_transports)
2542
            except errors.NotBranchError:
2543
                # Nothing there, don't change formats
2544
                target[:] = [None, True, False]
2545
                return target
2546
            except errors.JailBreak:
2547
                # JailBreak, JFDI and upgrade anyway
2548
                target[:] = [None, True, True]
2549
                return target
2550
            try:
2551
                target_branch = target_dir.open_branch()
2552
            except errors.NotBranchError:
2553
                # No branch, don't upgrade formats
2554
                target[:] = [None, True, False]
2555
                return target
2556
            target[:] = [target_branch, True, False]
2557
            return target
2558
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.
2559
        if (not _skip_repo and
2560
                 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.
2561
            # We need to upgrade the Repository.
2562
            target_branch, _, do_upgrade = get_target_branch()
2563
            if target_branch is None:
2564
                # We don't have a target branch, should we upgrade anyway?
2565
                if do_upgrade:
2566
                    # stack_on is inaccessible, JFDI.
2567
                    # TODO: bad monkey, hard-coded formats...
2568
                    if self.repository_format.rich_root_data:
4401.1.3 by John Arbash Meinel
Change back to defaulting to --1.6 format, and update the blackbox tests.
2569
                        new_repo_format = pack_repo.RepositoryFormatKnitPack5RichRoot()
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
2570
                    else:
4401.1.3 by John Arbash Meinel
Change back to defaulting to --1.6 format, and update the blackbox tests.
2571
                        new_repo_format = pack_repo.RepositoryFormatKnitPack5()
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
2572
            else:
2573
                # If the target already supports stacking, then we know the
2574
                # project is already able to use stacking, so auto-upgrade
2575
                # for them
2576
                new_repo_format = target_branch.repository._format
2577
                if not new_repo_format.supports_external_lookups:
2578
                    # target doesn't, source doesn't, so don't auto upgrade
2579
                    # repo
2580
                    new_repo_format = None
2581
            if new_repo_format is not None:
2582
                self.repository_format = new_repo_format
2583
                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.
2584
                     ' 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.
2585
                     new_repo_format.get_format_description())
2586
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
2587
        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.
2588
            # We just checked the repo, now lets check if we need to
2589
            # upgrade the branch format
2590
            target_branch, _, do_upgrade = get_target_branch()
2591
            if target_branch is None:
2592
                if do_upgrade:
2593
                    # TODO: bad monkey, hard-coded formats...
2594
                    new_branch_format = branch.BzrBranchFormat7()
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
2595
            else:
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
2596
                new_branch_format = target_branch._format
2597
                if not new_branch_format.supports_stacking():
2598
                    new_branch_format = None
2599
            if new_branch_format is not None:
2600
                # Does support stacking, use its format.
2601
                self.set_branch_format(new_branch_format)
2602
                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.
2603
                     ' 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.
2604
                     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.
2605
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.
2606
    def get_converter(self, format=None):
2607
        """See BzrDirFormat.get_converter()."""
2608
        if format is None:
2609
            format = BzrDirFormat.get_default_format()
2610
        if not isinstance(self, format.__class__):
2611
            # converting away from metadir is not implemented
2612
            raise NotImplementedError(self.get_converter)
2613
        return ConvertMetaToMeta(format)
2614
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
2615
    def get_format_string(self):
2616
        """See BzrDirFormat.get_format_string()."""
2617
        return "Bazaar-NG meta directory, format 1\n"
2618
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
2619
    def get_format_description(self):
2620
        """See BzrDirFormat.get_format_description()."""
2621
        return "Meta directory format 1"
2622
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2623
    def network_name(self):
2624
        return self.get_format_string()
2625
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
2626
    def _open(self, transport):
2627
        """See BzrDirFormat._open."""
4294.2.12 by Robert Collins
Prevent aliasing issues with BzrDirMetaFormat1 by making a new format object in _open.
2628
        # Create a new format instance because otherwise initialisation of new
2629
        # metadirs share the global default format object leading to alias
2630
        # problems.
2631
        format = BzrDirMetaFormat1()
2632
        self._supply_sub_formats_to(format)
2633
        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.
2634
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.
2635
    def __return_repository_format(self):
2636
        """Circular import protection."""
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
2637
        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.
2638
            return self._repository_format
2639
        from bzrlib.repository import RepositoryFormat
2640
        return RepositoryFormat.get_default_format()
2641
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.
2642
    def _set_repository_format(self, value):
3015.2.8 by Robert Collins
Typo in __set_repository_format's docstring.
2643
        """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.
2644
        self._repository_format = value
1553.5.72 by Martin Pool
Clean up test for Branch5 lockdirs
2645
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.
2646
    repository_format = property(__return_repository_format,
2647
        _set_repository_format)
2648
2649
    def _supply_sub_formats_to(self, other_format):
2650
        """Give other_format the same values for sub formats as this has.
2651
2652
        This method is expected to be used when parameterising a
2653
        RemoteBzrDirFormat instance with the parameters from a
2654
        BzrDirMetaFormat1 instance.
2655
2656
        :param other_format: other_format is a format which should be
2657
            compatible with whatever sub formats are supported by self.
2658
        :return: None.
2659
        """
2660
        if getattr(self, '_repository_format', None) is not None:
2661
            other_format.repository_format = self.repository_format
2662
        if self._branch_format is not None:
2663
            other_format._branch_format = self._branch_format
2664
        if self._workingtree_format is not None:
2665
            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.
2666
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
2667
    def __get_workingtree_format(self):
2668
        if self._workingtree_format is None:
2669
            from bzrlib.workingtree import WorkingTreeFormat
2670
            self._workingtree_format = WorkingTreeFormat.get_default_format()
2671
        return self._workingtree_format
2672
2673
    def __set_workingtree_format(self, wt_format):
2674
        self._workingtree_format = wt_format
2675
2676
    workingtree_format = property(__get_workingtree_format,
2677
                                  __set_workingtree_format)
2678
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
2679
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2680
network_format_registry = registry.FormatRegistry()
2681
"""Registry of formats indexed by their network name.
2682
2683
The network name for a BzrDirFormat is an identifier that can be used when
2684
referring to formats with smart server operations. See
2685
BzrDirFormat.network_name() for more detail.
2686
"""
2687
2688
2164.2.19 by Vincent Ladeuil
Revert BzrDirFormat1 registering.
2689
# Register bzr control format
2690
BzrDirFormat.register_control_format(BzrDirFormat)
2164.2.13 by v.ladeuil+lp at free
Add tests for redirection. Preserve transport decorations.
2691
2692
# Register bzr formats
1534.4.39 by Robert Collins
Basic BzrDir support.
2693
BzrDirFormat.register_format(BzrDirFormat4())
2694
BzrDirFormat.register_format(BzrDirFormat5())
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
2695
BzrDirFormat.register_format(BzrDirFormat6())
2696
__default_format = BzrDirMetaFormat1()
1534.4.39 by Robert Collins
Basic BzrDir support.
2697
BzrDirFormat.register_format(__default_format)
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
2698
BzrDirFormat._default_format = __default_format
1534.4.39 by Robert Collins
Basic BzrDir support.
2699
2700
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2701
class Converter(object):
2702
    """Converts a disk format object from one format to another."""
2703
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2704
    def convert(self, to_convert, pb):
2705
        """Perform the conversion of to_convert, giving feedback via pb.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2706
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2707
        :param to_convert: The disk object to convert.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2708
        :param pb: a progress bar to use for progress information.
2709
        """
2710
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.
2711
    def step(self, message):
2712
        """Update the pb by a step."""
2713
        self.count +=1
2714
        self.pb.update(message, self.count, self.total)
2715
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2716
2717
class ConvertBzrDir4To5(Converter):
2718
    """Converts format 4 bzr dirs to format 5."""
2719
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2720
    def __init__(self):
2721
        super(ConvertBzrDir4To5, self).__init__()
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2722
        self.converted_revs = set()
2723
        self.absent_revisions = set()
2724
        self.text_count = 0
2725
        self.revisions = {}
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2726
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2727
    def convert(self, to_convert, pb):
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2728
        """See Converter.convert()."""
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2729
        self.bzrdir = to_convert
4961.2.14 by Martin Pool
Further pb cleanups
2730
        if pb is not None:
2731
            warnings.warn("pb parameter to convert() is deprecated")
2732
        self.pb = ui.ui_factory.nested_progress_bar()
2733
        try:
2734
            ui.ui_factory.note('starting upgrade from format 4 to 5')
2735
            if isinstance(self.bzrdir.transport, local.LocalTransport):
2736
                self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
2737
            self._convert_to_weaves()
5158.6.9 by Martin Pool
Simplify various code to use user_url
2738
            return BzrDir.open(self.bzrdir.user_url)
4961.2.14 by Martin Pool
Further pb cleanups
2739
        finally:
2740
            self.pb.finished()
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2741
2742
    def _convert_to_weaves(self):
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
2743
        ui.ui_factory.note('note: upgrade may be faster if all store files are ungzipped first')
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2744
        try:
2745
            # TODO permissions
2746
            stat = self.bzrdir.transport.stat('weaves')
2747
            if not S_ISDIR(stat.st_mode):
2748
                self.bzrdir.transport.delete('weaves')
2749
                self.bzrdir.transport.mkdir('weaves')
2750
        except errors.NoSuchFile:
2751
            self.bzrdir.transport.mkdir('weaves')
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
2752
        # deliberately not a WeaveFile as we want to build it up slowly.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2753
        self.inv_weave = Weave('inventory')
2754
        # holds in-memory weaves for all files
2755
        self.text_weaves = {}
2756
        self.bzrdir.transport.delete('branch-format')
2757
        self.branch = self.bzrdir.open_branch()
2758
        self._convert_working_inv()
2759
        rev_history = self.branch.revision_history()
2760
        # to_read is a stack holding the revisions we still need to process;
2761
        # appending to it adds new highest-priority revisions
2762
        self.known_revisions = set(rev_history)
2763
        self.to_read = rev_history[-1:]
2764
        while self.to_read:
2765
            rev_id = self.to_read.pop()
2766
            if (rev_id not in self.revisions
2767
                and rev_id not in self.absent_revisions):
2768
                self._load_one_rev(rev_id)
2769
        self.pb.clear()
2770
        to_import = self._make_order()
2771
        for i, rev_id in enumerate(to_import):
2772
            self.pb.update('converting revision', i, len(to_import))
2773
            self._convert_one_rev(rev_id)
2774
        self.pb.clear()
2775
        self._write_all_weaves()
2776
        self._write_all_revs()
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
2777
        ui.ui_factory.note('upgraded to weaves:')
2778
        ui.ui_factory.note('  %6d revisions and inventories' % len(self.revisions))
2779
        ui.ui_factory.note('  %6d revisions not present' % len(self.absent_revisions))
2780
        ui.ui_factory.note('  %6d texts' % self.text_count)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2781
        self._cleanup_spare_files_after_format4()
3407.2.13 by Martin Pool
Remove indirection through control_files to get transports
2782
        self.branch._transport.put_bytes(
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2783
            'branch-format',
2784
            BzrDirFormat5().get_format_string(),
3446.1.1 by Martin Pool
merge further LockableFile deprecations
2785
            mode=self.bzrdir._get_file_mode())
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2786
2787
    def _cleanup_spare_files_after_format4(self):
2788
        # FIXME working tree upgrade foo.
2789
        for n in 'merged-patches', 'pending-merged-patches':
2790
            try:
2791
                ## assert os.path.getsize(p) == 0
2792
                self.bzrdir.transport.delete(n)
2793
            except errors.NoSuchFile:
2794
                pass
2795
        self.bzrdir.transport.delete_tree('inventory-store')
2796
        self.bzrdir.transport.delete_tree('text-store')
2797
2798
    def _convert_working_inv(self):
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
2799
        inv = xml4.serializer_v4.read_inventory(
3407.2.1 by Martin Pool
Deprecate LockableFiles.get
2800
                self.branch._transport.get('inventory'))
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2801
        new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv, working=True)
3407.2.1 by Martin Pool
Deprecate LockableFiles.get
2802
        self.branch._transport.put_bytes('inventory', new_inv_xml,
3446.1.1 by Martin Pool
merge further LockableFile deprecations
2803
            mode=self.bzrdir._get_file_mode())
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2804
2805
    def _write_all_weaves(self):
2806
        controlweaves = WeaveStore(self.bzrdir.transport, prefixed=False)
2807
        weave_transport = self.bzrdir.transport.clone('weaves')
2808
        weaves = WeaveStore(weave_transport, prefixed=False)
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
2809
        transaction = WriteTransaction()
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2810
2811
        try:
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
2812
            i = 0
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2813
            for file_id, file_weave in self.text_weaves.items():
2814
                self.pb.update('writing weave', i, len(self.text_weaves))
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
2815
                weaves._put_weave(file_id, file_weave, transaction)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2816
                i += 1
1563.2.10 by Robert Collins
Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations.
2817
            self.pb.update('inventory', 0, 1)
2818
            controlweaves._put_weave('inventory', self.inv_weave, transaction)
2819
            self.pb.update('inventory', 1, 1)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2820
        finally:
2821
            self.pb.clear()
2822
2823
    def _write_all_revs(self):
2824
        """Write all revisions out in new form."""
2825
        self.bzrdir.transport.delete_tree('revision-store')
2826
        self.bzrdir.transport.mkdir('revision-store')
2827
        revision_transport = self.bzrdir.transport.clone('revision-store')
2828
        # TODO permissions
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
2829
        from bzrlib.xml5 import serializer_v5
3350.6.10 by Martin Pool
VersionedFiles review cleanups
2830
        from bzrlib.repofmt.weaverepo import RevisionTextStore
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
2831
        revision_store = RevisionTextStore(revision_transport,
2832
            serializer_v5, False, versionedfile.PrefixMapper(),
2833
            lambda:True, lambda:True)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2834
        try:
2835
            for i, rev_id in enumerate(self.converted_revs):
2836
                self.pb.update('write revision', i, len(self.converted_revs))
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
2837
                text = serializer_v5.write_revision_to_string(
2838
                    self.revisions[rev_id])
2839
                key = (rev_id,)
2840
                revision_store.add_lines(key, None, osutils.split_lines(text))
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2841
        finally:
2842
            self.pb.clear()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2843
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2844
    def _load_one_rev(self, rev_id):
2845
        """Load a revision object into memory.
2846
2847
        Any parents not either loaded or abandoned get queued to be
2848
        loaded."""
2849
        self.pb.update('loading revision',
2850
                       len(self.revisions),
2851
                       len(self.known_revisions))
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
2852
        if not self.branch.repository.has_revision(rev_id):
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2853
            self.pb.clear()
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
2854
            ui.ui_factory.note('revision {%s} not present in branch; '
2855
                         'will be converted as a ghost' %
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2856
                         rev_id)
2857
            self.absent_revisions.add(rev_id)
2858
        else:
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
2859
            rev = self.branch.repository.get_revision(rev_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2860
            for parent_id in rev.parent_ids:
2861
                self.known_revisions.add(parent_id)
2862
                self.to_read.append(parent_id)
2863
            self.revisions[rev_id] = rev
2864
2865
    def _load_old_inventory(self, rev_id):
2866
        old_inv_xml = self.branch.repository.inventory_store.get(rev_id).read()
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
2867
        inv = xml4.serializer_v4.read_inventory_from_string(old_inv_xml)
1910.2.36 by Aaron Bentley
Get upgrade from format4 under test and fixed for all formats
2868
        inv.revision_id = rev_id
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2869
        rev = self.revisions[rev_id]
2870
        return inv
2871
2872
    def _load_updated_inventory(self, rev_id):
2873
        inv_xml = self.inv_weave.get_text(rev_id)
3169.2.2 by Robert Collins
Add a test to Repository.deserialise_inventory that the resulting ivnentory is the one asked for, and update relevant tests. Also tweak the model 1 to 2 regenerate inventories logic to use the revision trees parent marker which is more accurate in some cases.
2874
        inv = xml5.serializer_v5.read_inventory_from_string(inv_xml, rev_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2875
        return inv
2876
2877
    def _convert_one_rev(self, rev_id):
2878
        """Convert revision and all referenced objects to new format."""
2879
        rev = self.revisions[rev_id]
2880
        inv = self._load_old_inventory(rev_id)
2881
        present_parents = [p for p in rev.parent_ids
2882
                           if p not in self.absent_revisions]
2883
        self._convert_revision_contents(rev, inv, present_parents)
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2884
        self._store_new_inv(rev, inv, present_parents)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2885
        self.converted_revs.add(rev_id)
2886
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2887
    def _store_new_inv(self, rev, inv, present_parents):
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
2888
        new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2889
        new_inv_sha1 = sha_string(new_inv_xml)
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2890
        self.inv_weave.add_lines(rev.revision_id,
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
2891
                                 present_parents,
2892
                                 new_inv_xml.splitlines(True))
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2893
        rev.inventory_sha1 = new_inv_sha1
2894
2895
    def _convert_revision_contents(self, rev, inv, present_parents):
2896
        """Convert all the files within a revision.
2897
2898
        Also upgrade the inventory to refer to the text revision ids."""
2899
        rev_id = rev.revision_id
2900
        mutter('converting texts of revision {%s}',
2901
               rev_id)
2902
        parent_invs = map(self._load_updated_inventory, present_parents)
1731.1.62 by Aaron Bentley
Changes from review comments
2903
        entries = inv.iter_entries()
2904
        entries.next()
2905
        for path, ie in entries:
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2906
            self._convert_file_version(rev, ie, parent_invs)
2907
2908
    def _convert_file_version(self, rev, ie, parent_invs):
2909
        """Convert one version of one file.
2910
2911
        The file needs to be added into the weave if it is a merge
2912
        of >=2 parents or if it's changed from its parent.
2913
        """
2914
        file_id = ie.file_id
2915
        rev_id = rev.revision_id
2916
        w = self.text_weaves.get(file_id)
2917
        if w is None:
2918
            w = Weave(file_id)
2919
            self.text_weaves[file_id] = w
2920
        text_changed = False
2776.1.5 by Robert Collins
Add reasonably comprehensive tests for path last modified and per file graph behaviour.
2921
        parent_candiate_entries = ie.parent_candidates(parent_invs)
2922
        heads = graph.Graph(self).heads(parent_candiate_entries.keys())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2923
        # XXX: Note that this is unordered - and this is tolerable because
2776.1.5 by Robert Collins
Add reasonably comprehensive tests for path last modified and per file graph behaviour.
2924
        # the previous code was also unordered.
2925
        previous_entries = dict((head, parent_candiate_entries[head]) for head
2926
            in heads)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2927
        self.snapshot_ie(previous_entries, ie, w, rev_id)
2928
        del ie.text_id
2929
3099.3.7 by John Arbash Meinel
Another parent provider I didn't realize existed.
2930
    def get_parent_map(self, revision_ids):
4379.3.3 by Gary van der Merwe
Rename and add doc string for StackedParentsProvider.
2931
        """See graph.StackedParentsProvider.get_parent_map"""
3099.3.7 by John Arbash Meinel
Another parent provider I didn't realize existed.
2932
        return dict((revision_id, self.revisions[revision_id])
2933
                    for revision_id in revision_ids
2934
                     if revision_id in self.revisions)
2935
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2936
    def snapshot_ie(self, previous_revisions, ie, w, rev_id):
2937
        # TODO: convert this logic, which is ~= snapshot to
2938
        # a call to:. This needs the path figured out. rather than a work_tree
2939
        # a v4 revision_tree can be given, or something that looks enough like
2940
        # one to give the file content to the entry if it needs it.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2941
        # and we need something that looks like a weave store for snapshot to
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2942
        # save against.
2943
        #ie.snapshot(rev, PATH, previous_revisions, REVISION_TREE, InMemoryWeaveStore(self.text_weaves))
2944
        if len(previous_revisions) == 1:
2945
            previous_ie = previous_revisions.values()[0]
2946
            if ie._unchanged(previous_ie):
2947
                ie.revision = previous_ie.revision
2948
                return
2949
        if ie.has_text():
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
2950
            text = self.branch.repository._text_store.get(ie.text_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2951
            file_lines = text.readlines()
1563.2.18 by Robert Collins
get knit repositories really using knits for text storage.
2952
            w.add_lines(rev_id, previous_revisions, file_lines)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2953
            self.text_count += 1
2954
        else:
1563.2.18 by Robert Collins
get knit repositories really using knits for text storage.
2955
            w.add_lines(rev_id, previous_revisions, [])
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2956
        ie.revision = rev_id
2957
2958
    def _make_order(self):
2959
        """Return a suitable order for importing revisions.
2960
2961
        The order must be such that an revision is imported after all
2962
        its (present) parents.
2963
        """
2964
        todo = set(self.revisions.keys())
2965
        done = self.absent_revisions.copy()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2966
        order = []
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2967
        while todo:
2968
            # scan through looking for a revision whose parents
2969
            # are all done
2970
            for rev_id in sorted(list(todo)):
2971
                rev = self.revisions[rev_id]
2972
                parent_ids = set(rev.parent_ids)
2973
                if parent_ids.issubset(done):
2974
                    # can take this one now
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2975
                    order.append(rev_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2976
                    todo.remove(rev_id)
2977
                    done.add(rev_id)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2978
        return order
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2979
2980
2981
class ConvertBzrDir5To6(Converter):
2982
    """Converts format 5 bzr dirs to format 6."""
2983
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2984
    def convert(self, to_convert, pb):
2985
        """See Converter.convert()."""
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2986
        self.bzrdir = to_convert
4961.2.18 by Martin Pool
Remove more pb-passing
2987
        pb = ui.ui_factory.nested_progress_bar()
4961.2.14 by Martin Pool
Further pb cleanups
2988
        try:
2989
            ui.ui_factory.note('starting upgrade from format 5 to 6')
2990
            self._convert_to_prefixed()
5158.6.9 by Martin Pool
Simplify various code to use user_url
2991
            return BzrDir.open(self.bzrdir.user_url)
4961.2.14 by Martin Pool
Further pb cleanups
2992
        finally:
2993
            pb.finished()
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2994
2995
    def _convert_to_prefixed(self):
1608.2.1 by Martin Pool
[merge] Storage filename escaping
2996
        from bzrlib.store import TransportStore
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2997
        self.bzrdir.transport.delete('branch-format')
2998
        for store_name in ["weaves", "revision-store"]:
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
2999
            ui.ui_factory.note("adding prefixes to %s" % store_name)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3000
            store_transport = self.bzrdir.transport.clone(store_name)
1608.2.1 by Martin Pool
[merge] Storage filename escaping
3001
            store = TransportStore(store_transport, prefixed=True)
1608.1.1 by Martin Pool
[patch] LocalTransport.list_dir should return url-quoted strings (ddaa)
3002
            for urlfilename in store_transport.list_dir('.'):
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
3003
                filename = urlutils.unescape(urlfilename)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3004
                if (filename.endswith(".weave") or
3005
                    filename.endswith(".gz") or
3006
                    filename.endswith(".sig")):
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
3007
                    file_id, suffix = os.path.splitext(filename)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3008
                else:
3009
                    file_id = filename
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
3010
                    suffix = ''
3011
                new_name = store._mapper.map((file_id,)) + suffix
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3012
                # FIXME keep track of the dirs made RBC 20060121
3013
                try:
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
3014
                    store_transport.move(filename, new_name)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3015
                except errors.NoSuchFile: # catches missing dirs strangely enough
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
3016
                    store_transport.mkdir(osutils.dirname(new_name))
3017
                    store_transport.move(filename, new_name)
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
3018
        self.bzrdir.transport.put_bytes(
3019
            'branch-format',
3020
            BzrDirFormat6().get_format_string(),
3407.2.18 by Martin Pool
BzrDir takes responsibility for default file/dir modes
3021
            mode=self.bzrdir._get_file_mode())
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3022
3023
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
3024
class ConvertBzrDir6ToMeta(Converter):
3025
    """Converts format 6 bzr dirs to metadirs."""
3026
3027
    def convert(self, to_convert, pb):
3028
        """See Converter.convert()."""
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
3029
        from bzrlib.repofmt.weaverepo import RepositoryFormat7
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
3030
        from bzrlib.branch import BzrBranchFormat5
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
3031
        self.bzrdir = to_convert
4961.2.14 by Martin Pool
Further pb cleanups
3032
        self.pb = ui.ui_factory.nested_progress_bar()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3033
        self.count = 0
3034
        self.total = 20 # the steps we know about
3035
        self.garbage_inventories = []
3407.2.18 by Martin Pool
BzrDir takes responsibility for default file/dir modes
3036
        self.dir_mode = self.bzrdir._get_dir_mode()
3037
        self.file_mode = self.bzrdir._get_file_mode()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3038
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
3039
        ui.ui_factory.note('starting upgrade from format 6 to metadir')
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
3040
        self.bzrdir.transport.put_bytes(
3041
                'branch-format',
3042
                "Converting to format 6",
3043
                mode=self.file_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3044
        # its faster to move specific files around than to open and use the apis...
3045
        # first off, nuke ancestry.weave, it was never used.
3046
        try:
3047
            self.step('Removing ancestry.weave')
3048
            self.bzrdir.transport.delete('ancestry.weave')
3049
        except errors.NoSuchFile:
3050
            pass
3051
        # find out whats there
3052
        self.step('Finding branch files')
1666.1.3 by Robert Collins
Fix and test upgrades from bzrdir 6 over SFTP.
3053
        last_revision = self.bzrdir.open_branch().last_revision()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3054
        bzrcontents = self.bzrdir.transport.list_dir('.')
3055
        for name in bzrcontents:
3056
            if name.startswith('basis-inventory.'):
3057
                self.garbage_inventories.append(name)
3058
        # create new directories for repository, working tree and branch
3059
        repository_names = [('inventory.weave', True),
3060
                            ('revision-store', True),
3061
                            ('weaves', True)]
3062
        self.step('Upgrading repository  ')
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
3063
        self.bzrdir.transport.mkdir('repository', mode=self.dir_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3064
        self.make_lock('repository')
3065
        # we hard code the formats here because we are converting into
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3066
        # the meta format. The meta format upgrader can take this to a
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3067
        # future format within each component.
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
3068
        self.put_format('repository', RepositoryFormat7())
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3069
        for entry in repository_names:
3070
            self.move_entry('repository', entry)
3071
3072
        self.step('Upgrading branch      ')
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
3073
        self.bzrdir.transport.mkdir('branch', mode=self.dir_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3074
        self.make_lock('branch')
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
3075
        self.put_format('branch', BzrBranchFormat5())
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3076
        branch_files = [('revision-history', True),
3077
                        ('branch-name', True),
3078
                        ('parent', False)]
3079
        for entry in branch_files:
3080
            self.move_entry('branch', entry)
3081
3082
        checkout_files = [('pending-merges', True),
3083
                          ('inventory', True),
3084
                          ('stat-cache', False)]
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
3085
        # If a mandatory checkout file is not present, the branch does not have
3086
        # a functional checkout. Do not create a checkout in the converted
3087
        # branch.
3088
        for name, mandatory in checkout_files:
3089
            if mandatory and name not in bzrcontents:
3090
                has_checkout = False
3091
                break
3092
        else:
3093
            has_checkout = True
3094
        if not has_checkout:
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
3095
            ui.ui_factory.note('No working tree.')
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
3096
            # If some checkout files are there, we may as well get rid of them.
3097
            for name, mandatory in checkout_files:
3098
                if name in bzrcontents:
3099
                    self.bzrdir.transport.delete(name)
3100
        else:
2123.2.1 by John Arbash Meinel
Fix bug #70716, make bzrlib.bzrdir directly import bzrlib.workingtree
3101
            from bzrlib.workingtree import WorkingTreeFormat3
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
3102
            self.step('Upgrading working tree')
3103
            self.bzrdir.transport.mkdir('checkout', mode=self.dir_mode)
3104
            self.make_lock('checkout')
3105
            self.put_format(
2123.2.1 by John Arbash Meinel
Fix bug #70716, make bzrlib.bzrdir directly import bzrlib.workingtree
3106
                'checkout', WorkingTreeFormat3())
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
3107
            self.bzrdir.transport.delete_multi(
3108
                self.garbage_inventories, self.pb)
3109
            for entry in checkout_files:
3110
                self.move_entry('checkout', entry)
3111
            if last_revision is not None:
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
3112
                self.bzrdir.transport.put_bytes(
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
3113
                    'checkout/last-revision', last_revision)
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
3114
        self.bzrdir.transport.put_bytes(
3115
            'branch-format',
3116
            BzrDirMetaFormat1().get_format_string(),
3117
            mode=self.file_mode)
4961.2.14 by Martin Pool
Further pb cleanups
3118
        self.pb.finished()
5158.6.9 by Martin Pool
Simplify various code to use user_url
3119
        return BzrDir.open(self.bzrdir.user_url)
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
3120
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3121
    def make_lock(self, name):
3122
        """Make a lock for the new control dir name."""
3123
        self.step('Make %s lock' % name)
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
3124
        ld = lockdir.LockDir(self.bzrdir.transport,
3125
                             '%s/lock' % name,
3126
                             file_modebits=self.file_mode,
3127
                             dir_modebits=self.dir_mode)
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
3128
        ld.create()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3129
3130
    def move_entry(self, new_dir, entry):
3131
        """Move then entry name into new_dir."""
3132
        name = entry[0]
3133
        mandatory = entry[1]
3134
        self.step('Moving %s' % name)
3135
        try:
3136
            self.bzrdir.transport.move(name, '%s/%s' % (new_dir, name))
3137
        except errors.NoSuchFile:
3138
            if mandatory:
3139
                raise
3140
3141
    def put_format(self, dirname, format):
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
3142
        self.bzrdir.transport.put_bytes('%s/format' % dirname,
3143
            format.get_format_string(),
3144
            self.file_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3145
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.
3146
3147
class ConvertMetaToMeta(Converter):
3148
    """Converts the components of metadirs."""
3149
3150
    def __init__(self, target_format):
3151
        """Create a metadir to metadir converter.
3152
3153
        :param target_format: The final metadir format that is desired.
3154
        """
3155
        self.target_format = target_format
3156
3157
    def convert(self, to_convert, pb):
3158
        """See Converter.convert()."""
3159
        self.bzrdir = to_convert
4961.2.14 by Martin Pool
Further pb cleanups
3160
        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.
3161
        self.count = 0
3162
        self.total = 1
3163
        self.step('checking repository format')
3164
        try:
3165
            repo = self.bzrdir.open_repository()
3166
        except errors.NoRepositoryPresent:
3167
            pass
3168
        else:
3169
            if not isinstance(repo._format, self.target_format.repository_format.__class__):
3170
                from bzrlib.repository import CopyConverter
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
3171
                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.
3172
                converter = CopyConverter(self.target_format.repository_format)
3173
                converter.convert(repo, pb)
4997.1.3 by Jelmer Vernooij
Use list_branches during upgrades.
3174
        for branch in self.bzrdir.list_branches():
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3175
            # TODO: conversions of Branch and Tree should be done by
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3176
            # InterXFormat lookups/some sort of registry.
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
3177
            # Avoid circular imports
3178
            from bzrlib import branch as _mod_branch
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3179
            old = branch._format.__class__
3180
            new = self.target_format.get_branch_format().__class__
3181
            while old != new:
3182
                if (old == _mod_branch.BzrBranchFormat5 and
3183
                    new in (_mod_branch.BzrBranchFormat6,
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
3184
                        _mod_branch.BzrBranchFormat7,
3185
                        _mod_branch.BzrBranchFormat8)):
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3186
                    branch_converter = _mod_branch.Converter5to6()
3187
                elif (old == _mod_branch.BzrBranchFormat6 and
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
3188
                    new in (_mod_branch.BzrBranchFormat7,
3189
                            _mod_branch.BzrBranchFormat8)):
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3190
                    branch_converter = _mod_branch.Converter6to7()
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
3191
                elif (old == _mod_branch.BzrBranchFormat7 and
3192
                      new is _mod_branch.BzrBranchFormat8):
3193
                    branch_converter = _mod_branch.Converter7to8()
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3194
                else:
4608.1.3 by Martin Pool
BadConversionTarget error includes source format
3195
                    raise errors.BadConversionTarget("No converter", new,
3196
                        branch._format)
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
3197
                branch_converter.convert(branch)
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3198
                branch = self.bzrdir.open_branch()
3199
                old = branch._format.__class__
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3200
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
3201
            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.
3202
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3203
            pass
3204
        else:
3205
            # TODO: conversions of Branch and Tree should be done by
3206
            # InterXFormat lookups
3207
            if (isinstance(tree, workingtree.WorkingTree3) and
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
3208
                not isinstance(tree, workingtree_4.DirStateWorkingTree) and
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3209
                isinstance(self.target_format.workingtree_format,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
3210
                    workingtree_4.DirStateWorkingTreeFormat)):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3211
                workingtree_4.Converter3to4().convert(tree)
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
3212
            if (isinstance(tree, workingtree_4.DirStateWorkingTree) and
3213
                not isinstance(tree, workingtree_4.WorkingTree5) and
3586.1.8 by Ian Clatworthy
add workingtree_5 and initial upgrade code
3214
                isinstance(self.target_format.workingtree_format,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
3215
                    workingtree_4.WorkingTreeFormat5)):
3216
                workingtree_4.Converter4to5().convert(tree)
4210.4.2 by Ian Clatworthy
split filtered views support out into WorkingTreeFormat6
3217
            if (isinstance(tree, workingtree_4.DirStateWorkingTree) and
3218
                not isinstance(tree, workingtree_4.WorkingTree6) and
3219
                isinstance(self.target_format.workingtree_format,
3220
                    workingtree_4.WorkingTreeFormat6)):
3221
                workingtree_4.Converter4or5to6().convert(tree)
4961.2.14 by Martin Pool
Further pb cleanups
3222
        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.
3223
        return to_convert
1731.2.18 by Aaron Bentley
Get extract in repository under test
3224
3225
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3226
# This is not in remote.py because it's relatively small, and needs to be
3227
# registered. Putting it in remote.py creates a circular import problem.
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
3228
# we can make it a lazy object if the control formats is turned into something
3229
# like a registry.
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3230
class RemoteBzrDirFormat(BzrDirMetaFormat1):
3231
    """Format representing bzrdirs accessed via a smart server"""
3232
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
3233
    def __init__(self):
3234
        BzrDirMetaFormat1.__init__(self)
4934.4.3 by Martin Pool
Initializing a bzrdir shouldn't mutate the RemoteBzrDirFormat
3235
        # XXX: It's a bit ugly that the network name is here, because we'd
3236
        # like to believe that format objects are stateless or at least
3237
        # immutable,  However, we do at least avoid mutating the name after
3238
        # it's returned.  See <https://bugs.edge.launchpad.net/bzr/+bug/504102>
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
3239
        self._network_name = None
3240
4934.3.2 by Martin Pool
Add RemoteBzrDirFormat repr
3241
    def __repr__(self):
3242
        return "%s(_network_name=%r)" % (self.__class__.__name__,
3243
            self._network_name)
3244
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3245
    def get_format_description(self):
4792.1.1 by Andrew Bennetts
Show real branch/repo format description in 'info -v' over HPSS.
3246
        if self._network_name:
3247
            real_format = network_format_registry.get(self._network_name)
4792.3.1 by Matt Nordhoff
Fix missing space in the description for remote bzrdirs
3248
            return 'Remote: ' + real_format.get_format_description()
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3249
        return 'bzr remote bzrdir'
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3250
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
3251
    def get_format_string(self):
3252
        raise NotImplementedError(self.get_format_string)
4032.3.6 by Robert Collins
Fix test_source errors.
3253
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
3254
    def network_name(self):
3255
        if self._network_name:
3256
            return self._network_name
3257
        else:
3258
            raise AssertionError("No network name set.")
3259
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
3260
    @classmethod
3261
    def probe_transport(klass, transport):
3262
        """Return a RemoteBzrDirFormat object if it looks possible."""
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3263
        try:
3241.1.4 by Andrew Bennetts
Use get_smart_medium as suggested by Robert, and deal with the fallout.
3264
            medium = transport.get_smart_medium()
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3265
        except (NotImplementedError, AttributeError,
3245.4.47 by Andrew Bennetts
Don't automatically send 'hello' requests from RemoteBzrDirFormat.probe_transport unless we have to (i.e. the transport is HTTP).
3266
                errors.TransportNotPossible, errors.NoSmartMedium,
3267
                errors.SmartProtocolError):
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
3268
            # no smart server, so not a branch for this format type.
3269
            raise errors.NotBranchError(path=transport.base)
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3270
        else:
3241.1.2 by Andrew Bennetts
Tidy comments.
3271
            # Decline to open it if the server doesn't support our required
3245.4.14 by Andrew Bennetts
Merge from bzr.dev (via loom thread).
3272
            # version (3) so that the VFS-based transport will do it.
3245.4.47 by Andrew Bennetts
Don't automatically send 'hello' requests from RemoteBzrDirFormat.probe_transport unless we have to (i.e. the transport is HTTP).
3273
            if medium.should_probe():
3274
                try:
3275
                    server_version = medium.protocol_version()
3276
                except errors.SmartProtocolError:
3277
                    # Apparently there's no usable smart server there, even though
3278
                    # the medium supports the smart protocol.
3279
                    raise errors.NotBranchError(path=transport.base)
3280
                if server_version != '2':
3281
                    raise errors.NotBranchError(path=transport.base)
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
3282
            return klass()
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3283
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
3284
    def initialize_on_transport(self, transport):
2018.5.128 by Robert Collins
Have RemoteBzrDirFormat create a local format object when it is asked to initialize something on a non-smart transport - allowing sprout to work cleanly.
3285
        try:
3286
            # hand off the request to the smart server
3313.2.1 by Andrew Bennetts
Change _SmartClient's API to accept a medium and a base, rather than a _SharedConnection.
3287
            client_medium = transport.get_smart_medium()
2018.5.128 by Robert Collins
Have RemoteBzrDirFormat create a local format object when it is asked to initialize something on a non-smart transport - allowing sprout to work cleanly.
3288
        except errors.NoSmartMedium:
3289
            # TODO: lookup the local format from a server hint.
3290
            local_dir_format = BzrDirMetaFormat1()
3291
            return local_dir_format.initialize_on_transport(transport)
3431.3.2 by Andrew Bennetts
Remove 'base' from _SmartClient entirely, now that the medium has it.
3292
        client = _SmartClient(client_medium)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
3293
        path = client.remote_path_from_transport(transport)
4384.1.1 by Andrew Bennetts
Translate ErrorFromSmartServer in RemoteBzrDirFormat.
3294
        try:
3295
            response = client.call('BzrDirFormat.initialize', path)
3296
        except errors.ErrorFromSmartServer, err:
3297
            remote._translate_error(err, path=path)
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
3298
        if response[0] != 'ok':
3299
            raise errors.SmartProtocolError('unexpected response code %s' % (response,))
4005.2.3 by Robert Collins
Fix test failure due to shared format objects being returned from initialize_on_transport.
3300
        format = RemoteBzrDirFormat()
3301
        self._supply_sub_formats_to(format)
3302
        return remote.RemoteBzrDir(transport, format)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
3303
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3304
    def parse_NoneTrueFalse(self, arg):
3305
        if not arg:
3306
            return None
3307
        if arg == 'False':
3308
            return False
3309
        if arg == 'True':
3310
            return True
3311
        raise AssertionError("invalid arg %r" % arg)
3312
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3313
    def _serialize_NoneTrueFalse(self, arg):
3314
        if arg is False:
3315
            return 'False'
3316
        if arg:
3317
            return 'True'
3318
        return ''
3319
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3320
    def _serialize_NoneString(self, arg):
3321
        return arg or ''
3322
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3323
    def initialize_on_transport_ex(self, transport, use_existing_dir=False,
3324
        create_prefix=False, force_new_repo=False, stacked_on=None,
3325
        stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
3326
        shared_repo=False):
3327
        try:
3328
            # hand off the request to the smart server
3329
            client_medium = transport.get_smart_medium()
3330
        except errors.NoSmartMedium:
4294.2.9 by Robert Collins
Fixup tests broken by cleaning up the layering.
3331
            do_vfs = True
3332
        else:
3333
            # Decline to open it if the server doesn't support our required
3334
            # version (3) so that the VFS-based transport will do it.
3335
            if client_medium.should_probe():
3336
                try:
3337
                    server_version = client_medium.protocol_version()
3338
                    if server_version != '2':
3339
                        do_vfs = True
3340
                    else:
3341
                        do_vfs = False
3342
                except errors.SmartProtocolError:
3343
                    # Apparently there's no usable smart server there, even though
3344
                    # the medium supports the smart protocol.
3345
                    do_vfs = True
3346
            else:
3347
                do_vfs = False
3348
        if not do_vfs:
3349
            client = _SmartClient(client_medium)
3350
            path = client.remote_path_from_transport(transport)
4436.1.1 by Andrew Bennetts
Rename BzrDirFormat.initialize_ex verb to BzrDirFormat.initialize_ex_1.16.
3351
            if client_medium._is_remote_before((1, 16)):
4294.2.9 by Robert Collins
Fixup tests broken by cleaning up the layering.
3352
                do_vfs = True
3353
        if do_vfs:
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3354
            # TODO: lookup the local format from a server hint.
3355
            local_dir_format = BzrDirMetaFormat1()
3356
            self._supply_sub_formats_to(local_dir_format)
3357
            return local_dir_format.initialize_on_transport_ex(transport,
3358
                use_existing_dir=use_existing_dir, create_prefix=create_prefix,
3359
                force_new_repo=force_new_repo, stacked_on=stacked_on,
3360
                stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3361
                make_working_trees=make_working_trees, shared_repo=shared_repo,
3362
                vfs_only=True)
4384.1.1 by Andrew Bennetts
Translate ErrorFromSmartServer in RemoteBzrDirFormat.
3363
        return self._initialize_on_transport_ex_rpc(client, path, transport,
3364
            use_existing_dir, create_prefix, force_new_repo, stacked_on,
3365
            stack_on_pwd, repo_format_name, make_working_trees, shared_repo)
3366
3367
    def _initialize_on_transport_ex_rpc(self, client, path, transport,
3368
        use_existing_dir, create_prefix, force_new_repo, stacked_on,
3369
        stack_on_pwd, repo_format_name, make_working_trees, shared_repo):
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3370
        args = []
3371
        args.append(self._serialize_NoneTrueFalse(use_existing_dir))
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3372
        args.append(self._serialize_NoneTrueFalse(create_prefix))
3373
        args.append(self._serialize_NoneTrueFalse(force_new_repo))
3374
        args.append(self._serialize_NoneString(stacked_on))
3375
        # stack_on_pwd is often/usually our transport
3376
        if stack_on_pwd:
3377
            try:
3378
                stack_on_pwd = transport.relpath(stack_on_pwd)
3379
                if not stack_on_pwd:
3380
                    stack_on_pwd = '.'
3381
            except errors.PathNotChild:
3382
                pass
3383
        args.append(self._serialize_NoneString(stack_on_pwd))
3384
        args.append(self._serialize_NoneString(repo_format_name))
3385
        args.append(self._serialize_NoneTrueFalse(make_working_trees))
3386
        args.append(self._serialize_NoneTrueFalse(shared_repo))
4934.4.3 by Martin Pool
Initializing a bzrdir shouldn't mutate the RemoteBzrDirFormat
3387
        request_network_name = self._network_name or \
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3388
            BzrDirFormat.get_default_format().network_name()
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3389
        try:
4436.1.1 by Andrew Bennetts
Rename BzrDirFormat.initialize_ex verb to BzrDirFormat.initialize_ex_1.16.
3390
            response = client.call('BzrDirFormat.initialize_ex_1.16',
4934.4.3 by Martin Pool
Initializing a bzrdir shouldn't mutate the RemoteBzrDirFormat
3391
                request_network_name, path, *args)
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3392
        except errors.UnknownSmartMethod:
4436.1.1 by Andrew Bennetts
Rename BzrDirFormat.initialize_ex verb to BzrDirFormat.initialize_ex_1.16.
3393
            client._medium._remember_remote_is_before((1,16))
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3394
            local_dir_format = BzrDirMetaFormat1()
3395
            self._supply_sub_formats_to(local_dir_format)
3396
            return local_dir_format.initialize_on_transport_ex(transport,
3397
                use_existing_dir=use_existing_dir, create_prefix=create_prefix,
3398
                force_new_repo=force_new_repo, stacked_on=stacked_on,
3399
                stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3400
                make_working_trees=make_working_trees, shared_repo=shared_repo,
3401
                vfs_only=True)
4384.1.1 by Andrew Bennetts
Translate ErrorFromSmartServer in RemoteBzrDirFormat.
3402
        except errors.ErrorFromSmartServer, err:
3403
            remote._translate_error(err, path=path)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3404
        repo_path = response[0]
3405
        bzrdir_name = response[6]
3406
        require_stacking = response[7]
3407
        require_stacking = self.parse_NoneTrueFalse(require_stacking)
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3408
        format = RemoteBzrDirFormat()
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3409
        format._network_name = bzrdir_name
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3410
        self._supply_sub_formats_to(format)
4307.2.1 by Robert Collins
Don't probe for bzrdir objects we just created via the smart server.
3411
        bzrdir = remote.RemoteBzrDir(transport, format, _client=client)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3412
        if repo_path:
3413
            repo_format = remote.response_tuple_to_repo_format(response[1:])
3414
            if repo_path == '.':
3415
                repo_path = ''
3416
            if repo_path:
3417
                repo_bzrdir_format = RemoteBzrDirFormat()
3418
                repo_bzrdir_format._network_name = response[5]
3419
                repo_bzr = remote.RemoteBzrDir(transport.clone(repo_path),
3420
                    repo_bzrdir_format)
3421
            else:
3422
                repo_bzr = bzrdir
3423
            final_stack = response[8] or None
3424
            final_stack_pwd = response[9] or None
4416.3.8 by Jonathan Lange
This makes the unit test & one of the acceptance tests pass.
3425
            if final_stack_pwd:
4416.3.15 by Jonathan Lange
Use a URL joiner that works.
3426
                final_stack_pwd = urlutils.join(
3427
                    transport.base, final_stack_pwd)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3428
            remote_repo = remote.RemoteRepository(repo_bzr, repo_format)
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
3429
            if len(response) > 10:
3430
                # Updated server verb that locks remotely.
3431
                repo_lock_token = response[10] or None
3432
                remote_repo.lock_write(repo_lock_token, _skip_rpc=True)
4307.2.6 by Robert Collins
Handle repositories that mutex on writes (rather than transactions).
3433
                if repo_lock_token:
3434
                    remote_repo.dont_leave_lock_in_place()
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
3435
            else:
4307.2.6 by Robert Collins
Handle repositories that mutex on writes (rather than transactions).
3436
                remote_repo.lock_write()
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3437
            policy = UseExistingRepository(remote_repo, final_stack,
3438
                final_stack_pwd, require_stacking)
3439
            policy.acquire_repository()
3440
        else:
3441
            remote_repo = None
3442
            policy = None
4466.1.1 by Andrew Bennetts
Quick fix 388908: set branch format on the result of initialize_ex before calling require_stacking.
3443
        bzrdir._format.set_branch_format(self.get_branch_format())
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.
3444
        if require_stacking:
3445
            # The repo has already been created, but we need to make sure that
3446
            # we'll make a stackable branch.
3447
            bzrdir._format.require_stacking(_skip_repo=True)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3448
        return remote_repo, bzrdir, require_stacking, policy
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3449
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3450
    def _open(self, transport):
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.
3451
        return remote.RemoteBzrDir(transport, self)
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3452
3453
    def __eq__(self, other):
3454
        if not isinstance(other, RemoteBzrDirFormat):
3455
            return False
3456
        return self.get_format_description() == other.get_format_description()
3457
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.
3458
    def __return_repository_format(self):
3459
        # Always return a RemoteRepositoryFormat object, but if a specific bzr
3460
        # repository format has been asked for, tell the RemoteRepositoryFormat
3461
        # that it should use that for init() etc.
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.
3462
        result = remote.RemoteRepositoryFormat()
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.
3463
        custom_format = getattr(self, '_repository_format', None)
3464
        if custom_format:
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
3465
            if isinstance(custom_format, remote.RemoteRepositoryFormat):
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.
3466
                return custom_format
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
3467
            else:
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.
3468
                # We will use the custom format to create repositories over the
3469
                # wire; expose its details like rich_root_data for code to
3470
                # query
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
3471
                result._custom_format = custom_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.
3472
        return result
3473
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
3474
    def get_branch_format(self):
3475
        result = BzrDirMetaFormat1.get_branch_format(self)
3476
        if not isinstance(result, remote.RemoteBranchFormat):
3477
            new_result = remote.RemoteBranchFormat()
3478
            new_result._custom_format = result
3479
            # cache the result
3480
            self.set_branch_format(new_result)
3481
            result = new_result
3482
        return result
3483
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.
3484
    repository_format = property(__return_repository_format,
3485
        BzrDirMetaFormat1._set_repository_format) #.im_func)
3845.1.1 by John Arbash Meinel
Ensure that RepositoryFormat._matchingbzrdir.repository_format matches.
3486
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3487
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
3488
BzrDirFormat.register_control_server_format(RemoteBzrDirFormat)
2018.5.45 by Andrew Bennetts
Merge from bzr.dev
3489
3490
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3491
class BzrDirFormatInfo(object):
3492
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3493
    def __init__(self, native, deprecated, hidden, experimental):
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3494
        self.deprecated = deprecated
3495
        self.native = native
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3496
        self.hidden = hidden
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3497
        self.experimental = experimental
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3498
3499
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3500
class BzrDirFormatRegistry(registry.Registry):
3501
    """Registry of user-selectable BzrDir subformats.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3502
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3503
    Differs from BzrDirFormat._control_formats in that it provides sub-formats,
3504
    e.g. BzrDirMeta1 with weave repository.  Also, it's more user-oriented.
3505
    """
3506
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3507
    def __init__(self):
3508
        """Create a BzrDirFormatRegistry."""
3509
        self._aliases = set()
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3510
        self._registration_order = list()
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3511
        super(BzrDirFormatRegistry, self).__init__()
3512
3513
    def aliases(self):
3514
        """Return a set of the format names which are aliases."""
3515
        return frozenset(self._aliases)
3516
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3517
    def register_metadir(self, key,
3518
             repository_format, help, native=True, deprecated=False,
3519
             branch_format=None,
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3520
             tree_format=None,
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3521
             hidden=False,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3522
             experimental=False,
3523
             alias=False):
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3524
        """Register a metadir subformat.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
3525
3526
        These all use a BzrDirMetaFormat1 bzrdir, but can be parameterized
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
3527
        by the Repository/Branch/WorkingTreeformats.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
3528
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3529
        :param repository_format: The fully-qualified repository format class
3530
            name as a string.
3531
        :param branch_format: Fully-qualified branch format class name as
3532
            a string.
3533
        :param tree_format: Fully-qualified tree format class name as
3534
            a string.
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3535
        """
3536
        # This should be expanded to support setting WorkingTree and Branch
3537
        # formats, once BzrDirMetaFormat1 supports that.
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3538
        def _load(full_name):
3539
            mod_name, factory_name = full_name.rsplit('.', 1)
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
3540
            try:
3541
                mod = __import__(mod_name, globals(), locals(),
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3542
                        [factory_name])
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
3543
            except ImportError, e:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3544
                raise ImportError('failed to load %s: %s' % (full_name, e))
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
3545
            try:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3546
                factory = getattr(mod, factory_name)
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
3547
            except AttributeError:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3548
                raise AttributeError('no factory %s in module %r'
3549
                    % (full_name, mod))
3550
            return factory()
3551
3552
        def helper():
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3553
            bd = BzrDirMetaFormat1()
2230.3.1 by Aaron Bentley
Get branch6 creation working
3554
            if branch_format is not None:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3555
                bd.set_branch_format(_load(branch_format))
3556
            if tree_format is not None:
3557
                bd.workingtree_format = _load(tree_format)
3558
            if repository_format is not None:
3559
                bd.repository_format = _load(repository_format)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3560
            return bd
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3561
        self.register(key, helper, help, native, deprecated, hidden,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3562
            experimental, alias)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3563
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3564
    def register(self, key, factory, help, native=True, deprecated=False,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3565
                 hidden=False, experimental=False, alias=False):
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3566
        """Register a BzrDirFormat factory.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3567
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3568
        The factory must be a callable that takes one parameter: the key.
3569
        It must produce an instance of the BzrDirFormat when called.
3570
3571
        This function mainly exists to prevent the info object from being
3572
        supplied directly.
3573
        """
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3574
        registry.Registry.register(self, key, factory, help,
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3575
            BzrDirFormatInfo(native, deprecated, hidden, experimental))
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3576
        if alias:
3577
            self._aliases.add(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3578
        self._registration_order.append(key)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3579
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
3580
    def register_lazy(self, key, module_name, member_name, help, native=True,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3581
        deprecated=False, hidden=False, experimental=False, alias=False):
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3582
        registry.Registry.register_lazy(self, key, module_name, member_name,
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3583
            help, BzrDirFormatInfo(native, deprecated, hidden, experimental))
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3584
        if alias:
3585
            self._aliases.add(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3586
        self._registration_order.append(key)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3587
3588
    def set_default(self, key):
3589
        """Set the 'default' key to be a clone of the supplied key.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3590
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3591
        This method must be called once and only once.
3592
        """
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3593
        registry.Registry.register(self, 'default', self.get(key),
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3594
            self.get_help(key), info=self.get_info(key))
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3595
        self._aliases.add('default')
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3596
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
3597
    def set_default_repository(self, key):
3598
        """Set the FormatRegistry default and Repository default.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3599
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
3600
        This is a transitional method while Repository.set_default_format
3601
        is deprecated.
3602
        """
3603
        if 'default' in self:
3604
            self.remove('default')
3605
        self.set_default(key)
3606
        format = self.get('default')()
3607
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3608
    def make_bzrdir(self, key):
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
3609
        return self.get(key)()
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3610
3611
    def help_topic(self, topic):
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3612
        output = ""
2711.2.4 by Martin Pool
Fix unbound variable error in BzrDirFormatRegistry.get_help (test order dependent)
3613
        default_realkey = None
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3614
        default_help = self.get_help('default')
3615
        help_pairs = []
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3616
        for key in self._registration_order:
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3617
            if key == 'default':
3618
                continue
3619
            help = self.get_help(key)
3620
            if help == default_help:
3621
                default_realkey = key
3622
            else:
3623
                help_pairs.append((key, help))
3624
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3625
        def wrapped(key, help, info):
3626
            if info.native:
3627
                help = '(native) ' + help
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3628
            return ':%s:\n%s\n\n' % (key,
4070.11.2 by Martin Pool
Ask textwrap not to break long words or on hyphens
3629
                textwrap.fill(help, initial_indent='    ',
3630
                    subsequent_indent='    ',
4070.11.5 by Martin Pool
textwrap break_on_hyphens option is not available in python2.5
3631
                    break_long_words=False))
2711.2.4 by Martin Pool
Fix unbound variable error in BzrDirFormatRegistry.get_help (test order dependent)
3632
        if default_realkey is not None:
3633
            output += wrapped(default_realkey, '(default) %s' % default_help,
3634
                              self.get_info('default'))
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3635
        deprecated_pairs = []
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3636
        experimental_pairs = []
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3637
        for key, help in help_pairs:
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3638
            info = self.get_info(key)
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3639
            if info.hidden:
3640
                continue
3641
            elif info.deprecated:
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3642
                deprecated_pairs.append((key, help))
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3643
            elif info.experimental:
3644
                experimental_pairs.append((key, help))
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3645
            else:
3646
                output += wrapped(key, help, info)
4927.2.4 by Ian Clatworthy
improve linking in other-formats and current-formats
3647
        output += "\nSee :doc:`formats-help` for more about storage formats."
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3648
        other_output = ""
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3649
        if len(experimental_pairs) > 0:
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3650
            other_output += "Experimental formats are shown below.\n\n"
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3651
            for key, help in experimental_pairs:
3652
                info = self.get_info(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3653
                other_output += wrapped(key, help, info)
3654
        else:
3655
            other_output += \
3656
                "No experimental formats are available.\n\n"
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3657
        if len(deprecated_pairs) > 0:
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3658
            other_output += "\nDeprecated formats are shown below.\n\n"
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3659
            for key, help in deprecated_pairs:
3660
                info = self.get_info(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3661
                other_output += wrapped(key, help, info)
3662
        else:
3663
            other_output += \
3664
                "\nNo deprecated formats are available.\n\n"
3665
        other_output += \
4927.2.4 by Ian Clatworthy
improve linking in other-formats and current-formats
3666
                "\nSee :doc:`formats-help` for more about storage formats."
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3667
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3668
        if topic == 'other-formats':
3669
            return other_output
3670
        else:
3671
            return output
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3672
3673
3242.2.14 by Aaron Bentley
Update from review comments
3674
class RepositoryAcquisitionPolicy(object):
3675
    """Abstract base class for repository acquisition policies.
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
3676
3242.2.14 by Aaron Bentley
Update from review comments
3677
    A repository acquisition policy decides how a BzrDir acquires a repository
3678
    for a branch that is being created.  The most basic policy decision is
3679
    whether to create a new repository or use an existing one.
3680
    """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3681
    def __init__(self, stack_on, stack_on_pwd, require_stacking):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3682
        """Constructor.
3683
3684
        :param stack_on: A location to stack on
3685
        :param stack_on_pwd: If stack_on is relative, the location it is
3686
            relative to.
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3687
        :param require_stacking: If True, it is a failure to not stack.
3242.3.35 by Aaron Bentley
Cleanups and documentation
3688
        """
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
3689
        self._stack_on = stack_on
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
3690
        self._stack_on_pwd = stack_on_pwd
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3691
        self._require_stacking = require_stacking
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
3692
3693
    def configure_branch(self, branch):
3242.2.13 by Aaron Bentley
Update docs
3694
        """Apply any configuration data from this policy to the branch.
3695
3242.3.18 by Aaron Bentley
Clean up repository-policy work
3696
        Default implementation sets repository stacking.
3242.2.13 by Aaron Bentley
Update docs
3697
        """
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3698
        if self._stack_on is None:
3699
            return
3700
        if self._stack_on_pwd is None:
3701
            stack_on = self._stack_on
3702
        else:
3703
            try:
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
3704
                stack_on = urlutils.rebase_url(self._stack_on,
3705
                    self._stack_on_pwd,
5158.6.9 by Martin Pool
Simplify various code to use user_url
3706
                    branch.user_url)
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3707
            except errors.InvalidRebaseURLs:
3708
                stack_on = self._get_full_stack_on()
3242.3.37 by Aaron Bentley
Updates from reviews
3709
        try:
3537.3.5 by Martin Pool
merge trunk including stacking policy
3710
            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.
3711
        except (errors.UnstackableBranchFormat,
3712
                errors.UnstackableRepositoryFormat):
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3713
            if self._require_stacking:
3714
                raise
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3715
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.
3716
    def requires_stacking(self):
3717
        """Return True if this policy requires stacking."""
3718
        return self._stack_on is not None and self._require_stacking
3719
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3720
    def _get_full_stack_on(self):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3721
        """Get a fully-qualified URL for the stack_on location."""
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3722
        if self._stack_on is None:
3723
            return None
3724
        if self._stack_on_pwd is None:
3725
            return self._stack_on
3726
        else:
3727
            return urlutils.join(self._stack_on_pwd, self._stack_on)
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
3728
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
3729
    def _add_fallback(self, repository, possible_transports=None):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3730
        """Add a fallback to the supplied repository, if stacking is set."""
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3731
        stack_on = self._get_full_stack_on()
3732
        if stack_on is None:
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
3733
            return
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3734
        try:
3735
            stacked_dir = BzrDir.open(stack_on,
3736
                                      possible_transports=possible_transports)
3737
        except errors.JailBreak:
3738
            # We keep the stacking details, but we are in the server code so
3739
            # actually stacking is not needed.
3740
            return
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
3741
        try:
3742
            stacked_repo = stacked_dir.open_branch().repository
3743
        except errors.NotBranchError:
3744
            stacked_repo = stacked_dir.open_repository()
3242.3.37 by Aaron Bentley
Updates from reviews
3745
        try:
3746
            repository.add_fallback_repository(stacked_repo)
3747
        except errors.UnstackableRepositoryFormat:
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3748
            if self._require_stacking:
3749
                raise
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
3750
        else:
3751
            self._require_stacking = True
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
3752
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
3753
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
3754
        """Acquire a repository for this bzrdir.
3755
3756
        Implementations may create a new repository or use a pre-exising
3757
        repository.
3758
        :param make_working_trees: If creating a repository, set
3759
            make_working_trees to this value (if non-None)
3760
        :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.
3761
        :return: A repository, is_new_flag (True if the repository was
3762
            created).
3242.2.14 by Aaron Bentley
Update from review comments
3763
        """
3764
        raise NotImplemented(RepositoryAcquisitionPolicy.acquire_repository)
3765
3766
3767
class CreateRepository(RepositoryAcquisitionPolicy):
3242.2.13 by Aaron Bentley
Update docs
3768
    """A policy of creating a new repository"""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3769
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3770
    def __init__(self, bzrdir, stack_on=None, stack_on_pwd=None,
3771
                 require_stacking=False):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3772
        """
3773
        Constructor.
3774
        :param bzrdir: The bzrdir to create the repository on.
3775
        :param stack_on: A location to stack on
3776
        :param stack_on_pwd: If stack_on is relative, the location it is
3777
            relative to.
3778
        """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3779
        RepositoryAcquisitionPolicy.__init__(self, stack_on, stack_on_pwd,
3780
                                             require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3781
        self._bzrdir = bzrdir
3782
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
3783
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
3784
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
3242.2.13 by Aaron Bentley
Update docs
3785
3242.2.14 by Aaron Bentley
Update from review comments
3786
        Creates the desired repository in the bzrdir we already have.
3242.2.13 by Aaron Bentley
Update docs
3787
        """
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.
3788
        stack_on = self._get_full_stack_on()
3789
        if stack_on:
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
3790
            format = self._bzrdir._format
3791
            format.require_stacking(stack_on=stack_on,
3792
                                    possible_transports=[self._bzrdir.root_transport])
3793
            if not self._require_stacking:
3794
                # We have picked up automatic stacking somewhere.
3795
                note('Using default stacking branch %s at %s', self._stack_on,
3796
                    self._stack_on_pwd)
3650.3.9 by Aaron Bentley
Move responsibility for stackable repo format to _get_metadir
3797
        repository = self._bzrdir.create_repository(shared=shared)
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
3798
        self._add_fallback(repository,
3799
                           possible_transports=[self._bzrdir.transport])
3242.2.4 by Aaron Bentley
Only set working tree policty when specified
3800
        if make_working_trees is not None:
3242.3.6 by Aaron Bentley
Work around strange test failure
3801
            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.
3802
        return repository, True
3242.2.2 by Aaron Bentley
Merge policy updates from stacked-policy thread
3803
3804
3242.2.14 by Aaron Bentley
Update from review comments
3805
class UseExistingRepository(RepositoryAcquisitionPolicy):
3242.2.13 by Aaron Bentley
Update docs
3806
    """A policy of reusing an existing repository"""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3807
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3808
    def __init__(self, repository, stack_on=None, stack_on_pwd=None,
3809
                 require_stacking=False):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3810
        """Constructor.
3811
3812
        :param repository: The repository to use.
3813
        :param stack_on: A location to stack on
3814
        :param stack_on_pwd: If stack_on is relative, the location it is
3815
            relative to.
3816
        """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3817
        RepositoryAcquisitionPolicy.__init__(self, stack_on, stack_on_pwd,
3818
                                             require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3819
        self._repository = repository
3820
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
3821
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
3822
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
3242.2.13 by Aaron Bentley
Update docs
3823
4070.9.8 by Andrew Bennetts
Use MiniSearchResult in clone_on_transport down (further tightening the test_push ratchets), and improve acquire_repository docstrings.
3824
        Returns an existing repository to use.
3242.2.13 by Aaron Bentley
Update docs
3825
        """
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
3826
        self._add_fallback(self._repository,
3827
                       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.
3828
        return self._repository, False
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3829
3830
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3831
# Please register new formats after old formats so that formats
3832
# appear in chronological order and format descriptions can build
3833
# on previous ones.
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3834
format_registry = BzrDirFormatRegistry()
3990.5.3 by Robert Collins
Docs and polish on RepositoryFormat.network_name.
3835
# The pre-0.8 formats have their repository format network name registered in
3836
# repository.py. MetaDir formats have their repository format network name
3837
# inferred from their disk format string.
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
3838
format_registry.register('weave', BzrDirFormat6,
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3839
    'Pre-0.8 format.  Slower than knit and does not'
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
3840
    ' support checkouts or shared repositories.',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3841
    hidden=True,
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
3842
    deprecated=True)
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
3843
format_registry.register_metadir('metaweave',
3844
    'bzrlib.repofmt.weaverepo.RepositoryFormat7',
2230.3.30 by Aaron Bentley
Fix whitespace issues
3845
    'Transitional format in 0.8.  Slower than knit.',
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3846
    branch_format='bzrlib.branch.BzrBranchFormat5',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
3847
    tree_format='bzrlib.workingtree.WorkingTreeFormat3',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3848
    hidden=True,
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3849
    deprecated=True)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3850
format_registry.register_metadir('knit',
3851
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3852
    'Format using knits.  Recommended for interoperation with bzr <= 0.14.',
3853
    branch_format='bzrlib.branch.BzrBranchFormat5',
3854
    tree_format='bzrlib.workingtree.WorkingTreeFormat3',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3855
    hidden=True,
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3856
    deprecated=True)
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3857
format_registry.register_metadir('dirstate',
3858
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3859
    help='New in 0.15: Fast local operations. Compatible with bzr 0.8 and '
3860
        'above when accessed over the network.',
3861
    branch_format='bzrlib.branch.BzrBranchFormat5',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
3862
    # this uses bzrlib.workingtree.WorkingTreeFormat4 because importing
3863
    # directly from workingtree_4 triggers a circular import.
3864
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3865
    hidden=True,
3892.1.1 by Ian Clatworthy
improve help on storage formats
3866
    deprecated=True)
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
3867
format_registry.register_metadir('dirstate-tags',
3868
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3869
    help='New in 0.15: Fast local operations and improved scaling for '
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3870
        'network operations. Additionally adds support for tags.'
3871
        ' Incompatible with bzr < 0.15.',
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
3872
    branch_format='bzrlib.branch.BzrBranchFormat6',
3873
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3874
    hidden=True,
3892.1.1 by Ian Clatworthy
improve help on storage formats
3875
    deprecated=True)
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
3876
format_registry.register_metadir('rich-root',
3877
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
3878
    help='New in 1.0.  Better handling of tree roots.  Incompatible with'
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3879
        ' bzr < 1.0.',
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
3880
    branch_format='bzrlib.branch.BzrBranchFormat6',
3881
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3882
    hidden=True,
3892.1.1 by Ian Clatworthy
improve help on storage formats
3883
    deprecated=True)
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3884
format_registry.register_metadir('dirstate-with-subtree',
3885
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
3886
    help='New in 0.15: Fast local operations and improved scaling for '
3887
        'network operations. Additionally adds support for versioning nested '
3888
        'bzr branches. Incompatible with bzr < 0.15.',
3889
    branch_format='bzrlib.branch.BzrBranchFormat6',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
3890
    tree_format='bzrlib.workingtree.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.
3891
    experimental=True,
3170.4.4 by Adeodato Simó
Keep the hidden flag for subtree formats after review from Aaron.
3892
    hidden=True,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3893
    )
3010.3.2 by Martin Pool
Rename pack0.92 to pack-0.92
3894
format_registry.register_metadir('pack-0.92',
2592.3.224 by Martin Pool
Rename GraphKnitRepository etc to KnitPackRepository
3895
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack1',
2939.2.1 by Ian Clatworthy
use 'knitpack' naming instead of 'experimental' for pack formats
3896
    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
3897
        'dirstate-tags format repositories. Interoperates with '
3898
        '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
3899
        ,
2592.3.22 by Robert Collins
Add new experimental repository formats.
3900
    branch_format='bzrlib.branch.BzrBranchFormat6',
3901
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3902
    )
3010.3.2 by Martin Pool
Rename pack0.92 to pack-0.92
3903
format_registry.register_metadir('pack-0.92-subtree',
2592.3.224 by Martin Pool
Rename GraphKnitRepository etc to KnitPackRepository
3904
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack3',
2939.2.1 by Ian Clatworthy
use 'knitpack' naming instead of 'experimental' for pack formats
3905
    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
3906
        'dirstate-with-subtree format repositories. Interoperates with '
3907
        '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
3908
        ,
2592.3.22 by Robert Collins
Add new experimental repository formats.
3909
    branch_format='bzrlib.branch.BzrBranchFormat6',
3910
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3190.1.2 by Aaron Bentley
Undo spurious change
3911
    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.
3912
    experimental=True,
2592.3.22 by Robert Collins
Add new experimental repository formats.
3913
    )
2996.2.11 by Aaron Bentley
Implement rich-root-pack format ( #164639)
3914
format_registry.register_metadir('rich-root-pack',
3915
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack4',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3916
    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.
3917
         '(needed for bzr-svn and bzr-git).',
2996.2.11 by Aaron Bentley
Implement rich-root-pack format ( #164639)
3918
    branch_format='bzrlib.branch.BzrBranchFormat6',
3919
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3920
    hidden=True,
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3921
    )
3575.2.1 by Martin Pool
Rename stacked format to 1.6
3922
format_registry.register_metadir('1.6',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3923
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5',
3892.1.6 by Ian Clatworthy
include feedback from poolie
3924
    help='A format that allows a branch to indicate that there is another '
3925
         '(stacked) repository that should be used to access data that is '
3926
         'not present locally.',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3927
    branch_format='bzrlib.branch.BzrBranchFormat7',
3928
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3929
    hidden=True,
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3930
    )
3606.10.2 by John Arbash Meinel
Name the new format 1.6.1-rich-root, and NEWS for fixing bug #262333
3931
format_registry.register_metadir('1.6.1-rich-root',
3549.1.6 by Martin Pool
Change stacked-subtree to stacked-rich-root
3932
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5RichRoot',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3933
    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.
3934
         '(needed for bzr-svn and bzr-git).',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3935
    branch_format='bzrlib.branch.BzrBranchFormat7',
3936
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3937
    hidden=True,
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3938
    )
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3939
format_registry.register_metadir('1.9',
3940
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3892.1.6 by Ian Clatworthy
include feedback from poolie
3941
    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
3942
         'are smaller in size, have smarter caching and provide faster '
3943
         'performance for most operations.',
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3944
    branch_format='bzrlib.branch.BzrBranchFormat7',
3945
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3946
    hidden=True,
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3947
    )
3948
format_registry.register_metadir('1.9-rich-root',
3949
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3950
    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.
3951
         '(needed for bzr-svn and bzr-git).',
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3952
    branch_format='bzrlib.branch.BzrBranchFormat7',
3953
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3954
    hidden=True,
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3955
    )
4210.4.1 by Ian Clatworthy
replace experimental development-wt5 formats with 1.14 formats
3956
format_registry.register_metadir('1.14',
3586.2.10 by Ian Clatworthy
rename formats from 1.7-* to 1.12-*
3957
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
4210.4.2 by Ian Clatworthy
split filtered views support out into WorkingTreeFormat6
3958
    help='A working-tree format that supports content filtering.',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
3959
    branch_format='bzrlib.branch.BzrBranchFormat7',
3995.7.1 by John Arbash Meinel
Fix bug #328135.
3960
    tree_format='bzrlib.workingtree.WorkingTreeFormat5',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
3961
    )
4210.4.1 by Ian Clatworthy
replace experimental development-wt5 formats with 1.14 formats
3962
format_registry.register_metadir('1.14-rich-root',
3586.2.10 by Ian Clatworthy
rename formats from 1.7-* to 1.12-*
3963
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
4210.4.1 by Ian Clatworthy
replace experimental development-wt5 formats with 1.14 formats
3964
    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.
3965
         '(needed for bzr-svn and bzr-git).',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
3966
    branch_format='bzrlib.branch.BzrBranchFormat7',
3995.7.1 by John Arbash Meinel
Fix bug #328135.
3967
    tree_format='bzrlib.workingtree.WorkingTreeFormat5',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
3968
    )
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)
3969
# The following un-numbered 'development' formats should always just be aliases.
3970
format_registry.register_metadir('development-rich-root',
3971
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
4241.15.17 by Matt Nordhoff
development-rich-root's help string didn't say it supported rich roots.
3972
    help='Current development format. Supports rich roots. Can convert data '
3973
        'to and from rich-root-pack (and anything compatible with '
3974
        'rich-root-pack) format repositories. Repositories and branches in '
3975
        '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
3976
        '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
3977
        'before use.',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
3978
    branch_format='bzrlib.branch.BzrBranchFormat7',
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)
3979
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3980
    experimental=True,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3981
    alias=True,
4976.2.1 by Ian Clatworthy
Hide most storage formats
3982
    hidden=True,
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3983
    )
3984
format_registry.register_metadir('development-subtree',
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
3985
    'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3986
    help='Current development format, subtree variant. Can convert data to and '
3221.11.7 by Robert Collins
Merge in real stacked repository work.
3987
        'from pack-0.92-subtree (and anything compatible with '
3988
        'pack-0.92-subtree) format repositories. Repositories and branches in '
3989
        '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
3990
        '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
3991
        'before use.',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
3992
    branch_format='bzrlib.branch.BzrBranchFormat7',
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)
3993
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3994
    experimental=True,
4976.2.1 by Ian Clatworthy
Hide most storage formats
3995
    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)
3996
    alias=False, # Restore to being an alias when an actual development subtree format is added
3997
                 # This current non-alias status is simply because we did not introduce a
3998
                 # chk based subtree format.
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3999
    )
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)
4000
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
4001
# And the development formats above will have aliased one of the following:
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)
4002
format_registry.register_metadir('development6-rich-root',
4003
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
4004
    help='pack-1.9 with 255-way hashed CHK inv, group compress, rich roots '
4005
        'Please read '
4988.4.2 by Martin Pool
Change url to canonical.com or wiki, plus some doc improvements in passing
4006
        'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
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)
4007
        'before use.',
4008
    branch_format='bzrlib.branch.BzrBranchFormat7',
4009
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4010
    hidden=True,
3735.31.1 by John Arbash Meinel
Bring the groupcompress plugin into the brisbane-core branch.
4011
    experimental=True,
4012
    )
4013
4290.1.7 by Jelmer Vernooij
Add development7-rich-root format that uses the RIO Serializer.
4014
format_registry.register_metadir('development7-rich-root',
4015
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
4290.1.12 by Jelmer Vernooij
Use bencode rather than rio in the new revision serialiszer.
4016
    help='pack-1.9 with 255-way hashed CHK inv, bencode revision, group compress, '
4290.1.7 by Jelmer Vernooij
Add development7-rich-root format that uses the RIO Serializer.
4017
        'rich roots. Please read '
4988.4.2 by Martin Pool
Change url to canonical.com or wiki, plus some doc improvements in passing
4018
        'http://doc.bazaar.canonical.com/latest/developers/development-repo.html '
4290.1.7 by Jelmer Vernooij
Add development7-rich-root format that uses the RIO Serializer.
4019
        'before use.',
4020
    branch_format='bzrlib.branch.BzrBranchFormat7',
4021
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4022
    hidden=True,
4023
    experimental=True,
4024
    )
4025
4428.2.1 by Martin Pool
Add 2a format
4026
format_registry.register_metadir('2a',
4027
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
4028
    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
4029
        'Uses group-compress storage.\n'
4428.2.6 by Martin Pool
Stupid typo fix
4030
        '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
4031
        # 'storage in packs, 255-way hashed CHK inventory, bencode revision, group compress, '
4032
        # 'rich roots. Supported by bzr 1.16 and later.',
4428.2.1 by Martin Pool
Add 2a format
4033
    branch_format='bzrlib.branch.BzrBranchFormat7',
4034
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4428.2.5 by Martin Pool
Mark 2a experimental and tweak its help per lifeless's review
4035
    experimental=True,
4428.2.1 by Martin Pool
Add 2a format
4036
    )
4428.2.2 by Martin Pool
Format 2a should not be hidden
4037
4119.6.2 by Jelmer Vernooij
Use existing alias mechanism for default-rich-root.
4038
# The following format should be an alias for the rich root equivalent 
4039
# of the default format
4040
format_registry.register_metadir('default-rich-root',
4599.4.37 by Robert Collins
Fix registration of default-rich-root as 2a.
4041
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
4042
    branch_format='bzrlib.branch.BzrBranchFormat7',
4043
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4599.4.23 by Robert Collins
default-rich-root should be an alias still.
4044
    alias=True,
4976.2.1 by Ian Clatworthy
Hide most storage formats
4045
    hidden=True,
4599.4.22 by mbp at sourcefrog
Don't forget to set default-rich-root to 2a too.
4046
    help='Same as 2a.')
4047
3221.11.2 by Robert Collins
Create basic stackable branch facility.
4048
# The current format that is made on 'bzr init'.
4599.4.1 by Robert Collins
Change the default format to 2a.
4049
format_registry.set_default('2a')