/brz/remove-bazaar

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