~bzr-pqm/bzr/bzr.dev

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