/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
1540
    def open_repository(self):
1541
        """See BzrDir.open_repository."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1542
        from bzrlib.repofmt.weaverepo import RepositoryFormat5
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1543
        return RepositoryFormat5().open(self, _found=True)
1544
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1545
    def open_workingtree(self, _unsupported=False,
1546
            recommend_upgrade=True):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1547
        """See BzrDir.create_workingtree."""
1548
        from bzrlib.workingtree import WorkingTreeFormat2
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1549
        wt_format = WorkingTreeFormat2()
1550
        # we don't warn here about upgrades; that ought to be handled for the
1551
        # bzrdir as a whole
1552
        return wt_format.open(self, _found=True)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1553
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1554
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1555
class BzrDir6(BzrDirPreSplitOut):
1508.1.25 by Robert Collins
Update per review comments.
1556
    """A .bzr version 6 control object.
1557
1558
    This is a deprecated format and may be removed after sept 2006.
1559
    """
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1560
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1561
    def open_repository(self):
1562
        """See BzrDir.open_repository."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1563
        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.
1564
        return RepositoryFormat6().open(self, _found=True)
1565
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1566
    def open_workingtree(self, _unsupported=False,
1567
        recommend_upgrade=True):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1568
        """See BzrDir.create_workingtree."""
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1569
        # we don't warn here about upgrades; that ought to be handled for the
1570
        # 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.
1571
        from bzrlib.workingtree import WorkingTreeFormat2
1572
        return WorkingTreeFormat2().open(self, _found=True)
1573
1574
1575
class BzrDirMeta1(BzrDir):
1576
    """A .bzr meta version 1 control object.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1577
1578
    This is the first control object where the
1553.5.67 by Martin Pool
doc
1579
    individual aspects are really split out: there are separate repository,
1580
    workingtree and branch subdirectories and any subset of the three can be
1581
    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.
1582
    """
1583
1534.5.16 by Robert Collins
Review feedback.
1584
    def can_convert_format(self):
1585
        """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.
1586
        return True
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1587
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1588
    def create_branch(self):
1589
        """See BzrDir.create_branch."""
2230.3.55 by Aaron Bentley
Updates from review
1590
        return self._format.get_branch_format().initialize(self)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1591
2796.2.6 by Aaron Bentley
Implement destroy_branch
1592
    def destroy_branch(self):
1593
        """See BzrDir.create_branch."""
1594
        self.transport.delete_tree('branch')
1595
1534.6.1 by Robert Collins
allow API creation of shared repositories
1596
    def create_repository(self, shared=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1597
        """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.
1598
        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.
1599
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
1600
    def destroy_repository(self):
1601
        """See BzrDir.destroy_repository."""
1602
        self.transport.delete_tree('repository')
1603
3123.5.2 by Aaron Bentley
Allow checkout --files_from
1604
    def create_workingtree(self, revision_id=None, from_branch=None,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1605
                           accelerator_tree=None, hardlink=False):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1606
        """See BzrDir.create_workingtree."""
2955.5.3 by Vincent Ladeuil
Fix second unwanted connection by providing the right branch to create_checkout.
1607
        return self._format.workingtree_format.initialize(
3123.5.2 by Aaron Bentley
Allow checkout --files_from
1608
            self, revision_id, from_branch=from_branch,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1609
            accelerator_tree=accelerator_tree, hardlink=hardlink)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1610
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1611
    def destroy_workingtree(self):
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
1612
        """See BzrDir.destroy_workingtree."""
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1613
        wt = self.open_workingtree(recommend_upgrade=False)
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1614
        repository = wt.branch.repository
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
1615
        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'
1616
        wt.revert(old_tree=empty)
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1617
        self.destroy_workingtree_metadata()
1618
1619
    def destroy_workingtree_metadata(self):
1620
        self.transport.delete_tree('checkout')
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
1621
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
1622
    def find_branch_format(self):
1623
        """Find the branch 'format' for this bzrdir.
1624
1625
        This might be a synthetic object for e.g. RemoteBranch and SVN.
1626
        """
1627
        from bzrlib.branch import BranchFormat
1628
        return BranchFormat.find_format(self)
1629
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1630
    def _get_mkdir_mode(self):
1631
        """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
1632
        temp_control = lockable_files.LockableFiles(self.transport, '',
1633
                                     lockable_files.TransportLock)
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1634
        return temp_control._dir_mode
1635
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
1636
    def get_branch_reference(self):
1637
        """See BzrDir.get_branch_reference()."""
1638
        from bzrlib.branch import BranchFormat
1639
        format = BranchFormat.find_format(self)
1640
        return format.get_reference(self)
1641
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1642
    def get_branch_transport(self, branch_format):
1643
        """See BzrDir.get_branch_transport()."""
4570.3.6 by Martin Pool
doc
1644
        # XXX: this shouldn't implicitly create the directory if it's just
1645
        # 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.
1646
        if branch_format is None:
1647
            return self.transport.clone('branch')
1648
        try:
1649
            branch_format.get_format_string()
1650
        except NotImplementedError:
1651
            raise errors.IncompatibleFormat(branch_format, self._format)
1652
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1653
            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.
1654
        except errors.FileExists:
1655
            pass
1656
        return self.transport.clone('branch')
1657
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1658
    def get_repository_transport(self, repository_format):
1659
        """See BzrDir.get_repository_transport()."""
1660
        if repository_format is None:
1661
            return self.transport.clone('repository')
1662
        try:
1663
            repository_format.get_format_string()
1664
        except NotImplementedError:
1665
            raise errors.IncompatibleFormat(repository_format, self._format)
1666
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1667
            self.transport.mkdir('repository', mode=self._get_mkdir_mode())
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1668
        except errors.FileExists:
1669
            pass
1670
        return self.transport.clone('repository')
1671
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
1672
    def get_workingtree_transport(self, workingtree_format):
1673
        """See BzrDir.get_workingtree_transport()."""
1674
        if workingtree_format is None:
1675
            return self.transport.clone('checkout')
1676
        try:
1677
            workingtree_format.get_format_string()
1678
        except NotImplementedError:
1679
            raise errors.IncompatibleFormat(workingtree_format, self._format)
1680
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1681
            self.transport.mkdir('checkout', mode=self._get_mkdir_mode())
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
1682
        except errors.FileExists:
1683
            pass
1684
        return self.transport.clone('checkout')
1685
1534.5.16 by Robert Collins
Review feedback.
1686
    def needs_format_conversion(self, format=None):
1687
        """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.
1688
        if format is None:
3943.2.5 by Martin Pool
deprecate needs_format_conversion(format=None)
1689
            symbol_versioning.warn(symbol_versioning.deprecated_in((1, 13, 0))
1690
                % 'needs_format_conversion(format=None)')
1691
        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.
1692
            format = BzrDirFormat.get_default_format()
1693
        if not isinstance(self._format, format.__class__):
1694
            # it is not a meta dir format, conversion is needed.
1695
            return True
1696
        # we might want to push this down to the repository?
1697
        try:
1698
            if not isinstance(self.open_repository()._format,
1699
                              format.repository_format.__class__):
1700
                # the repository needs an upgrade.
1701
                return True
1702
        except errors.NoRepositoryPresent:
1703
            pass
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
1704
        try:
1705
            if not isinstance(self.open_branch()._format,
2230.3.55 by Aaron Bentley
Updates from review
1706
                              format.get_branch_format().__class__):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1707
                # the branch needs an upgrade.
1708
                return True
1709
        except errors.NotBranchError:
1710
            pass
1711
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1712
            my_wt = self.open_workingtree(recommend_upgrade=False)
1713
            if not isinstance(my_wt._format,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1714
                              format.workingtree_format.__class__):
1715
                # the workingtree needs an upgrade.
1716
                return True
2255.2.196 by Robert Collins
Fix test_upgrade defects related to non local or absent working trees.
1717
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1718
            pass
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1719
        return False
1720
4160.2.6 by Andrew Bennetts
Add ignore_fallbacks flag.
1721
    def open_branch(self, unsupported=False, ignore_fallbacks=False):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1722
        """See BzrDir.open_branch."""
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
1723
        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.
1724
        self._check_supported(format, unsupported)
4160.2.6 by Andrew Bennetts
Add ignore_fallbacks flag.
1725
        return format.open(self, _found=True, ignore_fallbacks=ignore_fallbacks)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1726
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1727
    def open_repository(self, unsupported=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1728
        """See BzrDir.open_repository."""
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1729
        from bzrlib.repository import RepositoryFormat
1730
        format = RepositoryFormat.find_format(self)
1731
        self._check_supported(format, unsupported)
1732
        return format.open(self, _found=True)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1733
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1734
    def open_workingtree(self, unsupported=False,
1735
            recommend_upgrade=True):
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1736
        """See BzrDir.open_workingtree."""
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1737
        from bzrlib.workingtree import WorkingTreeFormat
1738
        format = WorkingTreeFormat.find_format(self)
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1739
        self._check_supported(format, unsupported,
1740
            recommend_upgrade,
2323.6.5 by Martin Pool
Recommended-upgrade message should give base dir not the control dir url
1741
            basedir=self.root_transport.base)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1742
        return format.open(self, _found=True)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1743
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
1744
    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.
1745
        return config.TransportConfig(self.transport, 'control.conf')
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
1746
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1747
1534.4.39 by Robert Collins
Basic BzrDir support.
1748
class BzrDirFormat(object):
1749
    """An encapsulation of the initialization and open routines for a format.
1750
1751
    Formats provide three things:
1752
     * An initialization routine,
1753
     * a format string,
1754
     * an open routine.
1755
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1756
    Formats are placed in a dict by their format string for reference
1534.4.39 by Robert Collins
Basic BzrDir support.
1757
    during bzrdir opening. These should be subclasses of BzrDirFormat
1758
    for consistency.
1759
1760
    Once a format is deprecated, just deprecate the initialize and open
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1761
    methods on the format class. Do not deprecate the object, as the
1534.4.39 by Robert Collins
Basic BzrDir support.
1762
    object will be created every system load.
1763
    """
1764
1765
    _default_format = None
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1766
    """The default format used for new .bzr dirs."""
1534.4.39 by Robert Collins
Basic BzrDir support.
1767
1768
    _formats = {}
1769
    """The known formats."""
1770
1733.1.7 by Jelmer Vernooij
Change set of control dir formats to list.
1771
    _control_formats = []
1733.1.6 by Jelmer Vernooij
Fix a couple of minor issues after review by Martin.
1772
    """The registered control formats - .bzr, ....
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1773
1733.1.7 by Jelmer Vernooij
Change set of control dir formats to list.
1774
    This is a list of BzrDirFormat objects.
1733.1.6 by Jelmer Vernooij
Fix a couple of minor issues after review by Martin.
1775
    """
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1776
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.
1777
    _control_server_formats = []
1778
    """The registered control server formats, e.g. RemoteBzrDirs.
1779
1780
    This is a list of BzrDirFormat objects.
1781
    """
1782
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1783
    _lock_file_name = 'branch-lock'
1784
1785
    # _lock_class must be set in subclasses to the lock type, typ.
1786
    # TransportLock or LockDir
1787
1534.4.39 by Robert Collins
Basic BzrDir support.
1788
    @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.
1789
    def find_format(klass, transport, _server_formats=True):
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1790
        """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.
1791
        if _server_formats:
1792
            formats = klass._control_server_formats + klass._control_formats
1793
        else:
1794
            formats = klass._control_formats
1795
        for format in formats:
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1796
            try:
1797
                return format.probe_transport(transport)
1798
            except errors.NotBranchError:
1799
                # this format does not find a control dir here.
1800
                pass
1801
        raise errors.NotBranchError(path=transport.base)
1802
1803
    @classmethod
1804
    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.
1805
        """Return the .bzrdir style format present in a directory."""
1534.4.39 by Robert Collins
Basic BzrDir support.
1806
        try:
2164.2.18 by Vincent Ladeuil
Take Aaron comments into account.
1807
            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.
1808
        except errors.NoSuchFile:
1809
            raise errors.NotBranchError(path=transport.base)
1810
1811
        try:
1534.4.39 by Robert Collins
Basic BzrDir support.
1812
            return klass._formats[format_string]
1813
        except KeyError:
3246.3.2 by Daniel Watkins
Modified uses of errors.UnknownFormatError.
1814
            raise errors.UnknownFormatError(format=format_string, kind='bzrdir')
1534.4.39 by Robert Collins
Basic BzrDir support.
1815
1816
    @classmethod
1817
    def get_default_format(klass):
1818
        """Return the current default format."""
1819
        return klass._default_format
1820
1821
    def get_format_string(self):
1822
        """Return the ASCII format string that identifies this format."""
1823
        raise NotImplementedError(self.get_format_string)
1824
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
1825
    def get_format_description(self):
1826
        """Return the short description for this format."""
1827
        raise NotImplementedError(self.get_format_description)
1828
1534.5.16 by Robert Collins
Review feedback.
1829
    def get_converter(self, format=None):
1830
        """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.
1831
1832
        This returns a bzrlib.bzrdir.Converter object.
1833
1834
        This should return the best upgrader to step this format towards the
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
1835
        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.
1836
        some means for them to extend the range of returnable converters.
1534.5.13 by Robert Collins
Correct buggy test.
1837
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1838
        :param format: Optional format to override the default format of the
1534.5.13 by Robert Collins
Correct buggy test.
1839
                       library.
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1840
        """
1534.5.16 by Robert Collins
Review feedback.
1841
        raise NotImplementedError(self.get_converter)
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1842
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
1843
    def initialize(self, url, possible_transports=None):
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1844
        """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
1845
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
1846
        While not deprecated, this method is very specific and its use will
1847
        lead to many round trips to setup a working environment. See
1848
        initialize_on_transport_ex for a [nearly] all-in-one method.
1849
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1850
        Subclasses should typically override initialize_on_transport
1851
        instead of this method.
1852
        """
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
1853
        return self.initialize_on_transport(get_transport(url,
1854
                                                          possible_transports))
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1855
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1856
    def initialize_on_transport(self, transport):
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1857
        """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)
