/brz/remove-bazaar

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