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