1858
        try:
1859
            # can we hand off the request to the smart server rather than using
1860
            # vfs calls?
1861
            client_medium = transport.get_smart_medium()
1862
        except errors.NoSmartMedium:
1863
            return self._initialize_on_transport_vfs(transport)
1864
        else:
1865
            # Current RPC's only know how to create bzr metadir1 instances, so
1866
            # we still delegate to vfs methods if the requested format is not a
1867
            # metadir1
1868
            if type(self) != BzrDirMetaFormat1:
1869
                return self._initialize_on_transport_vfs(transport)
1870
            remote_format = RemoteBzrDirFormat()
1871
            self._supply_sub_formats_to(remote_format)
1872
            return remote_format.initialize_on_transport(transport)
1873
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1874
    def initialize_on_transport_ex(self, transport, use_existing_dir=False,
1875
        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.
1876
        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.
1877
        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.
1878
        """Create this format on transport.
1879
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
1880
        The directory to initialize will be created.
1881
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1882
        :param force_new_repo: Do not use a shared repository for the target,
1883
                               even if one is available.
1884
        :param create_prefix: Create any missing directories leading up to
1885
            to_transport.
1886
        :param use_existing_dir: Use an existing directory if one exists.
1887
        :param stacked_on: A url to stack any created branch on, None to follow
1888
            any target stacking policy.
1889
        :param stack_on_pwd: If stack_on is relative, the location it is
1890
            relative to.
1891
        :param repo_format_name: If non-None, a repository will be
1892
            made-or-found. Should none be found, or if force_new_repo is True
1893
            the repo_format_name is used to select the format of repository to
1894
            create.
1895
        :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.
1896
            for a new shared repository when one is made. None to use whatever
1897
            default the format has.
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1898
        :param shared_repo: Control whether made repositories are shared or
1899
            not.
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
1900
        :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.
1901
        :return: repo, bzrdir, require_stacking, repository_policy. repo is
1902
            None if none was created or found, bzrdir is always valid.
1903
            require_stacking is the result of examining the stacked_on
1904
            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.
1905
        """
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
1906
        if not vfs_only:
1907
            # Try to hand off to a smart server 
1908
            try:
1909
                client_medium = transport.get_smart_medium()
1910
            except errors.NoSmartMedium:
1911
                pass
1912
            else:
1913
                # TODO: lookup the local format from a server hint.
1914
                remote_dir_format = RemoteBzrDirFormat()
1915
                remote_dir_format._network_name = self.network_name()
1916
                self._supply_sub_formats_to(remote_dir_format)
1917
                return remote_dir_format.initialize_on_transport_ex(transport,
1918
                    use_existing_dir=use_existing_dir, create_prefix=create_prefix,
1919
                    force_new_repo=force_new_repo, stacked_on=stacked_on,
1920
                    stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
1921
                    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.
1922
        # XXX: Refactor the create_prefix/no_create_prefix code into a
1923
        #      common helper function
1924
        # The destination may not exist - if so make it according to policy.
1925
        def make_directory(transport):
1926
            transport.mkdir('.')
1927
            return transport
1928
        def redirected(transport, e, redirection_notice):
1929
            note(redirection_notice)
1930
            return transport._redirected_to(e.source, e.target)
1931
        try:
1932
            transport = do_catching_redirections(make_directory, transport,
1933
                redirected)
1934
        except errors.FileExists:
1935
            if not use_existing_dir:
1936
                raise
1937
        except errors.NoSuchFile:
1938
            if not create_prefix:
1939
                raise
1940
            transport.create_prefix()
1941
1942
        require_stacking = (stacked_on is not None)
1943
        # Now the target directory exists, but doesn't have a .bzr
1944
        # directory. So we need to create it, along with any work to create
1945
        # all of the dependent branches, etc.
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
1946
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1947
        result = self.initialize_on_transport(transport)
1948
        if repo_format_name:
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
1949
            try:
1950
                # use a custom format
1951
                result._format.repository_format = \
1952
                    repository.network_format_registry.get(repo_format_name)
1953
            except AttributeError:
1954
                # The format didn't permit it to be set.
1955
                pass
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1956
            # A repository is desired, either in-place or shared.
1957
            repository_policy = result.determine_repository_policy(
1958
                force_new_repo, stacked_on, stack_on_pwd,
1959
                require_stacking=require_stacking)
1960
            result_repo, is_new_repo = repository_policy.acquire_repository(
1961
                make_working_trees, shared_repo)
1962
            if not require_stacking and repository_policy._require_stacking:
1963
                require_stacking = True
1964
                result._format.require_stacking()
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
1965
            result_repo.lock_write()
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1966
        else:
1967
            result_repo = None
1968
            repository_policy = None
1969
        return result_repo, result, require_stacking, repository_policy
1970
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
1971
    def _initialize_on_transport_vfs(self, transport):
1972
        """Initialize a new bzrdir using VFS calls.
4032.1.2 by John Arbash Meinel
Track down a few more files that have trailing whitespace.
1973
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
1974
        :param transport: The transport to create the .bzr directory in.
1975
        :return: A
1976
        """
1977
        # Since we are creating a .bzr directory, inherit the
1534.4.39 by Robert Collins
Basic BzrDir support.
1978
        # mode from the root directory
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1979
        temp_control = lockable_files.LockableFiles(transport,
1980
                            '', lockable_files.TransportLock)
1534.4.39 by Robert Collins
Basic BzrDir support.
1981
        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.
1982
                                      # FIXME: RBC 20060121 don't peek under
1534.4.39 by Robert Collins
Basic BzrDir support.
1983
                                      # the covers
1984
                                      mode=temp_control._dir_mode)
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
1985
        if sys.platform == 'win32' and isinstance(transport, local.LocalTransport):
3023.1.2 by Alexander Belchenko
Martin's review.
1986
            win32utils.set_file_attr_hidden(transport._abspath('.bzr'))
1534.4.39 by Robert Collins
Basic BzrDir support.
1987
        file_mode = temp_control._file_mode
1988
        del temp_control
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
1989
        bzrdir_transport = transport.clone('.bzr')
1990
        utf8_files = [('README',
3250.2.1 by Marius Kruger
update .bzr/README to not refer to Bazaar-NG, and add link to website.
1991
                       "This is a Bazaar control directory.\n"
1992
                       "Do not change any files in this directory.\n"
1993
                       "See http://bazaar-vcs.org/ for more information about Bazaar.\n"),
1534.4.39 by Robert Collins
Basic BzrDir support.
1994
                      ('branch-format', self.get_format_string()),
1995
                      ]
1996
        # NB: no need to escape relative paths that are url safe.
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
1997
        control_files = lockable_files.LockableFiles(bzrdir_transport,
1998
            self._lock_file_name, self._lock_class)
1553.5.60 by Martin Pool
New LockableFiles.create_lock() method
1999
        control_files.create_lock()
1534.4.39 by Robert Collins
Basic BzrDir support.
2000
        control_files.lock_write()
2001
        try:
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2002
            for (filename, content) in utf8_files:
3407.2.12 by Martin Pool
Fix creation mode of control files
2003
                bzrdir_transport.put_bytes(filename, content,
2004
                    mode=file_mode)
1534.4.39 by Robert Collins
Basic BzrDir support.
2005
        finally:
2006
            control_files.unlock()
4017.2.2 by Robert Collins
Perform creation of BzrDirMetaFormat1 control directories using an RPC where possible. (Robert Collins)
2007
        return self.open(transport, _found=True)
1534.4.39 by Robert Collins
Basic BzrDir support.
2008
2009
    def is_supported(self):
2010
        """Is this format supported?
2011
2012
        Supported formats must be initializable and openable.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2013
        Unsupported formats may not support initialization or committing or
1534.4.39 by Robert Collins
Basic BzrDir support.
2014
        some other features depending on the reason for not being supported.
2015
        """
2016
        return True
2017
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2018
    def network_name(self):
2019
        """A simple byte string uniquely identifying this format for RPC calls.
2020
2021
        Bzr control formats use thir disk format string to identify the format
2022
        over the wire. Its possible that other control formats have more
2023
        complex detection requirements, so we permit them to use any unique and
2024
        immutable string they desire.
2025
        """
2026
        raise NotImplementedError(self.network_name)
2027
1910.2.14 by Aaron Bentley
Fail when trying to use interrepository on Knit2 and Knit1
2028
    def same_model(self, target_format):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2029
        return (self.repository_format.rich_root_data ==
1910.2.14 by Aaron Bentley
Fail when trying to use interrepository on Knit2 and Knit1
2030
            target_format.rich_root_data)
2031
1733.1.3 by Robert Collins
Extend the test suite to run bzrdir conformance tests on non .bzr based control dirs.
2032
    @classmethod
2033
    def known_formats(klass):
2034
        """Return all the known formats.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2035
1733.1.3 by Robert Collins
Extend the test suite to run bzrdir conformance tests on non .bzr based control dirs.
2036
        Concrete formats should override _known_formats.
2037
        """
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2038
        # There is double indirection here to make sure that control
2039
        # 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.
2040
        # 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.
2041
        result = set()
2042
        for format in klass._control_formats:
2043
            result.update(format._known_formats())
2044
        return result
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2045
1733.1.3 by Robert Collins
Extend the test suite to run bzrdir conformance tests on non .bzr based control dirs.
2046
    @classmethod
2047
    def _known_formats(klass):
2048
        """Return the known format instances for this control format."""
2049
        return set(klass._formats.values())
2050
1534.4.39 by Robert Collins
Basic BzrDir support.
2051
    def open(self, transport, _found=False):
2052
        """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
2053
1534.4.39 by Robert Collins
Basic BzrDir support.
2054
        _found is a private parameter, do not use it.
2055
        """
2056
        if not _found:
2090.2.2 by Martin Pool
Fix an assertion with side effects
2057
            found_format = BzrDirFormat.find_format(transport)
2058
            if not isinstance(found_format, self.__class__):
2059
                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
2060
                        "format %s"
2090.2.2 by Martin Pool
Fix an assertion with side effects
2061
                        % (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.
2062
            # Allow subclasses - use the found format.
2063
            self._supply_sub_formats_to(found_format)
2064
            return found_format._open(transport)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
2065
        return self._open(transport)
2066
2067
    def _open(self, transport):
2068
        """Template method helper for opening BzrDirectories.
2069
2070
        This performs the actual open and any additional logic or parameter
2071
        passing.
2072
        """
2073
        raise NotImplementedError(self._open)
1534.4.39 by Robert Collins
Basic BzrDir support.
2074
2075
    @classmethod
2076
    def register_format(klass, format):
2077
        klass._formats[format.get_format_string()] = format
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2078
        # 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.
2079
        network_format_registry.register(format.get_format_string(), format.__class__)
1534.4.39 by Robert Collins
Basic BzrDir support.
2080
2081
    @classmethod
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
2082
    def register_control_format(klass, format):
2164.2.13 by v.ladeuil+lp at free
Add tests for redirection. Preserve transport decorations.
2083
        """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.
2084
2085
        TODO: This should be pulled up into a 'ControlDirFormat' base class
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2086
        which BzrDirFormat can inherit from, and renamed to register_format
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
2087
        there. It has been done without that for now for simplicity of
2088
        implementation.
2089
        """
1733.1.7 by Jelmer Vernooij
Change set of control dir formats to list.
2090
        klass._control_formats.append(format)
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
2091
2092
    @classmethod
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
2093
    def register_control_server_format(klass, format):
2094
        """Register a control format for client-server environments.
2095
2096
        These formats will be tried before ones registered with
2097
        register_control_format.  This gives implementations that decide to the
2098
        chance to grab it before anything looks at the contents of the format
2099
        file.
2100
        """
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.
2101
        klass._control_server_formats.append(format)
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
2102
2103
    @classmethod
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
2104
    def _set_default_format(klass, format):
2105
        """Set default format (for testing behavior of defaults only)"""
2106
        klass._default_format = format
2107
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
2108
    def __str__(self):
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
2109
        # 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.
2110
        return self.get_format_description().rstrip()
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
2111
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.
2112
    def _supply_sub_formats_to(self, other_format):
2113
        """Give other_format the same values for sub formats as this has.
2114
2115
        This method is expected to be used when parameterising a
2116
        RemoteBzrDirFormat instance with the parameters from a
2117
        BzrDirMetaFormat1 instance.
2118
2119
        :param other_format: other_format is a format which should be
2120
            compatible with whatever sub formats are supported by self.
2121
        :return: None.
2122
        """
2123
1534.4.39 by Robert Collins
Basic BzrDir support.
2124
    @classmethod
2125
    def unregister_format(klass, format):
2126
        del klass._formats[format.get_format_string()]
2127
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
2128
    @classmethod
2129
    def unregister_control_format(klass, format):
2130
        klass._control_formats.remove(format)
2131
2132
1534.4.39 by Robert Collins
Basic BzrDir support.
2133
class BzrDirFormat4(BzrDirFormat):
2134
    """Bzr dir format 4.
2135
2136
    This format is a combined format for working tree, branch and repository.
2137
    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.
2138
     - Format 1 working trees [always]
2139
     - Format 4 branches [always]
2140
     - Format 4 repositories [always]
1534.4.39 by Robert Collins
Basic BzrDir support.
2141
2142
    This format is deprecated: it indexes texts using a text it which is
2143
    removed in format 5; write support for this format has been removed.
2144
    """
2145
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2146
    _lock_class = lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
2147
1534.4.39 by Robert Collins
Basic BzrDir support.
2148
    def get_format_string(self):
2149
        """See BzrDirFormat.get_format_string()."""
2150
        return "Bazaar-NG branch, format 0.0.4\n"
2151
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
2152
    def get_format_description(self):
2153
        """See BzrDirFormat.get_format_description()."""
2154
        return "All-in-one format 4"
2155
1534.5.16 by Robert Collins
Review feedback.
2156
    def get_converter(self, format=None):
2157
        """See BzrDirFormat.get_converter()."""
1534.5.13 by Robert Collins
Correct buggy test.
2158
        # 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.
2159
        return ConvertBzrDir4To5()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2160
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
2161
    def initialize_on_transport(self, transport):
1534.4.39 by Robert Collins
Basic BzrDir support.
2162
        """Format 4 branches cannot be created."""
2163
        raise errors.UninitializableFormat(self)
2164
2165
    def is_supported(self):
2166
        """Format 4 is not supported.
2167
2168
        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
2169
        conversion logic is expensive - so doing it on the fly was not
1534.4.39 by Robert Collins
Basic BzrDir support.
2170
        feasible.
2171
        """
2172
        return False
2173
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2174
    def network_name(self):
2175
        return self.get_format_string()
2176
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
2177
    def _open(self, transport):
2178
        """See BzrDirFormat._open."""
2179
        return BzrDir4(transport, self)
2180
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.
2181
    def __return_repository_format(self):
2182
        """Circular import protection."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2183
        from bzrlib.repofmt.weaverepo import RepositoryFormat4
1910.2.12 by Aaron Bentley
Implement knit repo format 2
2184
        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.
2185
    repository_format = property(__return_repository_format)
2186
1534.4.39 by Robert Collins
Basic BzrDir support.
2187
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
2188
class BzrDirFormatAllInOne(BzrDirFormat):
2189
    """Common class for formats before meta-dirs."""
2190
2191
    def initialize_on_transport_ex(self, transport, use_existing_dir=False,
2192
        create_prefix=False, force_new_repo=False, stacked_on=None,
2193
        stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
2194
        shared_repo=False):
2195
        """See BzrDirFormat.initialize_on_transport_ex."""
2196
        require_stacking = (stacked_on is not None)
4294.2.10 by Robert Collins
Review feedback.
2197
        # 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.
2198
        # a Meta1Dir
2199
        if require_stacking:
2200
            format = BzrDirMetaFormat1()
2201
            return format.initialize_on_transport_ex(transport,
2202
                use_existing_dir=use_existing_dir, create_prefix=create_prefix,
2203
                force_new_repo=force_new_repo, stacked_on=stacked_on,
2204
                stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
2205
                make_working_trees=make_working_trees, shared_repo=shared_repo)
2206
        return BzrDirFormat.initialize_on_transport_ex(self, transport,
2207
            use_existing_dir=use_existing_dir, create_prefix=create_prefix,
2208
            force_new_repo=force_new_repo, stacked_on=stacked_on,
2209
            stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
2210
            make_working_trees=make_working_trees, shared_repo=shared_repo)
2211
2212
2213
class BzrDirFormat5(BzrDirFormatAllInOne):
1534.4.39 by Robert Collins
Basic BzrDir support.
2214
    """Bzr control format 5.
2215
2216
    This format is a combined format for working tree, branch and repository.
2217
    It has:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2218
     - Format 2 working trees [always]
2219
     - Format 4 branches [always]
1534.4.53 by Robert Collins
Review feedback from John Meinel.
2220
     - 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.
2221
       Unhashed stores in the repository.
1534.4.39 by Robert Collins
Basic BzrDir support.
2222
    """
2223
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2224
    _lock_class = lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
2225
1534.4.39 by Robert Collins
Basic BzrDir support.
2226
    def get_format_string(self):
2227
        """See BzrDirFormat.get_format_string()."""
2228
        return "Bazaar-NG branch, format 5\n"
2229
3650.2.2 by Aaron Bentley
Implement get_branch_format, to unify branch creation code
2230
    def get_branch_format(self):
2231
        from bzrlib import branch
2232
        return branch.BzrBranchFormat4()
2233
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
2234
    def get_format_description(self):
2235
        """See BzrDirFormat.get_format_description()."""
2236
        return "All-in-one format 5"
2237
1534.5.16 by Robert Collins
Review feedback.
2238
    def get_converter(self, format=None):
2239
        """See BzrDirFormat.get_converter()."""
1534.5.13 by Robert Collins
Correct buggy test.
2240
        # 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.
2241
        return ConvertBzrDir5To6()
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
2242
2243
    def _initialize_for_clone(self, url):
2244
        return self.initialize_on_transport(get_transport(url), _cloning=True)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2245
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
2246
    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.
2247
        """Format 5 dirs always have working tree, branch and repository.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2248
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.
2249
        Except when they are being cloned.
2250
        """
2251
        from bzrlib.branch import BzrBranchFormat4
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2252
        from bzrlib.repofmt.weaverepo import RepositoryFormat5
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
2253
        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.
2254
        RepositoryFormat5().initialize(result, _internal=True)
2255
        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.
2256
            branch = BzrBranchFormat4().initialize(result)
3650.5.6 by Aaron Bentley
Fix cloning problems by creating missing working tree files
2257
            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.
2258
        return result
2259
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2260
    def network_name(self):
2261
        return self.get_format_string()
2262
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
2263
    def _open(self, transport):
2264
        """See BzrDirFormat._open."""
2265
        return BzrDir5(transport, self)
2266
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.
2267
    def __return_repository_format(self):
2268
        """Circular import protection."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2269
        from bzrlib.repofmt.weaverepo import RepositoryFormat5
1910.2.12 by Aaron Bentley
Implement knit repo format 2
2270
        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.
2271
    repository_format = property(__return_repository_format)
2272
1534.4.39 by Robert Collins
Basic BzrDir support.
2273
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
2274
class BzrDirFormat6(BzrDirFormatAllInOne):
1534.4.39 by Robert Collins
Basic BzrDir support.
2275
    """Bzr control format 6.
2276
2277
    This format is a combined format for working tree, branch and repository.
2278
    It has:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2279
     - Format 2 working trees [always]
2280
     - 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.
2281
     - Format 6 repositories [always]
1534.4.39 by Robert Collins
Basic BzrDir support.
2282
    """
2283
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2284
    _lock_class = lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
2285
1534.4.39 by Robert Collins
Basic BzrDir support.
2286
    def get_format_string(self):
2287
        """See BzrDirFormat.get_format_string()."""
2288
        return "Bazaar-NG branch, format 6\n"
2289
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
2290
    def get_format_description(self):
2291
        """See BzrDirFormat.get_format_description()."""
2292
        return "All-in-one format 6"
2293
3650.2.2 by Aaron Bentley
Implement get_branch_format, to unify branch creation code
2294
    def get_branch_format(self):
2295
        from bzrlib import branch
2296
        return branch.BzrBranchFormat4()
2297
1534.5.16 by Robert Collins
Review feedback.
2298
    def get_converter(self, format=None):
2299
        """See BzrDirFormat.get_converter()."""
1534.5.13 by Robert Collins
Correct buggy test.
2300
        # 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.
2301
        return ConvertBzrDir6ToMeta()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2302
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
2303
    def _initialize_for_clone(self, url):
2304
        return self.initialize_on_transport(get_transport(url), _cloning=True)
2305
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
2306
    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.
2307
        """Format 6 dirs always have working tree, branch and repository.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2308
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.
2309
        Except when they are being cloned.
2310
        """
2311
        from bzrlib.branch import BzrBranchFormat4
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2312
        from bzrlib.repofmt.weaverepo import RepositoryFormat6
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
2313
        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.
2314
        RepositoryFormat6().initialize(result, _internal=True)
2315
        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.
2316
            branch = BzrBranchFormat4().initialize(result)
3650.5.7 by Aaron Bentley
Fix working tree initialization
2317
            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.
2318
        return result
2319
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2320
    def network_name(self):
2321
        return self.get_format_string()
2322
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
2323
    def _open(self, transport):
2324
        """See BzrDirFormat._open."""
2325
        return BzrDir6(transport, self)
2326
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.
2327
    def __return_repository_format(self):
2328
        """Circular import protection."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2329
        from bzrlib.repofmt.weaverepo import RepositoryFormat6
1910.2.12 by Aaron Bentley
Implement knit repo format 2
2330
        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.
2331
    repository_format = property(__return_repository_format)
2332
1534.4.39 by Robert Collins
Basic BzrDir support.
2333
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
2334
class BzrDirMetaFormat1(BzrDirFormat):
2335
    """Bzr meta control format 1
2336
2337
    This is the first format with split out working tree, branch and repository
2338
    disk storage.
2339
    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.
2340
     - Format 3 working trees [optional]
2341
     - Format 5 branches [optional]
2342
     - 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.
2343
    """
2344
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2345
    _lock_class = lockdir.LockDir
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
2346
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
2347
    def __init__(self):
2348
        self._workingtree_format = None
2230.3.1 by Aaron Bentley
Get branch6 creation working
2349
        self._branch_format = None
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
2350
        self._repository_format = None
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
2351
2100.3.15 by Aaron Bentley
get test suite passing
2352
    def __eq__(self, other):
2353
        if other.__class__ is not self.__class__:
2354
            return False
2355
        if other.repository_format != self.repository_format:
2356
            return False
2357
        if other.workingtree_format != self.workingtree_format:
2358
            return False
2359
        return True
2360
2100.3.35 by Aaron Bentley
equality operations on bzrdir
2361
    def __ne__(self, other):
2362
        return not self == other
2363
2230.3.55 by Aaron Bentley
Updates from review
2364
    def get_branch_format(self):
2230.3.1 by Aaron Bentley
Get branch6 creation working
2365
        if self._branch_format is None:
2366
            from bzrlib.branch import BranchFormat
2367
            self._branch_format = BranchFormat.get_default_format()
2368
        return self._branch_format
2369
2230.3.55 by Aaron Bentley
Updates from review
2370
    def set_branch_format(self, format):
2230.3.1 by Aaron Bentley
Get branch6 creation working
2371
        self._branch_format = format
2372
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.
2373
    def require_stacking(self, stack_on=None, possible_transports=None,
2374
            _skip_repo=False):
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
2375
        """We have a request to stack, try to ensure the formats support it.
2376
2377
        :param stack_on: If supplied, it is the URL to a branch that we want to
2378
            stack on. Check to see if that format supports stacking before
2379
            forcing an upgrade.
2380
        """
2381
        # Stacking is desired. requested by the target, but does the place it
2382
        # points at support stacking? If it doesn't then we should
2383
        # not implicitly upgrade. We check this here.
2384
        new_repo_format = None
2385
        new_branch_format = None
2386
2387
        # a bit of state for get_target_branch so that we don't try to open it
2388
        # 2 times, for both repo *and* branch
2389
        target = [None, False, None] # target_branch, checked, upgrade anyway
2390
        def get_target_branch():
2391
            if target[1]:
2392
                # We've checked, don't check again
2393
                return target
2394
            if stack_on is None:
2395
                # No target format, that means we want to force upgrading
2396
                target[:] = [None, True, True]
2397
                return target
2398
            try:
2399
                target_dir = BzrDir.open(stack_on,
2400
                    possible_transports=possible_transports)
2401
            except errors.NotBranchError:
2402
                # Nothing there, don't change formats
2403
                target[:] = [None, True, False]
2404
                return target
2405
            except errors.JailBreak:
2406
                # JailBreak, JFDI and upgrade anyway
2407
                target[:] = [None, True, True]
2408
                return target
2409
            try:
2410
                target_branch = target_dir.open_branch()
2411
            except errors.NotBranchError:
2412
                # No branch, don't upgrade formats
2413
                target[:] = [None, True, False]
2414
                return target
2415
            target[:] = [target_branch, True, False]
2416
            return target
2417
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.
2418
        if (not _skip_repo and
2419
                 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.
2420
            # We need to upgrade the Repository.
2421
            target_branch, _, do_upgrade = get_target_branch()
2422
            if target_branch is None:
2423
                # We don't have a target branch, should we upgrade anyway?
2424
                if do_upgrade:
2425
                    # stack_on is inaccessible, JFDI.
2426
                    # TODO: bad monkey, hard-coded formats...
2427
                    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.
2428
                        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.
2429
                    else:
4401.1.3 by John Arbash Meinel
Change back to defaulting to --1.6 format, and update the blackbox tests.
2430
                        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.
2431
            else:
2432
                # If the target already supports stacking, then we know the
2433
                # project is already able to use stacking, so auto-upgrade
2434
                # for them
2435
                new_repo_format = target_branch.repository._format
2436
                if not new_repo_format.supports_external_lookups:
2437
                    # target doesn't, source doesn't, so don't auto upgrade
2438
                    # repo
2439
                    new_repo_format = None
2440
            if new_repo_format is not None:
2441
                self.repository_format = new_repo_format
2442
                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.
2443
                     ' 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.
2444
                     new_repo_format.get_format_description())
2445
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
2446
        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.
2447
            # We just checked the repo, now lets check if we need to
2448
            # upgrade the branch format
2449
            target_branch, _, do_upgrade = get_target_branch()
2450
            if target_branch is None:
2451
                if do_upgrade:
2452
                    # TODO: bad monkey, hard-coded formats...
2453
                    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.
2454
            else:
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
2455
                new_branch_format = target_branch._format
2456
                if not new_branch_format.supports_stacking():
2457
                    new_branch_format = None
2458
            if new_branch_format is not None:
2459
                # Does support stacking, use its format.
2460
                self.set_branch_format(new_branch_format)
2461
                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.
2462
                     ' 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.
2463
                     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.
2464
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.
2465
    def get_converter(self, format=None):
2466
        """See BzrDirFormat.get_converter()."""
2467
        if format is None:
2468
            format = BzrDirFormat.get_default_format()
2469
        if not isinstance(self, format.__class__):
2470
            # converting away from metadir is not implemented
2471
            raise NotImplementedError(self.get_converter)
2472
        return ConvertMetaToMeta(format)
2473
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
2474
    def get_format_string(self):
2475
        """See BzrDirFormat.get_format_string()."""
2476
        return "Bazaar-NG meta directory, format 1\n"
2477
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
2478
    def get_format_description(self):
2479
        """See BzrDirFormat.get_format_description()."""
2480
        return "Meta directory format 1"
2481
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2482
    def network_name(self):
2483
        return self.get_format_string()
2484
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
2485
    def _open(self, transport):
2486
        """See BzrDirFormat._open."""
4294.2.12 by Robert Collins
Prevent aliasing issues with BzrDirMetaFormat1 by making a new format object in _open.
2487
        # Create a new format instance because otherwise initialisation of new
2488
        # metadirs share the global default format object leading to alias
2489
        # problems.
2490
        format = BzrDirMetaFormat1()
2491
        self._supply_sub_formats_to(format)
2492
        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.
2493
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.
2494
    def __return_repository_format(self):
2495
        """Circular import protection."""
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
2496
        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.
2497
            return self._repository_format
2498
        from bzrlib.repository import RepositoryFormat
2499
        return RepositoryFormat.get_default_format()
2500
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.
2501
    def _set_repository_format(self, value):
3015.2.8 by Robert Collins
Typo in __set_repository_format's docstring.
2502
        """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.
2503
        self._repository_format = value
1553.5.72 by Martin Pool
Clean up test for Branch5 lockdirs
2504
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.
2505
    repository_format = property(__return_repository_format,
2506
        _set_repository_format)
2507
2508
    def _supply_sub_formats_to(self, other_format):
2509
        """Give other_format the same values for sub formats as this has.
2510
2511
        This method is expected to be used when parameterising a
2512
        RemoteBzrDirFormat instance with the parameters from a
2513
        BzrDirMetaFormat1 instance.
2514
2515
        :param other_format: other_format is a format which should be
2516
            compatible with whatever sub formats are supported by self.
2517
        :return: None.
2518
        """
2519
        if getattr(self, '_repository_format', None) is not None:
2520
            other_format.repository_format = self.repository_format
2521
        if self._branch_format is not None:
2522
            other_format._branch_format = self._branch_format
2523
        if self._workingtree_format is not None:
2524
            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.
2525
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
2526
    def __get_workingtree_format(self):
2527
        if self._workingtree_format is None:
2528
            from bzrlib.workingtree import WorkingTreeFormat
2529
            self._workingtree_format = WorkingTreeFormat.get_default_format()
2530
        return self._workingtree_format
2531
2532
    def __set_workingtree_format(self, wt_format):
2533
        self._workingtree_format = wt_format
2534
2535
    workingtree_format = property(__get_workingtree_format,
2536
                                  __set_workingtree_format)
2537
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
2538
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
2539
network_format_registry = registry.FormatRegistry()
2540
"""Registry of formats indexed by their network name.
2541
2542
The network name for a BzrDirFormat is an identifier that can be used when
2543
referring to formats with smart server operations. See
2544
BzrDirFormat.network_name() for more detail.
2545
"""
2546
2547
2164.2.19 by Vincent Ladeuil
Revert BzrDirFormat1 registering.
2548
# Register bzr control format
2549
BzrDirFormat.register_control_format(BzrDirFormat)
2164.2.13 by v.ladeuil+lp at free
Add tests for redirection. Preserve transport decorations.
2550
2551
# Register bzr formats
1534.4.39 by Robert Collins
Basic BzrDir support.
2552
BzrDirFormat.register_format(BzrDirFormat4())
2553
BzrDirFormat.register_format(BzrDirFormat5())
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
2554
BzrDirFormat.register_format(BzrDirFormat6())
2555
__default_format = BzrDirMetaFormat1()
1534.4.39 by Robert Collins
Basic BzrDir support.
2556
BzrDirFormat.register_format(__default_format)
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
2557
BzrDirFormat._default_format = __default_format
1534.4.39 by Robert Collins
Basic BzrDir support.
2558
2559
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2560
class Converter(object):
2561
    """Converts a disk format object from one format to another."""
2562
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2563
    def convert(self, to_convert, pb):
2564
        """Perform the conversion of to_convert, giving feedback via pb.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2565
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2566
        :param to_convert: The disk object to convert.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2567
        :param pb: a progress bar to use for progress information.
2568
        """
2569
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.
2570
    def step(self, message):
2571
        """Update the pb by a step."""
2572
        self.count +=1
2573
        self.pb.update(message, self.count, self.total)
2574
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2575
2576
class ConvertBzrDir4To5(Converter):
2577
    """Converts format 4 bzr dirs to format 5."""
2578
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2579
    def __init__(self):
2580
        super(ConvertBzrDir4To5, self).__init__()
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2581
        self.converted_revs = set()
2582
        self.absent_revisions = set()
2583
        self.text_count = 0
2584
        self.revisions = {}
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2585
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2586
    def convert(self, to_convert, pb):
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2587
        """See Converter.convert()."""
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2588
        self.bzrdir = to_convert
2589
        self.pb = pb
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2590
        self.pb.note('starting upgrade from format 4 to 5')
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
2591
        if isinstance(self.bzrdir.transport, local.LocalTransport):
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2592
            self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
2593
        self._convert_to_weaves()
2594
        return BzrDir.open(self.bzrdir.root_transport.base)
2595
2596
    def _convert_to_weaves(self):
2597
        self.pb.note('note: upgrade may be faster if all store files are ungzipped first')
2598
        try:
2599
            # TODO permissions
2600
            stat = self.bzrdir.transport.stat('weaves')
2601
            if not S_ISDIR(stat.st_mode):
2602
                self.bzrdir.transport.delete('weaves')
2603
                self.bzrdir.transport.mkdir('weaves')
2604
        except errors.NoSuchFile:
2605
            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.
2606
        # 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.
2607
        self.inv_weave = Weave('inventory')
2608
        # holds in-memory weaves for all files
2609
        self.text_weaves = {}
2610
        self.bzrdir.transport.delete('branch-format')
2611
        self.branch = self.bzrdir.open_branch()
2612
        self._convert_working_inv()
2613
        rev_history = self.branch.revision_history()
2614
        # to_read is a stack holding the revisions we still need to process;
2615
        # appending to it adds new highest-priority revisions
2616
        self.known_revisions = set(rev_history)
2617
        self.to_read = rev_history[-1:]
2618
        while self.to_read:
2619
            rev_id = self.to_read.pop()
2620
            if (rev_id not in self.revisions
2621
                and rev_id not in self.absent_revisions):
2622
                self._load_one_rev(rev_id)
2623
        self.pb.clear()
2624
        to_import = self._make_order()
2625
        for i, rev_id in enumerate(to_import):
2626
            self.pb.update('converting revision', i, len(to_import))
2627
            self._convert_one_rev(rev_id)
2628
        self.pb.clear()
2629
        self._write_all_weaves()
2630
        self._write_all_revs()
2631
        self.pb.note('upgraded to weaves:')
2632
        self.pb.note('  %6d revisions and inventories', len(self.revisions))
2633
        self.pb.note('  %6d revisions not present', len(self.absent_revisions))
2634
        self.pb.note('  %6d texts', self.text_count)
2635
        self._cleanup_spare_files_after_format4()
3407.2.13 by Martin Pool
Remove indirection through control_files to get transports
2636
        self.branch._transport.put_bytes(
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2637
            'branch-format',
2638
            BzrDirFormat5().get_format_string(),
3446.1.1 by Martin Pool
merge further LockableFile deprecations
2639
            mode=self.bzrdir._get_file_mode())
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2640
2641
    def _cleanup_spare_files_after_format4(self):
2642
        # FIXME working tree upgrade foo.
2643
        for n in 'merged-patches', 'pending-merged-patches':
2644
            try:
2645
                ## assert os.path.getsize(p) == 0
2646
                self.bzrdir.transport.delete(n)
2647
            except errors.NoSuchFile:
2648
                pass
2649
        self.bzrdir.transport.delete_tree('inventory-store')
2650
        self.bzrdir.transport.delete_tree('text-store')
2651
2652
    def _convert_working_inv(self):
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
2653
        inv = xml4.serializer_v4.read_inventory(
3407.2.1 by Martin Pool
Deprecate LockableFiles.get
2654
                self.branch._transport.get('inventory'))
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2655
        new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv, working=True)
3407.2.1 by Martin Pool
Deprecate LockableFiles.get
2656
        self.branch._transport.put_bytes('inventory', new_inv_xml,
3446.1.1 by Martin Pool
merge further LockableFile deprecations
2657
            mode=self.bzrdir._get_file_mode())
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2658
2659
    def _write_all_weaves(self):
2660
        controlweaves = WeaveStore(self.bzrdir.transport, prefixed=False)
2661
        weave_transport = self.bzrdir.transport.clone('weaves')
2662
        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
2663
        transaction = WriteTransaction()
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2664
2665
        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.
2666
            i = 0
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2667
            for file_id, file_weave in self.text_weaves.items():
2668
                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.
2669
                weaves._put_weave(file_id, file_weave, transaction)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2670
                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.
2671
            self.pb.update('inventory', 0, 1)
2672
            controlweaves._put_weave('inventory', self.inv_weave, transaction)
2673
            self.pb.update('inventory', 1, 1)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2674
        finally:
2675
            self.pb.clear()
2676
2677
    def _write_all_revs(self):
2678
        """Write all revisions out in new form."""
2679
        self.bzrdir.transport.delete_tree('revision-store')
2680
        self.bzrdir.transport.mkdir('revision-store')
2681
        revision_transport = self.bzrdir.transport.clone('revision-store')
2682
        # 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.
2683
        from bzrlib.xml5 import serializer_v5
3350.6.10 by Martin Pool
VersionedFiles review cleanups
2684
        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.
2685
        revision_store = RevisionTextStore(revision_transport,
2686
            serializer_v5, False, versionedfile.PrefixMapper(),
2687
            lambda:True, lambda:True)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2688
        try:
2689
            for i, rev_id in enumerate(self.converted_revs):
2690
                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.
2691
                text = serializer_v5.write_revision_to_string(
2692
                    self.revisions[rev_id])
2693
                key = (rev_id,)
2694
                revision_store.add_lines(key, None, osutils.split_lines(text))
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2695
        finally:
2696
            self.pb.clear()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2697
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2698
    def _load_one_rev(self, rev_id):
2699
        """Load a revision object into memory.
2700
2701
        Any parents not either loaded or abandoned get queued to be
2702
        loaded."""
2703
        self.pb.update('loading revision',
2704
                       len(self.revisions),
2705
                       len(self.known_revisions))
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
2706
        if not self.branch.repository.has_revision(rev_id):
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2707
            self.pb.clear()
2708
            self.pb.note('revision {%s} not present in branch; '
2709
                         'will be converted as a ghost',
2710
                         rev_id)
2711
            self.absent_revisions.add(rev_id)
2712
        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.
2713
            rev = self.branch.repository.get_revision(rev_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2714
            for parent_id in rev.parent_ids:
2715
                self.known_revisions.add(parent_id)
2716
                self.to_read.append(parent_id)
2717
            self.revisions[rev_id] = rev
2718
2719
    def _load_old_inventory(self, rev_id):
2720
        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.
2721
        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
2722
        inv.revision_id = rev_id
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2723
        rev = self.revisions[rev_id]
2724
        return inv
2725
2726
    def _load_updated_inventory(self, rev_id):
2727
        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.
2728
        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.
2729
        return inv
2730
2731
    def _convert_one_rev(self, rev_id):
2732
        """Convert revision and all referenced objects to new format."""
2733
        rev = self.revisions[rev_id]
2734
        inv = self._load_old_inventory(rev_id)
2735
        present_parents = [p for p in rev.parent_ids
2736
                           if p not in self.absent_revisions]
2737
        self._convert_revision_contents(rev, inv, present_parents)
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2738
        self._store_new_inv(rev, inv, present_parents)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2739
        self.converted_revs.add(rev_id)
2740
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2741
    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.
2742
        new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2743
        new_inv_sha1 = sha_string(new_inv_xml)
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2744
        self.inv_weave.add_lines(rev.revision_id,
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
2745
                                 present_parents,
2746
                                 new_inv_xml.splitlines(True))
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2747
        rev.inventory_sha1 = new_inv_sha1
2748
2749
    def _convert_revision_contents(self, rev, inv, present_parents):
2750
        """Convert all the files within a revision.
2751
2752
        Also upgrade the inventory to refer to the text revision ids."""
2753
        rev_id = rev.revision_id
2754
        mutter('converting texts of revision {%s}',
2755
               rev_id)
2756
        parent_invs = map(self._load_updated_inventory, present_parents)
1731.1.62 by Aaron Bentley
Changes from review comments
2757
        entries = inv.iter_entries()
2758
        entries.next()
2759
        for path, ie in entries:
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2760
            self._convert_file_version(rev, ie, parent_invs)
2761
2762
    def _convert_file_version(self, rev, ie, parent_invs):
2763
        """Convert one version of one file.
2764
2765
        The file needs to be added into the weave if it is a merge
2766
        of >=2 parents or if it's changed from its parent.
2767
        """
2768
        file_id = ie.file_id
2769
        rev_id = rev.revision_id
2770
        w = self.text_weaves.get(file_id)
2771
        if w is None:
2772
            w = Weave(file_id)
2773
            self.text_weaves[file_id] = w
2774
        text_changed = False
2776.1.5 by Robert Collins
Add reasonably comprehensive tests for path last modified and per file graph behaviour.
2775
        parent_candiate_entries = ie.parent_candidates(parent_invs)
2776
        heads = graph.Graph(self).heads(parent_candiate_entries.keys())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2777
        # 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.
2778
        # the previous code was also unordered.
2779
        previous_entries = dict((head, parent_candiate_entries[head]) for head
2780
            in heads)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2781
        self.snapshot_ie(previous_entries, ie, w, rev_id)
2782
        del ie.text_id
2783
3099.3.7 by John Arbash Meinel
Another parent provider I didn't realize existed.
2784
    def get_parent_map(self, revision_ids):
4379.3.3 by Gary van der Merwe
Rename and add doc string for StackedParentsProvider.
2785
        """See graph.StackedParentsProvider.get_parent_map"""
3099.3.7 by John Arbash Meinel
Another parent provider I didn't realize existed.
2786
        return dict((revision_id, self.revisions[revision_id])
2787
                    for revision_id in revision_ids
2788
                     if revision_id in self.revisions)
2789
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2790
    def snapshot_ie(self, previous_revisions, ie, w, rev_id):
2791
        # TODO: convert this logic, which is ~= snapshot to
2792
        # a call to:. This needs the path figured out. rather than a work_tree
2793
        # a v4 revision_tree can be given, or something that looks enough like
2794
        # 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
2795
        # 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.
2796
        # save against.
2797
        #ie.snapshot(rev, PATH, previous_revisions, REVISION_TREE, InMemoryWeaveStore(self.text_weaves))
2798
        if len(previous_revisions) == 1:
2799
            previous_ie = previous_revisions.values()[0]
2800
            if ie._unchanged(previous_ie):
2801
                ie.revision = previous_ie.revision
2802
                return
2803
        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.
2804
            text = self.branch.repository._text_store.get(ie.text_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2805
            file_lines = text.readlines()
1563.2.18 by Robert Collins
get knit repositories really using knits for text storage.
2806
            w.add_lines(rev_id, previous_revisions, file_lines)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2807
            self.text_count += 1
2808
        else:
1563.2.18 by Robert Collins
get knit repositories really using knits for text storage.
2809
            w.add_lines(rev_id, previous_revisions, [])
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2810
        ie.revision = rev_id
2811
2812
    def _make_order(self):
2813
        """Return a suitable order for importing revisions.
2814
2815
        The order must be such that an revision is imported after all
2816
        its (present) parents.
2817
        """
2818
        todo = set(self.revisions.keys())
2819
        done = self.absent_revisions.copy()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2820
        order = []
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2821
        while todo:
2822
            # scan through looking for a revision whose parents
2823
            # are all done
2824
            for rev_id in sorted(list(todo)):
2825
                rev = self.revisions[rev_id]
2826
                parent_ids = set(rev.parent_ids)
2827
                if parent_ids.issubset(done):
2828
                    # can take this one now
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2829
                    order.append(rev_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2830
                    todo.remove(rev_id)
2831
                    done.add(rev_id)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2832
        return order
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2833
2834
2835
class ConvertBzrDir5To6(Converter):
2836
    """Converts format 5 bzr dirs to format 6."""
2837
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2838
    def convert(self, to_convert, pb):
2839
        """See Converter.convert()."""
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2840
        self.bzrdir = to_convert
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2841
        self.pb = pb
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2842
        self.pb.note('starting upgrade from format 5 to 6')
2843
        self._convert_to_prefixed()
2844
        return BzrDir.open(self.bzrdir.root_transport.base)
2845
2846
    def _convert_to_prefixed(self):
1608.2.1 by Martin Pool
[merge] Storage filename escaping
2847
        from bzrlib.store import TransportStore
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2848
        self.bzrdir.transport.delete('branch-format')
2849
        for store_name in ["weaves", "revision-store"]:
1608.2.1 by Martin Pool
[merge] Storage filename escaping
2850
            self.pb.note("adding prefixes to %s" % store_name)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2851
            store_transport = self.bzrdir.transport.clone(store_name)
1608.2.1 by Martin Pool
[merge] Storage filename escaping
2852
            store = TransportStore(store_transport, prefixed=True)
1608.1.1 by Martin Pool
[patch] LocalTransport.list_dir should return url-quoted strings (ddaa)
2853
            for urlfilename in store_transport.list_dir('.'):
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
2854
                filename = urlutils.unescape(urlfilename)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2855
                if (filename.endswith(".weave") or
2856
                    filename.endswith(".gz") or
2857
                    filename.endswith(".sig")):
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
2858
                    file_id, suffix = os.path.splitext(filename)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2859
                else:
2860
                    file_id = filename
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
2861
                    suffix = ''
2862
                new_name = store._mapper.map((file_id,)) + suffix
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2863
                # FIXME keep track of the dirs made RBC 20060121
2864
                try:
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
2865
                    store_transport.move(filename, new_name)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2866
                except errors.NoSuchFile: # catches missing dirs strangely enough
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
2867
                    store_transport.mkdir(osutils.dirname(new_name))
2868
                    store_transport.move(filename, new_name)
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2869
        self.bzrdir.transport.put_bytes(
2870
            'branch-format',
2871
            BzrDirFormat6().get_format_string(),
3407.2.18 by Martin Pool
BzrDir takes responsibility for default file/dir modes
2872
            mode=self.bzrdir._get_file_mode())
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2873
2874
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2875
class ConvertBzrDir6ToMeta(Converter):
2876
    """Converts format 6 bzr dirs to metadirs."""
2877
2878
    def convert(self, to_convert, pb):
2879
        """See Converter.convert()."""
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
2880
        from bzrlib.repofmt.weaverepo import RepositoryFormat7
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
2881
        from bzrlib.branch import BzrBranchFormat5
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2882
        self.bzrdir = to_convert
2883
        self.pb = pb
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2884
        self.count = 0
2885
        self.total = 20 # the steps we know about
2886
        self.garbage_inventories = []
3407.2.18 by Martin Pool
BzrDir takes responsibility for default file/dir modes
2887
        self.dir_mode = self.bzrdir._get_dir_mode()
2888
        self.file_mode = self.bzrdir._get_file_mode()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2889
1534.5.13 by Robert Collins
Correct buggy test.
2890
        self.pb.note('starting upgrade from format 6 to metadir')
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2891
        self.bzrdir.transport.put_bytes(
2892
                'branch-format',
2893
                "Converting to format 6",
2894
                mode=self.file_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2895
        # its faster to move specific files around than to open and use the apis...
2896
        # first off, nuke ancestry.weave, it was never used.
2897
        try:
2898
            self.step('Removing ancestry.weave')
2899
            self.bzrdir.transport.delete('ancestry.weave')
2900
        except errors.NoSuchFile:
2901
            pass
2902
        # find out whats there
2903
        self.step('Finding branch files')
1666.1.3 by Robert Collins
Fix and test upgrades from bzrdir 6 over SFTP.
2904
        last_revision = self.bzrdir.open_branch().last_revision()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2905
        bzrcontents = self.bzrdir.transport.list_dir('.')
2906
        for name in bzrcontents:
2907
            if name.startswith('basis-inventory.'):
2908
                self.garbage_inventories.append(name)
2909
        # create new directories for repository, working tree and branch
2910
        repository_names = [('inventory.weave', True),
2911
                            ('revision-store', True),
2912
                            ('weaves', True)]
2913
        self.step('Upgrading repository  ')
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
2914
        self.bzrdir.transport.mkdir('repository', mode=self.dir_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2915
        self.make_lock('repository')
2916
        # we hard code the formats here because we are converting into
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2917
        # the meta format. The meta format upgrader can take this to a
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2918
        # future format within each component.
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
2919
        self.put_format('repository', RepositoryFormat7())
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2920
        for entry in repository_names:
2921
            self.move_entry('repository', entry)
2922
2923
        self.step('Upgrading branch      ')
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
2924
        self.bzrdir.transport.mkdir('branch', mode=self.dir_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2925
        self.make_lock('branch')
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
2926
        self.put_format('branch', BzrBranchFormat5())
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2927
        branch_files = [('revision-history', True),
2928
                        ('branch-name', True),
2929
                        ('parent', False)]
2930
        for entry in branch_files:
2931
            self.move_entry('branch', entry)
2932
2933
        checkout_files = [('pending-merges', True),
2934
                          ('inventory', True),
2935
                          ('stat-cache', False)]
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
2936
        # If a mandatory checkout file is not present, the branch does not have
2937
        # a functional checkout. Do not create a checkout in the converted
2938
        # branch.
2939
        for name, mandatory in checkout_files:
2940
            if mandatory and name not in bzrcontents:
2941
                has_checkout = False
2942
                break
2943
        else:
2944
            has_checkout = True
2945
        if not has_checkout:
2946
            self.pb.note('No working tree.')
2947
            # If some checkout files are there, we may as well get rid of them.
2948
            for name, mandatory in checkout_files:
2949
                if name in bzrcontents:
2950
                    self.bzrdir.transport.delete(name)
2951
        else:
2123.2.1 by John Arbash Meinel
Fix bug #70716, make bzrlib.bzrdir directly import bzrlib.workingtree
2952
            from bzrlib.workingtree import WorkingTreeFormat3
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
2953
            self.step('Upgrading working tree')
2954
            self.bzrdir.transport.mkdir('checkout', mode=self.dir_mode)
2955
            self.make_lock('checkout')
2956
            self.put_format(
2123.2.1 by John Arbash Meinel
Fix bug #70716, make bzrlib.bzrdir directly import bzrlib.workingtree
2957
                'checkout', WorkingTreeFormat3())
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
2958
            self.bzrdir.transport.delete_multi(
2959
                self.garbage_inventories, self.pb)
2960
            for entry in checkout_files:
2961
                self.move_entry('checkout', entry)
2962
            if last_revision is not None:
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2963
                self.bzrdir.transport.put_bytes(
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
2964
                    'checkout/last-revision', last_revision)
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2965
        self.bzrdir.transport.put_bytes(
2966
            'branch-format',
2967
            BzrDirMetaFormat1().get_format_string(),
2968
            mode=self.file_mode)
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2969
        return BzrDir.open(self.bzrdir.root_transport.base)
2970
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2971
    def make_lock(self, name):
2972
        """Make a lock for the new control dir name."""
2973
        self.step('Make %s lock' % name)
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2974
        ld = lockdir.LockDir(self.bzrdir.transport,
2975
                             '%s/lock' % name,
2976
                             file_modebits=self.file_mode,
2977
                             dir_modebits=self.dir_mode)
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
2978
        ld.create()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2979
2980
    def move_entry(self, new_dir, entry):
2981
        """Move then entry name into new_dir."""
2982
        name = entry[0]
2983
        mandatory = entry[1]
2984
        self.step('Moving %s' % name)
2985
        try:
2986
            self.bzrdir.transport.move(name, '%s/%s' % (new_dir, name))
2987
        except errors.NoSuchFile:
2988
            if mandatory:
2989
                raise
2990
2991
    def put_format(self, dirname, format):
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2992
        self.bzrdir.transport.put_bytes('%s/format' % dirname,
2993
            format.get_format_string(),
2994
            self.file_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2995
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.
2996
2997
class ConvertMetaToMeta(Converter):
2998
    """Converts the components of metadirs."""
2999
3000
    def __init__(self, target_format):
3001
        """Create a metadir to metadir converter.
3002
3003
        :param target_format: The final metadir format that is desired.
3004
        """
3005
        self.target_format = target_format
3006
3007
    def convert(self, to_convert, pb):
3008
        """See Converter.convert()."""
3009
        self.bzrdir = to_convert
3010
        self.pb = pb
3011
        self.count = 0
3012
        self.total = 1
3013
        self.step('checking repository format')
3014
        try:
3015
            repo = self.bzrdir.open_repository()
3016
        except errors.NoRepositoryPresent:
3017
            pass
3018
        else:
3019
            if not isinstance(repo._format, self.target_format.repository_format.__class__):
3020
                from bzrlib.repository import CopyConverter
3021
                self.pb.note('starting repository conversion')
3022
                converter = CopyConverter(self.target_format.repository_format)
3023
                converter.convert(repo, pb)
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
3024
        try:
3025
            branch = self.bzrdir.open_branch()
3026
        except errors.NotBranchError:
3027
            pass
3028
        else:
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3029
            # TODO: conversions of Branch and Tree should be done by
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3030
            # InterXFormat lookups/some sort of registry.
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
3031
            # Avoid circular imports
3032
            from bzrlib import branch as _mod_branch
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3033
            old = branch._format.__class__
3034
            new = self.target_format.get_branch_format().__class__
3035
            while old != new:
3036
                if (old == _mod_branch.BzrBranchFormat5 and
3037
                    new in (_mod_branch.BzrBranchFormat6,
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
3038
                        _mod_branch.BzrBranchFormat7,
3039
                        _mod_branch.BzrBranchFormat8)):
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3040
                    branch_converter = _mod_branch.Converter5to6()
3041
                elif (old == _mod_branch.BzrBranchFormat6 and
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
3042
                    new in (_mod_branch.BzrBranchFormat7,
3043
                            _mod_branch.BzrBranchFormat8)):
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3044
                    branch_converter = _mod_branch.Converter6to7()
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
3045
                elif (old == _mod_branch.BzrBranchFormat7 and
3046
                      new is _mod_branch.BzrBranchFormat8):
3047
                    branch_converter = _mod_branch.Converter7to8()
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3048
                else:
4608.1.3 by Martin Pool
BadConversionTarget error includes source format
3049
                    raise errors.BadConversionTarget("No converter", new,
3050
                        branch._format)
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
3051
                branch_converter.convert(branch)
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3052
                branch = self.bzrdir.open_branch()
3053
                old = branch._format.__class__
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3054
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
3055
            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.
3056
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3057
            pass
3058
        else:
3059
            # TODO: conversions of Branch and Tree should be done by
3060
            # InterXFormat lookups
3061
            if (isinstance(tree, workingtree.WorkingTree3) and
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
3062
                not isinstance(tree, workingtree_4.DirStateWorkingTree) and
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3063
                isinstance(self.target_format.workingtree_format,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
3064
                    workingtree_4.DirStateWorkingTreeFormat)):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3065
                workingtree_4.Converter3to4().convert(tree)
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
3066
            if (isinstance(tree, workingtree_4.DirStateWorkingTree) and
3067
                not isinstance(tree, workingtree_4.WorkingTree5) and
3586.1.8 by Ian Clatworthy
add workingtree_5 and initial upgrade code
3068
                isinstance(self.target_format.workingtree_format,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
3069
                    workingtree_4.WorkingTreeFormat5)):
3070
                workingtree_4.Converter4to5().convert(tree)
4210.4.2 by Ian Clatworthy
split filtered views support out into WorkingTreeFormat6
3071
            if (isinstance(tree, workingtree_4.DirStateWorkingTree) and
3072
                not isinstance(tree, workingtree_4.WorkingTree6) and
3073
                isinstance(self.target_format.workingtree_format,
3074
                    workingtree_4.WorkingTreeFormat6)):
3075
                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.
3076
        return to_convert
1731.2.18 by Aaron Bentley
Get extract in repository under test
3077
3078
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3079
# This is not in remote.py because it's relatively small, and needs to be
3080
# registered. Putting it in remote.py creates a circular import problem.
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
3081
# we can make it a lazy object if the control formats is turned into something
3082
# like a registry.
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3083
class RemoteBzrDirFormat(BzrDirMetaFormat1):
3084
    """Format representing bzrdirs accessed via a smart server"""
3085
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
3086
    def __init__(self):
3087
        BzrDirMetaFormat1.__init__(self)
3088
        self._network_name = None
3089
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3090
    def get_format_description(self):
3091
        return 'bzr remote bzrdir'
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3092
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
3093
    def get_format_string(self):
3094
        raise NotImplementedError(self.get_format_string)
4032.3.6 by Robert Collins
Fix test_source errors.
3095
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
3096
    def network_name(self):
3097
        if self._network_name:
3098
            return self._network_name
3099
        else:
3100
            raise AssertionError("No network name set.")
3101
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
3102
    @classmethod
3103
    def probe_transport(klass, transport):
3104
        """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).
3105
        try:
3241.1.4 by Andrew Bennetts
Use get_smart_medium as suggested by Robert, and deal with the fallout.
3106
            medium = transport.get_smart_medium()
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3107
        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).
3108
                errors.TransportNotPossible, errors.NoSmartMedium,
3109
                errors.SmartProtocolError):
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
3110
            # no smart server, so not a branch for this format type.
3111
            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).
3112
        else:
3241.1.2 by Andrew Bennetts
Tidy comments.
3113
            # 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).
3114
            # 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).
3115
            if medium.should_probe():
3116
                try:
3117
                    server_version = medium.protocol_version()
3118
                except errors.SmartProtocolError:
3119
                    # Apparently there's no usable smart server there, even though
3120
                    # the medium supports the smart protocol.
3121
                    raise errors.NotBranchError(path=transport.base)
3122
                if server_version != '2':
3123
                    raise errors.NotBranchError(path=transport.base)
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
3124
            return klass()
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3125
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
3126
    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.
3127
        try:
3128
            # 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.
3129
            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.
3130
        except errors.NoSmartMedium:
3131
            # TODO: lookup the local format from a server hint.
3132
            local_dir_format = BzrDirMetaFormat1()
3133
            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.
3134
        client = _SmartClient(client_medium)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
3135
        path = client.remote_path_from_transport(transport)
4384.1.1 by Andrew Bennetts
Translate ErrorFromSmartServer in RemoteBzrDirFormat.
3136
        try:
3137
            response = client.call('BzrDirFormat.initialize', path)
3138
        except errors.ErrorFromSmartServer, err:
3139
            remote._translate_error(err, path=path)
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
3140
        if response[0] != 'ok':
3141
            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.
3142
        format = RemoteBzrDirFormat()
3143
        self._supply_sub_formats_to(format)
3144
        return remote.RemoteBzrDir(transport, format)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
3145
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3146
    def parse_NoneTrueFalse(self, arg):
3147
        if not arg:
3148
            return None
3149
        if arg == 'False':
3150
            return False
3151
        if arg == 'True':
3152
            return True
3153
        raise AssertionError("invalid arg %r" % arg)
3154
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3155
    def _serialize_NoneTrueFalse(self, arg):
3156
        if arg is False:
3157
            return 'False'
3158
        if arg:
3159
            return 'True'
3160
        return ''
3161
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3162
    def _serialize_NoneString(self, arg):
3163
        return arg or ''
3164
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3165
    def initialize_on_transport_ex(self, transport, use_existing_dir=False,
3166
        create_prefix=False, force_new_repo=False, stacked_on=None,
3167
        stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
3168
        shared_repo=False):
3169
        try:
3170
            # hand off the request to the smart server
3171
            client_medium = transport.get_smart_medium()
3172
        except errors.NoSmartMedium:
4294.2.9 by Robert Collins
Fixup tests broken by cleaning up the layering.
3173
            do_vfs = True
3174
        else:
3175
            # Decline to open it if the server doesn't support our required
3176
            # version (3) so that the VFS-based transport will do it.
3177
            if client_medium.should_probe():
3178
                try:
3179
                    server_version = client_medium.protocol_version()
3180
                    if server_version != '2':
3181
                        do_vfs = True
3182
                    else:
3183
                        do_vfs = False
3184
                except errors.SmartProtocolError:
3185
                    # Apparently there's no usable smart server there, even though
3186
                    # the medium supports the smart protocol.
3187
                    do_vfs = True
3188
            else:
3189
                do_vfs = False
3190
        if not do_vfs:
3191
            client = _SmartClient(client_medium)
3192
            path = client.remote_path_from_transport(transport)
4436.1.1 by Andrew Bennetts
Rename BzrDirFormat.initialize_ex verb to BzrDirFormat.initialize_ex_1.16.
3193
            if client_medium._is_remote_before((1, 16)):
4294.2.9 by Robert Collins
Fixup tests broken by cleaning up the layering.
3194
                do_vfs = True
3195
        if do_vfs:
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3196
            # TODO: lookup the local format from a server hint.
3197
            local_dir_format = BzrDirMetaFormat1()
3198
            self._supply_sub_formats_to(local_dir_format)
3199
            return local_dir_format.initialize_on_transport_ex(transport,
3200
                use_existing_dir=use_existing_dir, create_prefix=create_prefix,
3201
                force_new_repo=force_new_repo, stacked_on=stacked_on,
3202
                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.
3203
                make_working_trees=make_working_trees, shared_repo=shared_repo,
3204
                vfs_only=True)
4384.1.1 by Andrew Bennetts
Translate ErrorFromSmartServer in RemoteBzrDirFormat.
3205
        return self._initialize_on_transport_ex_rpc(client, path, transport,
3206
            use_existing_dir, create_prefix, force_new_repo, stacked_on,
3207
            stack_on_pwd, repo_format_name, make_working_trees, shared_repo)
3208
3209
    def _initialize_on_transport_ex_rpc(self, client, path, transport,
3210
        use_existing_dir, create_prefix, force_new_repo, stacked_on,
3211
        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.
3212
        args = []
3213
        args.append(self._serialize_NoneTrueFalse(use_existing_dir))
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3214
        args.append(self._serialize_NoneTrueFalse(create_prefix))
3215
        args.append(self._serialize_NoneTrueFalse(force_new_repo))
3216
        args.append(self._serialize_NoneString(stacked_on))
3217
        # stack_on_pwd is often/usually our transport
3218
        if stack_on_pwd:
3219
            try:
3220
                stack_on_pwd = transport.relpath(stack_on_pwd)
3221
                if not stack_on_pwd:
3222
                    stack_on_pwd = '.'
3223
            except errors.PathNotChild:
3224
                pass
3225
        args.append(self._serialize_NoneString(stack_on_pwd))
3226
        args.append(self._serialize_NoneString(repo_format_name))
3227
        args.append(self._serialize_NoneTrueFalse(make_working_trees))
3228
        args.append(self._serialize_NoneTrueFalse(shared_repo))
3229
        if self._network_name is None:
3230
            self._network_name = \
3231
            BzrDirFormat.get_default_format().network_name()
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3232
        try:
4436.1.1 by Andrew Bennetts
Rename BzrDirFormat.initialize_ex verb to BzrDirFormat.initialize_ex_1.16.
3233
            response = client.call('BzrDirFormat.initialize_ex_1.16',
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3234
                self.network_name(), path, *args)
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3235
        except errors.UnknownSmartMethod:
4436.1.1 by Andrew Bennetts
Rename BzrDirFormat.initialize_ex verb to BzrDirFormat.initialize_ex_1.16.
3236
            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.
3237
            local_dir_format = BzrDirMetaFormat1()
3238
            self._supply_sub_formats_to(local_dir_format)
3239
            return local_dir_format.initialize_on_transport_ex(transport,
3240
                use_existing_dir=use_existing_dir, create_prefix=create_prefix,
3241
                force_new_repo=force_new_repo, stacked_on=stacked_on,
3242
                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.
3243
                make_working_trees=make_working_trees, shared_repo=shared_repo,
3244
                vfs_only=True)
4384.1.1 by Andrew Bennetts
Translate ErrorFromSmartServer in RemoteBzrDirFormat.
3245
        except errors.ErrorFromSmartServer, err:
3246
            remote._translate_error(err, path=path)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3247
        repo_path = response[0]
3248
        bzrdir_name = response[6]
3249
        require_stacking = response[7]
3250
        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.
3251
        format = RemoteBzrDirFormat()
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3252
        format._network_name = bzrdir_name
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3253
        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.
3254
        bzrdir = remote.RemoteBzrDir(transport, format, _client=client)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3255
        if repo_path:
3256
            repo_format = remote.response_tuple_to_repo_format(response[1:])
3257
            if repo_path == '.':
3258
                repo_path = ''
3259
            if repo_path:
3260
                repo_bzrdir_format = RemoteBzrDirFormat()
3261
                repo_bzrdir_format._network_name = response[5]
3262
                repo_bzr = remote.RemoteBzrDir(transport.clone(repo_path),
3263
                    repo_bzrdir_format)
3264
            else:
3265
                repo_bzr = bzrdir
3266
            final_stack = response[8] or None
3267
            final_stack_pwd = response[9] or None
4416.3.8 by Jonathan Lange
This makes the unit test & one of the acceptance tests pass.
3268
            if final_stack_pwd:
4416.3.15 by Jonathan Lange
Use a URL joiner that works.
3269
                final_stack_pwd = urlutils.join(
3270
                    transport.base, final_stack_pwd)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3271
            remote_repo = remote.RemoteRepository(repo_bzr, repo_format)
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
3272
            if len(response) > 10:
3273
                # Updated server verb that locks remotely.
3274
                repo_lock_token = response[10] or None
3275
                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).
3276
                if repo_lock_token:
3277
                    remote_repo.dont_leave_lock_in_place()
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
3278
            else:
4307.2.6 by Robert Collins
Handle repositories that mutex on writes (rather than transactions).
3279
                remote_repo.lock_write()
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3280
            policy = UseExistingRepository(remote_repo, final_stack,
3281
                final_stack_pwd, require_stacking)
3282
            policy.acquire_repository()
3283
        else:
3284
            remote_repo = None
3285
            policy = None
4466.1.1 by Andrew Bennetts
Quick fix 388908: set branch format on the result of initialize_ex before calling require_stacking.
3286
        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.
3287
        if require_stacking:
3288
            # The repo has already been created, but we need to make sure that
3289
            # we'll make a stackable branch.
3290
            bzrdir._format.require_stacking(_skip_repo=True)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3291
        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.
3292
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3293
    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.
3294
        return remote.RemoteBzrDir(transport, self)
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3295
3296
    def __eq__(self, other):
3297
        if not isinstance(other, RemoteBzrDirFormat):
3298
            return False
3299
        return self.get_format_description() == other.get_format_description()
3300
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.
3301
    def __return_repository_format(self):
3302
        # Always return a RemoteRepositoryFormat object, but if a specific bzr
3303
        # repository format has been asked for, tell the RemoteRepositoryFormat
3304
        # 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.
3305
        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.
3306
        custom_format = getattr(self, '_repository_format', None)
3307
        if custom_format:
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
3308
            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.
3309
                return custom_format
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
3310
            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.
3311
                # We will use the custom format to create repositories over the
3312
                # wire; expose its details like rich_root_data for code to
3313
                # query
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
3314
                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.
3315
        return result
3316
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
3317
    def get_branch_format(self):
3318
        result = BzrDirMetaFormat1.get_branch_format(self)
3319
        if not isinstance(result, remote.RemoteBranchFormat):
3320
            new_result = remote.RemoteBranchFormat()
3321
            new_result._custom_format = result
3322
            # cache the result
3323
            self.set_branch_format(new_result)
3324
            result = new_result
3325
        return result
3326
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
3327
    repository_format = property(__return_repository_format,
3328
        BzrDirMetaFormat1._set_repository_format) #.im_func)
3845.1.1 by John Arbash Meinel
Ensure that RepositoryFormat._matchingbzrdir.repository_format matches.
3329
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3330
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
3331
BzrDirFormat.register_control_server_format(RemoteBzrDirFormat)
2018.5.45 by Andrew Bennetts
Merge from bzr.dev
3332
3333
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3334
class BzrDirFormatInfo(object):
3335
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3336
    def __init__(self, native, deprecated, hidden, experimental):
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3337
        self.deprecated = deprecated
3338
        self.native = native
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3339
        self.hidden = hidden
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3340
        self.experimental = experimental
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3341
3342
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3343
class BzrDirFormatRegistry(registry.Registry):
3344
    """Registry of user-selectable BzrDir subformats.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3345
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3346
    Differs from BzrDirFormat._control_formats in that it provides sub-formats,
3347
    e.g. BzrDirMeta1 with weave repository.  Also, it's more user-oriented.
3348
    """
3349
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3350
    def __init__(self):
3351
        """Create a BzrDirFormatRegistry."""
3352
        self._aliases = set()
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3353
        self._registration_order = list()
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3354
        super(BzrDirFormatRegistry, self).__init__()
3355
3356
    def aliases(self):
3357
        """Return a set of the format names which are aliases."""
3358
        return frozenset(self._aliases)
3359
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3360
    def register_metadir(self, key,
3361
             repository_format, help, native=True, deprecated=False,
3362
             branch_format=None,
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3363
             tree_format=None,
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3364
             hidden=False,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3365
             experimental=False,
3366
             alias=False):
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3367
        """Register a metadir subformat.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
3368
3369
        These all use a BzrDirMetaFormat1 bzrdir, but can be parameterized
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
3370
        by the Repository/Branch/WorkingTreeformats.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
3371
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3372
        :param repository_format: The fully-qualified repository format class
3373
            name as a string.
3374
        :param branch_format: Fully-qualified branch format class name as
3375
            a string.
3376
        :param tree_format: Fully-qualified tree format class name as
3377
            a string.
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3378
        """
3379
        # This should be expanded to support setting WorkingTree and Branch
3380
        # formats, once BzrDirMetaFormat1 supports that.
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3381
        def _load(full_name):
3382
            mod_name, factory_name = full_name.rsplit('.', 1)
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
3383
            try:
3384
                mod = __import__(mod_name, globals(), locals(),
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3385
                        [factory_name])
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
3386
            except ImportError, e:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3387
                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.
3388
            try:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3389
                factory = getattr(mod, factory_name)
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
3390
            except AttributeError:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3391
                raise AttributeError('no factory %s in module %r'
3392
                    % (full_name, mod))
3393
            return factory()
3394
3395
        def helper():
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3396
            bd = BzrDirMetaFormat1()
2230.3.1 by Aaron Bentley
Get branch6 creation working
3397
            if branch_format is not None:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3398
                bd.set_branch_format(_load(branch_format))
3399
            if tree_format is not None:
3400
                bd.workingtree_format = _load(tree_format)
3401
            if repository_format is not None:
3402
                bd.repository_format = _load(repository_format)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3403
            return bd
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3404
        self.register(key, helper, help, native, deprecated, hidden,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3405
            experimental, alias)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3406
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3407
    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
3408
                 hidden=False, experimental=False, alias=False):
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3409
        """Register a BzrDirFormat factory.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3410
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3411
        The factory must be a callable that takes one parameter: the key.
3412
        It must produce an instance of the BzrDirFormat when called.
3413
3414
        This function mainly exists to prevent the info object from being
3415
        supplied directly.
3416
        """
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3417
        registry.Registry.register(self, key, factory, help,
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3418
            BzrDirFormatInfo(native, deprecated, hidden, experimental))
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3419
        if alias:
3420
            self._aliases.add(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3421
        self._registration_order.append(key)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3422
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
3423
    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
3424
        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
3425
        registry.Registry.register_lazy(self, key, module_name, member_name,
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3426
            help, BzrDirFormatInfo(native, deprecated, hidden, experimental))
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3427
        if alias:
3428
            self._aliases.add(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3429
        self._registration_order.append(key)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3430
3431
    def set_default(self, key):
3432
        """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
3433
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3434
        This method must be called once and only once.
3435
        """
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3436
        registry.Registry.register(self, 'default', self.get(key),
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3437
            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
3438
        self._aliases.add('default')
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3439
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
3440
    def set_default_repository(self, key):
3441
        """Set the FormatRegistry default and Repository default.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3442
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
3443
        This is a transitional method while Repository.set_default_format
3444
        is deprecated.
3445
        """
3446
        if 'default' in self:
3447
            self.remove('default')
3448
        self.set_default(key)
3449
        format = self.get('default')()
3450
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3451
    def make_bzrdir(self, key):
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
3452
        return self.get(key)()
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3453
3454
    def help_topic(self, topic):
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3455
        output = ""
2711.2.4 by Martin Pool
Fix unbound variable error in BzrDirFormatRegistry.get_help (test order dependent)
3456
        default_realkey = None
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3457
        default_help = self.get_help('default')
3458
        help_pairs = []
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3459
        for key in self._registration_order:
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3460
            if key == 'default':
3461
                continue
3462
            help = self.get_help(key)
3463
            if help == default_help:
3464
                default_realkey = key
3465
            else:
3466
                help_pairs.append((key, help))
3467
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3468
        def wrapped(key, help, info):
3469
            if info.native:
3470
                help = '(native) ' + help
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3471
            return ':%s:\n%s\n\n' % (key,
4070.11.2 by Martin Pool
Ask textwrap not to break long words or on hyphens
3472
                textwrap.fill(help, initial_indent='    ',
3473
                    subsequent_indent='    ',
4070.11.5 by Martin Pool
textwrap break_on_hyphens option is not available in python2.5
3474
                    break_long_words=False))
2711.2.4 by Martin Pool
Fix unbound variable error in BzrDirFormatRegistry.get_help (test order dependent)
3475
        if default_realkey is not None:
3476
            output += wrapped(default_realkey, '(default) %s' % default_help,
3477
                              self.get_info('default'))
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3478
        deprecated_pairs = []
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3479
        experimental_pairs = []
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3480
        for key, help in help_pairs:
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3481
            info = self.get_info(key)
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3482
            if info.hidden:
3483
                continue
3484
            elif info.deprecated:
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3485
                deprecated_pairs.append((key, help))
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3486
            elif info.experimental:
3487
                experimental_pairs.append((key, help))
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3488
            else:
3489
                output += wrapped(key, help, info)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3490
        output += "\nSee ``bzr help formats`` for more about storage formats."
3491
        other_output = ""
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3492
        if len(experimental_pairs) > 0:
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3493
            other_output += "Experimental formats are shown below.\n\n"
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3494
            for key, help in experimental_pairs:
3495
                info = self.get_info(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3496
                other_output += wrapped(key, help, info)
3497
        else:
3498
            other_output += \
3499
                "No experimental formats are available.\n\n"
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3500
        if len(deprecated_pairs) > 0:
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3501
            other_output += "\nDeprecated formats are shown below.\n\n"
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3502
            for key, help in deprecated_pairs:
3503
                info = self.get_info(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3504
                other_output += wrapped(key, help, info)
3505
        else:
3506
            other_output += \
3507
                "\nNo deprecated formats are available.\n\n"
3508
        other_output += \
3509
            "\nSee ``bzr help formats`` for more about storage formats."
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3510
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3511
        if topic == 'other-formats':
3512
            return other_output
3513
        else:
3514
            return output
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3515
3516
3242.2.14 by Aaron Bentley
Update from review comments
3517
class RepositoryAcquisitionPolicy(object):
3518
    """Abstract base class for repository acquisition policies.
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
3519
3242.2.14 by Aaron Bentley
Update from review comments
3520
    A repository acquisition policy decides how a BzrDir acquires a repository
3521
    for a branch that is being created.  The most basic policy decision is
3522
    whether to create a new repository or use an existing one.
3523
    """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3524
    def __init__(self, stack_on, stack_on_pwd, require_stacking):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3525
        """Constructor.
3526
3527
        :param stack_on: A location to stack on
3528
        :param stack_on_pwd: If stack_on is relative, the location it is
3529
            relative to.
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3530
        :param require_stacking: If True, it is a failure to not stack.
3242.3.35 by Aaron Bentley
Cleanups and documentation
3531
        """
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
3532
        self._stack_on = stack_on
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
3533
        self._stack_on_pwd = stack_on_pwd
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3534
        self._require_stacking = require_stacking
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
3535
3536
    def configure_branch(self, branch):
3242.2.13 by Aaron Bentley
Update docs
3537
        """Apply any configuration data from this policy to the branch.
3538
3242.3.18 by Aaron Bentley
Clean up repository-policy work
3539
        Default implementation sets repository stacking.
3242.2.13 by Aaron Bentley
Update docs
3540
        """
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3541
        if self._stack_on is None:
3542
            return
3543
        if self._stack_on_pwd is None:
3544
            stack_on = self._stack_on
3545
        else:
3546
            try:
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
3547
                stack_on = urlutils.rebase_url(self._stack_on,
3548
                    self._stack_on_pwd,
3549
                    branch.bzrdir.root_transport.base)
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3550
            except errors.InvalidRebaseURLs:
3551
                stack_on = self._get_full_stack_on()
3242.3.37 by Aaron Bentley
Updates from reviews
3552
        try:
3537.3.5 by Martin Pool
merge trunk including stacking policy
3553
            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.
3554
        except (errors.UnstackableBranchFormat,
3555
                errors.UnstackableRepositoryFormat):
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3556
            if self._require_stacking:
3557
                raise
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3558
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.
3559
    def requires_stacking(self):
3560
        """Return True if this policy requires stacking."""
3561
        return self._stack_on is not None and self._require_stacking
3562
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3563
    def _get_full_stack_on(self):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3564
        """Get a fully-qualified URL for the stack_on location."""
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3565
        if self._stack_on is None:
3566
            return None
3567
        if self._stack_on_pwd is None:
3568
            return self._stack_on
3569
        else:
3570
            return urlutils.join(self._stack_on_pwd, self._stack_on)
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
3571
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
3572
    def _add_fallback(self, repository, possible_transports=None):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3573
        """Add a fallback to the supplied repository, if stacking is set."""
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3574
        stack_on = self._get_full_stack_on()
3575
        if stack_on is None:
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
3576
            return
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3577
        try:
3578
            stacked_dir = BzrDir.open(stack_on,
3579
                                      possible_transports=possible_transports)
3580
        except errors.JailBreak:
3581
            # We keep the stacking details, but we are in the server code so
3582
            # actually stacking is not needed.
3583
            return
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
3584
        try:
3585
            stacked_repo = stacked_dir.open_branch().repository
3586
        except errors.NotBranchError:
3587
            stacked_repo = stacked_dir.open_repository()
3242.3.37 by Aaron Bentley
Updates from reviews
3588
        try:
3589
            repository.add_fallback_repository(stacked_repo)
3590
        except errors.UnstackableRepositoryFormat:
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3591
            if self._require_stacking:
3592
                raise
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
3593
        else:
3594
            self._require_stacking = True
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
3595
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
3596
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
3597
        """Acquire a repository for this bzrdir.
3598
3599
        Implementations may create a new repository or use a pre-exising
3600
        repository.
3601
        :param make_working_trees: If creating a repository, set
3602
            make_working_trees to this value (if non-None)
3603
        :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.
3604
        :return: A repository, is_new_flag (True if the repository was
3605
            created).
3242.2.14 by Aaron Bentley
Update from review comments
3606
        """
3607
        raise NotImplemented(RepositoryAcquisitionPolicy.acquire_repository)
3608
3609
3610
class CreateRepository(RepositoryAcquisitionPolicy):
3242.2.13 by Aaron Bentley
Update docs
3611
    """A policy of creating a new repository"""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3612
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3613
    def __init__(self, bzrdir, stack_on=None, stack_on_pwd=None,
3614
                 require_stacking=False):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3615
        """
3616
        Constructor.
3617
        :param bzrdir: The bzrdir to create the repository on.
3618
        :param stack_on: A location to stack on
3619
        :param stack_on_pwd: If stack_on is relative, the location it is
3620
            relative to.
3621
        """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3622
        RepositoryAcquisitionPolicy.__init__(self, stack_on, stack_on_pwd,
3623
                                             require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3624
        self._bzrdir = bzrdir
3625
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
3626
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
3627
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
3242.2.13 by Aaron Bentley
Update docs
3628
3242.2.14 by Aaron Bentley
Update from review comments
3629
        Creates the desired repository in the bzrdir we already have.
3242.2.13 by Aaron Bentley
Update docs
3630
        """
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.
3631
        stack_on = self._get_full_stack_on()
3632
        if stack_on:
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
3633
            format = self._bzrdir._format
3634
            format.require_stacking(stack_on=stack_on,
3635
                                    possible_transports=[self._bzrdir.root_transport])
3636
            if not self._require_stacking:
3637
                # We have picked up automatic stacking somewhere.
3638
                note('Using default stacking branch %s at %s', self._stack_on,
3639
                    self._stack_on_pwd)
3650.3.9 by Aaron Bentley
Move responsibility for stackable repo format to _get_metadir
3640
        repository = self._bzrdir.create_repository(shared=shared)
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
3641
        self._add_fallback(repository,
3642
                           possible_transports=[self._bzrdir.transport])
3242.2.4 by Aaron Bentley
Only set working tree policty when specified
3643
        if make_working_trees is not None:
3242.3.6 by Aaron Bentley
Work around strange test failure
3644
            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.
3645
        return repository, True
3242.2.2 by Aaron Bentley
Merge policy updates from stacked-policy thread
3646
3647
3242.2.14 by Aaron Bentley
Update from review comments
3648
class UseExistingRepository(RepositoryAcquisitionPolicy):
3242.2.13 by Aaron Bentley
Update docs
3649
    """A policy of reusing an existing repository"""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3650
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3651
    def __init__(self, repository, stack_on=None, stack_on_pwd=None,
3652
                 require_stacking=False):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3653
        """Constructor.
3654
3655
        :param repository: The repository to use.
3656
        :param stack_on: A location to stack on
3657
        :param stack_on_pwd: If stack_on is relative, the location it is
3658
            relative to.
3659
        """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3660
        RepositoryAcquisitionPolicy.__init__(self, stack_on, stack_on_pwd,
3661
                                             require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3662
        self._repository = repository
3663
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
3664
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
3665
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
3242.2.13 by Aaron Bentley
Update docs
3666
4070.9.8 by Andrew Bennetts
Use MiniSearchResult in clone_on_transport down (further tightening the test_push ratchets), and improve acquire_repository docstrings.
3667
        Returns an existing repository to use.
3242.2.13 by Aaron Bentley
Update docs
3668
        """
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
3669
        self._add_fallback(self._repository,
3670
                       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.
3671
        return self._repository, False
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3672
3673
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3674
# Please register new formats after old formats so that formats
3675
# appear in chronological order and format descriptions can build
3676
# on previous ones.
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3677
format_registry = BzrDirFormatRegistry()
3990.5.3 by Robert Collins
Docs and polish on RepositoryFormat.network_name.
3678
# The pre-0.8 formats have their repository format network name registered in
3679
# repository.py. MetaDir formats have their repository format network name
3680
# inferred from their disk format string.
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
3681
format_registry.register('weave', BzrDirFormat6,
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3682
    '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
3683
    ' support checkouts or shared repositories.',
3684
    deprecated=True)
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
3685
format_registry.register_metadir('metaweave',
3686
    'bzrlib.repofmt.weaverepo.RepositoryFormat7',
2230.3.30 by Aaron Bentley
Fix whitespace issues
3687
    'Transitional format in 0.8.  Slower than knit.',
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3688
    branch_format='bzrlib.branch.BzrBranchFormat5',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
3689
    tree_format='bzrlib.workingtree.WorkingTreeFormat3',
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3690
    deprecated=True)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3691
format_registry.register_metadir('knit',
3692
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3693
    'Format using knits.  Recommended for interoperation with bzr <= 0.14.',
3694
    branch_format='bzrlib.branch.BzrBranchFormat5',
3695
    tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3696
    deprecated=True)
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3697
format_registry.register_metadir('dirstate',
3698
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3699
    help='New in 0.15: Fast local operations. Compatible with bzr 0.8 and '
3700
        'above when accessed over the network.',
3701
    branch_format='bzrlib.branch.BzrBranchFormat5',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
3702
    # this uses bzrlib.workingtree.WorkingTreeFormat4 because importing
3703
    # directly from workingtree_4 triggers a circular import.
3704
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3892.1.1 by Ian Clatworthy
improve help on storage formats
3705
    deprecated=True)
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
3706
format_registry.register_metadir('dirstate-tags',
3707
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3708
    help='New in 0.15: Fast local operations and improved scaling for '
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3709
        'network operations. Additionally adds support for tags.'
3710
        ' Incompatible with bzr < 0.15.',
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
3711
    branch_format='bzrlib.branch.BzrBranchFormat6',
3712
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3892.1.1 by Ian Clatworthy
improve help on storage formats
3713
    deprecated=True)
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
3714
format_registry.register_metadir('rich-root',
3715
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
3716
    help='New in 1.0.  Better handling of tree roots.  Incompatible with'
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3717
        ' bzr < 1.0.',
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
3718
    branch_format='bzrlib.branch.BzrBranchFormat6',
3719
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3892.1.1 by Ian Clatworthy
improve help on storage formats
3720
    deprecated=True)
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3721
format_registry.register_metadir('dirstate-with-subtree',
3722
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
3723
    help='New in 0.15: Fast local operations and improved scaling for '
3724
        'network operations. Additionally adds support for versioning nested '
3725
        'bzr branches. Incompatible with bzr < 0.15.',
3726
    branch_format='bzrlib.branch.BzrBranchFormat6',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
3727
    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.
3728
    experimental=True,
3170.4.4 by Adeodato Simó
Keep the hidden flag for subtree formats after review from Aaron.
3729
    hidden=True,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3730
    )
3010.3.2 by Martin Pool
Rename pack0.92 to pack-0.92
3731
format_registry.register_metadir('pack-0.92',
2592.3.224 by Martin Pool
Rename GraphKnitRepository etc to KnitPackRepository
3732
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack1',
2939.2.1 by Ian Clatworthy
use 'knitpack' naming instead of 'experimental' for pack formats
3733
    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
3734
        'dirstate-tags format repositories. Interoperates with '
3735
        '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)
3736
        'Previously called knitpack-experimental.  '
3737
        'For more information, see '
3738
        'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
2592.3.22 by Robert Collins
Add new experimental repository formats.
3739
    branch_format='bzrlib.branch.BzrBranchFormat6',
3740
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3741
    )
3010.3.2 by Martin Pool
Rename pack0.92 to pack-0.92
3742
format_registry.register_metadir('pack-0.92-subtree',
2592.3.224 by Martin Pool
Rename GraphKnitRepository etc to KnitPackRepository
3743
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack3',
2939.2.1 by Ian Clatworthy
use 'knitpack' naming instead of 'experimental' for pack formats
3744
    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
3745
        'dirstate-with-subtree format repositories. Interoperates with '
3746
        '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)
3747
        'Previously called knitpack-experimental.  '
3748
        'For more information, see '
3749
        'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
2592.3.22 by Robert Collins
Add new experimental repository formats.
3750
    branch_format='bzrlib.branch.BzrBranchFormat6',
3751
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3190.1.2 by Aaron Bentley
Undo spurious change
3752
    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.
3753
    experimental=True,
2592.3.22 by Robert Collins
Add new experimental repository formats.
3754
    )
2996.2.11 by Aaron Bentley
Implement rich-root-pack format ( #164639)
3755
format_registry.register_metadir('rich-root-pack',
3756
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack4',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3757
    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.
3758
         '(needed for bzr-svn and bzr-git).',
2996.2.11 by Aaron Bentley
Implement rich-root-pack format ( #164639)
3759
    branch_format='bzrlib.branch.BzrBranchFormat6',
3760
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3761
    )
3575.2.1 by Martin Pool
Rename stacked format to 1.6
3762
format_registry.register_metadir('1.6',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3763
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5',
3892.1.6 by Ian Clatworthy
include feedback from poolie
3764
    help='A format that allows a branch to indicate that there is another '
3765
         '(stacked) repository that should be used to access data that is '
3766
         'not present locally.',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3767
    branch_format='bzrlib.branch.BzrBranchFormat7',
3768
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3769
    )
3606.10.2 by John Arbash Meinel
Name the new format 1.6.1-rich-root, and NEWS for fixing bug #262333
3770
format_registry.register_metadir('1.6.1-rich-root',
3549.1.6 by Martin Pool
Change stacked-subtree to stacked-rich-root
3771
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5RichRoot',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3772
    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.
3773
         '(needed for bzr-svn and bzr-git).',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3774
    branch_format='bzrlib.branch.BzrBranchFormat7',
3775
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3776
    )
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3777
format_registry.register_metadir('1.9',
3778
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3892.1.6 by Ian Clatworthy
include feedback from poolie
3779
    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
3780
         'are smaller in size, have smarter caching and provide faster '
3781
         'performance for most operations.',
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3782
    branch_format='bzrlib.branch.BzrBranchFormat7',
3783
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3784
    )
3785
format_registry.register_metadir('1.9-rich-root',
3786
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3787
    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.
3788
         '(needed for bzr-svn and bzr-git).',
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3789
    branch_format='bzrlib.branch.BzrBranchFormat7',
3790
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3791
    )
4210.4.1 by Ian Clatworthy
replace experimental development-wt5 formats with 1.14 formats
3792
format_registry.register_metadir('1.14',
3586.2.10 by Ian Clatworthy
rename formats from 1.7-* to 1.12-*
3793
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
4210.4.2 by Ian Clatworthy
split filtered views support out into WorkingTreeFormat6
3794
    help='A working-tree format that supports content filtering.',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
3795
    branch_format='bzrlib.branch.BzrBranchFormat7',
3995.7.1 by John Arbash Meinel
Fix bug #328135.
3796
    tree_format='bzrlib.workingtree.WorkingTreeFormat5',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
3797
    )
4210.4.1 by Ian Clatworthy
replace experimental development-wt5 formats with 1.14 formats
3798
format_registry.register_metadir('1.14-rich-root',
3586.2.10 by Ian Clatworthy
rename formats from 1.7-* to 1.12-*
3799
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
4210.4.1 by Ian Clatworthy
replace experimental development-wt5 formats with 1.14 formats
3800
    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.
3801
         '(needed for bzr-svn and bzr-git).',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
3802
    branch_format='bzrlib.branch.BzrBranchFormat7',
3995.7.1 by John Arbash Meinel
Fix bug #328135.
3803
    tree_format='bzrlib.workingtree.WorkingTreeFormat5',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
3804
    )
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)
3805
# The following un-numbered 'development' formats should always just be aliases.
3806
format_registry.register_metadir('development-rich-root',
3807
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
4241.15.17 by Matt Nordhoff
development-rich-root's help string didn't say it supported rich roots.
3808
    help='Current development format. Supports rich roots. Can convert data '
3809
        'to and from rich-root-pack (and anything compatible with '
3810
        'rich-root-pack) format repositories. Repositories and branches in '
3811
        '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
3812
        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3813
        'before use.',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
3814
    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)
3815
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3816
    experimental=True,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3817
    alias=True,
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3818
    )
3819
format_registry.register_metadir('development-subtree',
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
3820
    'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3821
    help='Current development format, subtree variant. Can convert data to and '
3221.11.7 by Robert Collins
Merge in real stacked repository work.
3822
        'from pack-0.92-subtree (and anything compatible with '
3823
        'pack-0.92-subtree) format repositories. Repositories and branches in '
3824
        '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
3825
        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3826
        'before use.',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
3827
    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)
3828
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3829
    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)
3830
    alias=False, # Restore to being an alias when an actual development subtree format is added
3831
                 # This current non-alias status is simply because we did not introduce a
3832
                 # chk based subtree format.
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3833
    )
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)
3834
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
3835
# 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)
3836
format_registry.register_metadir('development6-rich-root',
3837
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
3838
    help='pack-1.9 with 255-way hashed CHK inv, group compress, rich roots '
3839
        'Please read '
3840
        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3841
        'before use.',
3842
    branch_format='bzrlib.branch.BzrBranchFormat7',
3843
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3844
    hidden=True,
3735.31.1 by John Arbash Meinel
Bring the groupcompress plugin into the brisbane-core branch.
3845
    experimental=True,
3846
    )
3847
4290.1.7 by Jelmer Vernooij
Add development7-rich-root format that uses the RIO Serializer.
3848
format_registry.register_metadir('development7-rich-root',
3849
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
4290.1.12 by Jelmer Vernooij
Use bencode rather than rio in the new revision serialiszer.
3850
    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.
3851
        'rich roots. Please read '
3852
        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3853
        'before use.',
3854
    branch_format='bzrlib.branch.BzrBranchFormat7',
3855
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3856
    hidden=True,
3857
    experimental=True,
3858
    )
3859
4428.2.1 by Martin Pool
Add 2a format
3860
format_registry.register_metadir('2a',
3861
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
3862
    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
3863
        'Uses group-compress storage.\n'
4428.2.6 by Martin Pool
Stupid typo fix
3864
        '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
3865
        # 'storage in packs, 255-way hashed CHK inventory, bencode revision, group compress, '
3866
        # 'rich roots. Supported by bzr 1.16 and later.',
4428.2.1 by Martin Pool
Add 2a format
3867
    branch_format='bzrlib.branch.BzrBranchFormat7',
3868
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4428.2.5 by Martin Pool
Mark 2a experimental and tweak its help per lifeless's review
3869
    experimental=True,
4428.2.1 by Martin Pool
Add 2a format
3870
    )
4428.2.2 by Martin Pool
Format 2a should not be hidden
3871
4119.6.2 by Jelmer Vernooij
Use existing alias mechanism for default-rich-root.
3872
# The following format should be an alias for the rich root equivalent 
3873
# of the default format
3874
format_registry.register_metadir('default-rich-root',
4599.4.37 by Robert Collins
Fix registration of default-rich-root as 2a.
3875
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
3876
    branch_format='bzrlib.branch.BzrBranchFormat7',
3877
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4599.4.23 by Robert Collins
default-rich-root should be an alias still.
3878
    alias=True,
4599.4.22 by mbp at sourcefrog
Don't forget to set default-rich-root to 2a too.
3879
    help='Same as 2a.')
3880
3221.11.2 by Robert Collins
Create basic stackable branch facility.
3881
# The current format that is made on 'bzr init'.
4599.4.1 by Robert Collins
Change the default format to 2a.
3882
format_registry.set_default('2a')