~bzr-pqm/bzr/bzr.dev

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)
5215.3.3 by Marius Kruger
remove inappropriate catches
378
            except (errors.NotBranchError, errors.PermissionDenied):
3140.1.1 by Aaron Bentley
Implement find_bzrdir functionality
379
                pass
380
            else:
381
                recurse, value = evaluate(bzrdir)
382
                yield value
383
            try:
384
                subdirs = list_current(current_transport)
5215.3.1 by Marius Kruger
don't raise an exception when finding or brobing for a bzrdir and permission is denied
385
            except (errors.NoSuchFile, errors.PermissionDenied):
3140.1.1 by Aaron Bentley
Implement find_bzrdir functionality
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()]
5215.4.1 by Marius Kruger
BzrDir.find_branches should not fall over when encountering branches with missing repos
397
        except (errors.NotBranchError, errors.NoRepositoryPresent):
4997.1.1 by Jelmer Vernooij
Add BzrDir.list_branches().
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()
5316.1.1 by Andrew Bennetts
Fix BzrDir.sprout to respect default stacking policy.
1247
        is_stacked = stacked or (len(result_repo._fallback_repositories) != 0)
1248
        if is_new_repo and revision_id is not None and not is_stacked:
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1249
            fetch_spec = graph.PendingAncestryResult(
1250
                [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.
1251
        else:
1252
            fetch_spec = None
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
1253
        if source_repository is not None:
3650.3.1 by Aaron Bentley
Ensure stacking policy does not cause format upgrades
1254
            # Fetch while stacked to prevent unstacked fetch from
1255
            # 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.
1256
            if fetch_spec is None:
1257
                result_repo.fetch(source_repository, revision_id=revision_id)
1258
            else:
1259
                result_repo.fetch(source_repository, fetch_spec=fetch_spec)
3221.18.1 by Ian Clatworthy
tweaks by ianc during review
1260
3650.3.1 by Aaron Bentley
Ensure stacking policy does not cause format upgrades
1261
        if source_branch is None:
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
1262
            # this is for sprouting a bzrdir without a branch; is that
1263
            # actually useful?
3650.3.1 by Aaron Bentley
Ensure stacking policy does not cause format upgrades
1264
            # Not especially, but it's part of the contract.
3221.11.20 by Robert Collins
Support --shallow on branch.
1265
            result_branch = result.create_branch()
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
1266
        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.
1267
            result_branch = source_branch.sprout(result,
1268
                revision_id=revision_id, repository_policy=repository_policy)
3575.2.2 by Martin Pool
branch --stacked should force a stacked format
1269
        mutter("created new branch %r" % (result_branch,))
3221.18.1 by Ian Clatworthy
tweaks by ianc during review
1270
1271
        # Create/update the result working tree
3983.1.7 by Daniel Watkins
Review comments from jam.
1272
        if (create_tree_if_local and
1273
            isinstance(target_transport, local.LocalTransport) and
1274
            (result_repo is None or result_repo.make_working_trees())):
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1275
            wt = result.create_workingtree(accelerator_tree=accelerator_tree,
1276
                hardlink=hardlink)
2255.2.77 by Robert Collins
Tune working inventory generation more: walk the blocks, skipping deleted rows.
1277
            wt.lock_write()
1278
            try:
1279
                if wt.path2id('') is None:
3123.5.10 by Aaron Bentley
Restore old handling of set_root_id
1280
                    try:
1281
                        wt.set_root_id(self.open_workingtree.get_root_id())
1282
                    except errors.NoWorkingTree:
1283
                        pass
2255.2.77 by Robert Collins
Tune working inventory generation more: walk the blocks, skipping deleted rows.
1284
            finally:
1285
                wt.unlock()
2100.3.28 by Aaron Bentley
Make sprout recursive
1286
        else:
1287
            wt = None
4370.3.2 by Ian Clatworthy
apply jam's review feedback
1288
        if recurse == 'down':
2100.3.28 by Aaron Bentley
Make sprout recursive
1289
            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.
1290
                basis = wt.basis_tree()
1291
                basis.lock_read()
1292
                subtrees = basis.iter_references()
3744.1.1 by John Arbash Meinel
When branching into a tree-less repository, use the target branch
1293
            elif result_branch is not None:
1294
                basis = result_branch.basis_tree()
1295
                basis.lock_read()
1296
                subtrees = basis.iter_references()
2100.3.28 by Aaron Bentley
Make sprout recursive
1297
            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.
1298
                basis = source_branch.basis_tree()
1299
                basis.lock_read()
1300
                subtrees = basis.iter_references()
2100.3.28 by Aaron Bentley
Make sprout recursive
1301
            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.
1302
                subtrees = []
1303
                basis = None
1304
            try:
1305
                for path, file_id in subtrees:
1306
                    target = urlutils.join(url, urlutils.escape(path))
1307
                    sublocation = source_branch.reference_parent(file_id, path)
1308
                    sublocation.bzrdir.sprout(target,
1309
                        basis.get_reference_revision(file_id, path),
3221.18.1 by Ian Clatworthy
tweaks by ianc during review
1310
                        force_new_repo=force_new_repo, recurse=recurse,
3221.18.4 by Ian Clatworthy
shallow -> stacked
1311
                        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.
1312
            finally:
1313
                if basis is not None:
1314
                    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.
1315
        return result
1316
3978.3.15 by Jelmer Vernooij
Rename BzrDir.push() to BzrDir.push_branch().
1317
    def push_branch(self, source, revision_id=None, overwrite=False, 
4416.8.1 by Jelmer Vernooij
Pass create_prefix paremeter to BzrDir.push_branch.
1318
        remember=False, create_prefix=False):
3978.3.14 by Jelmer Vernooij
Move BranchBzrDirInter.push() to BzrDir.push().
1319
        """Push the source branch into this BzrDir."""
1320
        br_to = None
1321
        # If we can open a branch, use its direct repository, otherwise see
1322
        # if there is a repository without a branch.
1323
        try:
1324
            br_to = self.open_branch()
1325
        except errors.NotBranchError:
1326
            # Didn't find a branch, can we find a repository?
1327
            repository_to = self.find_repository()
1328
        else:
1329
            # Found a branch, so we must have found a repository
1330
            repository_to = br_to.repository
1331
1332
        push_result = PushResult()
3978.3.16 by Jelmer Vernooij
Add some smoke tests for BzrDir.push_branch().
1333
        push_result.source_branch = source
3978.3.14 by Jelmer Vernooij
Move BranchBzrDirInter.push() to BzrDir.push().
1334
        if br_to is None:
1335
            # We have a repository but no branch, copy the revisions, and then
1336
            # create a branch.
1337
            repository_to.fetch(source.repository, revision_id=revision_id)
1338
            br_to = source.clone(self, revision_id=revision_id)
1339
            if source.get_push_location() is None or remember:
1340
                source.set_push_location(br_to.base)
1341
            push_result.stacked_on = None
1342
            push_result.branch_push_result = None
1343
            push_result.old_revno = None
1344
            push_result.old_revid = _mod_revision.NULL_REVISION
1345
            push_result.target_branch = br_to
1346
            push_result.master_branch = None
1347
            push_result.workingtree_updated = False
1348
        else:
1349
            # We have successfully opened the branch, remember if necessary:
1350
            if source.get_push_location() is None or remember:
1351
                source.set_push_location(br_to.base)
1352
            try:
1353
                tree_to = self.open_workingtree()
1354
            except errors.NotLocalUrl:
1355
                push_result.branch_push_result = source.push(br_to, 
1356
                    overwrite, stop_revision=revision_id)
1357
                push_result.workingtree_updated = False
1358
            except errors.NoWorkingTree:
1359
                push_result.branch_push_result = source.push(br_to,
1360
                    overwrite, stop_revision=revision_id)
1361
                push_result.workingtree_updated = None # Not applicable
1362
            else:
1363
                tree_to.lock_write()
1364
                try:
1365
                    push_result.branch_push_result = source.push(
1366
                        tree_to.branch, overwrite, stop_revision=revision_id)
1367
                    tree_to.update()
1368
                finally:
1369
                    tree_to.unlock()
1370
                push_result.workingtree_updated = True
1371
            push_result.old_revno = push_result.branch_push_result.old_revno
1372
            push_result.old_revid = push_result.branch_push_result.old_revid
3978.3.15 by Jelmer Vernooij
Rename BzrDir.push() to BzrDir.push_branch().
1373
            push_result.target_branch = \
1374
                push_result.branch_push_result.target_branch
3978.3.14 by Jelmer Vernooij
Move BranchBzrDirInter.push() to BzrDir.push().
1375
        return push_result
1376
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1377
4160.1.1 by Robert Collins
Add a BzrDir.pre_open hook for use by the smart server gaol.
1378
class BzrDirHooks(hooks.Hooks):
1379
    """Hooks for BzrDir operations."""
1380
1381
    def __init__(self):
1382
        """Create the default hooks."""
1383
        hooks.Hooks.__init__(self)
1384
        self.create_hook(hooks.HookPoint('pre_open',
1385
            "Invoked before attempting to open a BzrDir with the transport "
1386
            "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',
1387
        self.create_hook(hooks.HookPoint('post_repo_init',
1388
            "Invoked after a repository has been initialized. "
1389
            "post_repo_init is called with a "
1390
            "bzrlib.bzrdir.RepoInitHookParams.",
1391
            (2, 2), None))
4160.1.1 by Robert Collins
Add a BzrDir.pre_open hook for use by the smart server gaol.
1392
1393
# install the default hooks
1394
BzrDir.hooks = BzrDirHooks()
1395
1396
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
1397
class RepoInitHookParams(object):
1398
    """Object holding parameters passed to *_repo_init hooks.
1399
1400
    There are 4 fields that hooks may wish to access:
1401
1402
    :ivar repository: Repository created
1403
    :ivar format: Repository format
1404
    :ivar bzrdir: The bzrdir for the repository
1405
    :ivar shared: The repository is shared
1406
    """
1407
1408
    def __init__(self, repository, format, a_bzrdir, shared):
1409
        """Create a group of RepoInitHook parameters.
1410
1411
        :param repository: Repository created
1412
        :param format: Repository format
1413
        :param bzrdir: The bzrdir for the repository
1414
        :param shared: The repository is shared
1415
        """
5107.3.4 by Marco Pantaleoni
Applied suggestions from merge reviewer (John A Meinel):
1416
        self.repository = repository
1417
        self.format = format
1418
        self.bzrdir = a_bzrdir
1419
        self.shared = shared
5107.3.1 by Marco Pantaleoni
Added the new hooks 'post_branch', 'post_switch' and 'post_repo_init',
1420
1421
    def __eq__(self, other):
1422
        return self.__dict__ == other.__dict__
1423
1424
    def __repr__(self):
1425
        if self.repository:
1426
            return "<%s for %s>" % (self.__class__.__name__,
1427
                self.repository)
1428
        else:
1429
            return "<%s for %s>" % (self.__class__.__name__,
1430
                self.bzrdir)
1431
1432
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1433
class BzrDirPreSplitOut(BzrDir):
1434
    """A common class for the all-in-one formats."""
1435
1534.5.3 by Robert Collins
Make format 4/5/6 branches share a single LockableFiles instance across wt/branch/repository.
1436
    def __init__(self, _transport, _format):
1437
        """See BzrDir.__init__."""
1438
        super(BzrDirPreSplitOut, self).__init__(_transport, _format)
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1439
        self._control_files = lockable_files.LockableFiles(
1440
                                            self.get_branch_transport(None),
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1441
                                            self._format._lock_file_name,
1442
                                            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.
1443
1687.1.12 by Robert Collins
Hook in the full break-lock ui.
1444
    def break_lock(self):
1445
        """Pre-splitout bzrdirs do not suffer from stale locks."""
1446
        raise NotImplementedError(self.break_lock)
1447
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
1448
    def cloning_metadir(self, require_stacking=False):
3242.2.12 by Aaron Bentley
Get cloning_metadir working properly for old formats
1449
        """Produce a metadir suitable for cloning with."""
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
1450
        if require_stacking:
1451
            return format_registry.make_bzrdir('1.6')
3242.2.12 by Aaron Bentley
Get cloning_metadir working properly for old formats
1452
        return self._format.__class__()
1453
3242.3.37 by Aaron Bentley
Updates from reviews
1454
    def clone(self, url, revision_id=None, force_new_repo=False,
1455
              preserve_stacking=False):
1456
        """See BzrDir.clone().
1457
1458
        force_new_repo has no effect, since this family of formats always
1459
        require a new repository.
1460
        preserve_stacking has no effect, since no source branch using this
1461
        family of formats can be stacked, so there is no stacking to preserve.
1462
        """
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.
1463
        self._make_tail(url)
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1464
        result = self._format._initialize_for_clone(url)
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
1465
        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)
1466
        from_branch = self.open_branch()
1467
        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.
1468
        try:
3650.5.7 by Aaron Bentley
Fix working tree initialization
1469
            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.
1470
        except errors.NotLocalUrl:
1471
            # make a new one, this format always has to have one.
3650.5.7 by Aaron Bentley
Fix working tree initialization
1472
            result._init_workingtree()
1473
        else:
1474
            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.
1475
        return result
1476
5051.3.2 by Jelmer Vernooij
Add name argument to BzrDir.create_branch().
1477
    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.
1478
        """See BzrDir.create_branch."""
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1479
        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.
1480
5051.3.1 by Jelmer Vernooij
Add optional name argument to BzrDir.destroy_branch.
1481
    def destroy_branch(self, name=None):
2796.2.16 by Aaron Bentley
Documentation updates from review
1482
        """See BzrDir.destroy_branch."""
2796.2.6 by Aaron Bentley
Implement destroy_branch
1483
        raise errors.UnsupportedOperation(self.destroy_branch, self)
1484
1534.6.1 by Robert Collins
allow API creation of shared repositories
1485
    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.
1486
        """See BzrDir.create_repository."""
1534.6.1 by Robert Collins
allow API creation of shared repositories
1487
        if shared:
1488
            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.
1489
        return self.open_repository()
1490
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
1491
    def destroy_repository(self):
1492
        """See BzrDir.destroy_repository."""
1493
        raise errors.UnsupportedOperation(self.destroy_repository, self)
1494
3123.5.2 by Aaron Bentley
Allow checkout --files_from
1495
    def create_workingtree(self, revision_id=None, from_branch=None,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1496
                           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.
1497
        """See BzrDir.create_workingtree."""
3650.5.6 by Aaron Bentley
Fix cloning problems by creating missing working tree files
1498
        # The workingtree is sometimes created when the bzrdir is created,
1499
        # but not when cloning.
1500
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1501
        # this looks buggy but is not -really-
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1502
        # because this format creates the workingtree when the bzrdir is
1503
        # created
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1504
        # clone and sprout will have set the revision_id
1505
        # and that will have set it for us, its only
1506
        # specific uses of create_workingtree in isolation
1507
        # that can do wonky stuff here, and that only
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1508
        # happens for creating checkouts, which cannot be
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1509
        # done on this format anyway. So - acceptable wart.
4580.4.1 by Martin Pool
Give a warning if --hardlink can't be supported
1510
        if hardlink:
1511
            warning("can't support hardlinked working trees in %r"
1512
                % (self,))
3650.5.6 by Aaron Bentley
Fix cloning problems by creating missing working tree files
1513
        try:
1514
            result = self.open_workingtree(recommend_upgrade=False)
1515
        except errors.NoSuchFile:
1516
            result = self._init_workingtree()
1508.1.24 by Robert Collins
Add update command for use with checkouts.
1517
        if revision_id is not None:
1996.3.12 by John Arbash Meinel
Change how 'revision' is imported to avoid problems later
1518
            if revision_id == _mod_revision.NULL_REVISION:
1551.8.20 by Aaron Bentley
Fix BzrDir.create_workingtree for NULL_REVISION
1519
                result.set_parent_ids([])
1520
            else:
1521
                result.set_parent_ids([revision_id])
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1522
        return result
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1523
3650.5.6 by Aaron Bentley
Fix cloning problems by creating missing working tree files
1524
    def _init_workingtree(self):
1525
        from bzrlib.workingtree import WorkingTreeFormat2
1526
        try:
1527
            return WorkingTreeFormat2().initialize(self)
1528
        except errors.NotLocalUrl:
1529
            # Even though we can't access the working tree, we need to
1530
            # create its control files.
3650.5.7 by Aaron Bentley
Fix working tree initialization
1531
            return WorkingTreeFormat2()._stub_initialize_on_transport(
1532
                self.transport, self._control_files._file_mode)
3650.5.6 by Aaron Bentley
Fix cloning problems by creating missing working tree files
1533
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1534
    def destroy_workingtree(self):
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
1535
        """See BzrDir.destroy_workingtree."""
1536
        raise errors.UnsupportedOperation(self.destroy_workingtree, self)
1537
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1538
    def destroy_workingtree_metadata(self):
1539
        """See BzrDir.destroy_workingtree_metadata."""
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1540
        raise errors.UnsupportedOperation(self.destroy_workingtree_metadata,
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1541
                                          self)
1542
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1543
    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.
1544
        """See BzrDir.get_branch_transport()."""
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1545
        if name is not None:
1546
            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.
1547
        if branch_format is None:
1548
            return self.transport
1549
        try:
1550
            branch_format.get_format_string()
1551
        except NotImplementedError:
1552
            return self.transport
1553
        raise errors.IncompatibleFormat(branch_format, self._format)
1554
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1555
    def get_repository_transport(self, repository_format):
1556
        """See BzrDir.get_repository_transport()."""
1557
        if repository_format is None:
1558
            return self.transport
1559
        try:
1560
            repository_format.get_format_string()
1561
        except NotImplementedError:
1562
            return self.transport
1563
        raise errors.IncompatibleFormat(repository_format, self._format)
1564
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
1565
    def get_workingtree_transport(self, workingtree_format):
1566
        """See BzrDir.get_workingtree_transport()."""
1567
        if workingtree_format is None:
1568
            return self.transport
1569
        try:
1570
            workingtree_format.get_format_string()
1571
        except NotImplementedError:
1572
            return self.transport
1573
        raise errors.IncompatibleFormat(workingtree_format, self._format)
1574
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.
1575
    def needs_format_conversion(self, format=None):
1576
        """See BzrDir.needs_format_conversion()."""
1577
        # if the format is not the same as the system default,
1578
        # an upgrade is needed.
1579
        if format is None:
3943.2.5 by Martin Pool
deprecate needs_format_conversion(format=None)
1580
            symbol_versioning.warn(symbol_versioning.deprecated_in((1, 13, 0))
1581
                % '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.
1582
            format = BzrDirFormat.get_default_format()
1583
        return not isinstance(self._format, format.__class__)
1584
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
1585
    def open_branch(self, name=None, unsupported=False,
1586
                    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)
1587
        """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.
1588
        from bzrlib.branch import BzrBranchFormat4
1589
        format = BzrBranchFormat4()
1590
        self._check_supported(format, unsupported)
5051.3.13 by Jelmer Vernooij
Pass colocated branch name around rather than raising an exception directly.
1591
        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.
1592
2485.8.56 by Vincent Ladeuil
Fix bug #112173 and bzr branch multiple connections.
1593
    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
1594
               possible_transports=None, accelerator_tree=None,
4054.3.1 by Martin Pool
BzrDirPreSplitOut.sprout should accept source_branch parameter
1595
               hardlink=False, stacked=False, create_tree_if_local=True,
1596
               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.
1597
        """See BzrDir.sprout()."""
4054.3.1 by Martin Pool
BzrDirPreSplitOut.sprout should accept source_branch parameter
1598
        if source_branch is not None:
1599
            my_branch = self.open_branch()
1600
            if source_branch.base != my_branch.base:
1601
                raise AssertionError(
1602
                    "source branch %r is not within %r with branch %r" %
1603
                    (source_branch, self, my_branch))
3221.18.4 by Ian Clatworthy
shallow -> stacked
1604
        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.
1605
            raise errors.UnstackableBranchFormat(
1606
                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.
1607
        if not create_tree_if_local:
1608
            raise errors.MustHaveWorkingTree(
1609
                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.
1610
        from bzrlib.workingtree import WorkingTreeFormat2
1611
        self._make_tail(url)
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1612
        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.
1613
        try:
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
1614
            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.
1615
        except errors.NoRepositoryPresent:
1616
            pass
1617
        try:
1618
            self.open_branch().sprout(result, revision_id=revision_id)
1619
        except errors.NotBranchError:
1620
            pass
3983.1.4 by Daniel Watkins
Added 'no_tree' parameter to BzrDirPreSplitOut.
1621
3983.1.7 by Daniel Watkins
Review comments from jam.
1622
        # we always want a working tree
1623
        WorkingTreeFormat2().initialize(result,
1624
                                        accelerator_tree=accelerator_tree,
1625
                                        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.
1626
        return result
1627
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1628
1629
class BzrDir4(BzrDirPreSplitOut):
1508.1.25 by Robert Collins
Update per review comments.
1630
    """A .bzr version 4 control object.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1631
1508.1.25 by Robert Collins
Update per review comments.
1632
    This is a deprecated format and may be removed after sept 2006.
1633
    """
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1634
1534.6.1 by Robert Collins
allow API creation of shared repositories
1635
    def create_repository(self, shared=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1636
        """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.
1637
        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.
1638
1534.5.16 by Robert Collins
Review feedback.
1639
    def needs_format_conversion(self, format=None):
1640
        """Format 4 dirs are always in need of conversion."""
3943.2.5 by Martin Pool
deprecate needs_format_conversion(format=None)
1641
        if format is None:
1642
            symbol_versioning.warn(symbol_versioning.deprecated_in((1, 13, 0))
1643
                % 'needs_format_conversion(format=None)')
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1644
        return True
1645
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1646
    def open_repository(self):
1647
        """See BzrDir.open_repository."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1648
        from bzrlib.repofmt.weaverepo import RepositoryFormat4
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1649
        return RepositoryFormat4().open(self, _found=True)
1650
1651
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1652
class BzrDir5(BzrDirPreSplitOut):
1508.1.25 by Robert Collins
Update per review comments.
1653
    """A .bzr version 5 control object.
1654
1655
    This is a deprecated format and may be removed after sept 2006.
1656
    """
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1657
4634.47.9 by Andrew Bennetts
has_workingtree is always true for BzrDirFormat5 and BzrDirFormat6.
1658
    def has_workingtree(self):
1659
        """See BzrDir.has_workingtree."""
1660
        return True
1661
    
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1662
    def open_repository(self):
1663
        """See BzrDir.open_repository."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1664
        from bzrlib.repofmt.weaverepo import RepositoryFormat5
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1665
        return RepositoryFormat5().open(self, _found=True)
1666
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1667
    def open_workingtree(self, _unsupported=False,
1668
            recommend_upgrade=True):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1669
        """See BzrDir.create_workingtree."""
1670
        from bzrlib.workingtree import WorkingTreeFormat2
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1671
        wt_format = WorkingTreeFormat2()
1672
        # we don't warn here about upgrades; that ought to be handled for the
1673
        # bzrdir as a whole
1674
        return wt_format.open(self, _found=True)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1675
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1676
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1677
class BzrDir6(BzrDirPreSplitOut):
1508.1.25 by Robert Collins
Update per review comments.
1678
    """A .bzr version 6 control object.
1679
1680
    This is a deprecated format and may be removed after sept 2006.
1681
    """
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1682
4634.47.9 by Andrew Bennetts
has_workingtree is always true for BzrDirFormat5 and BzrDirFormat6.
1683
    def has_workingtree(self):
1684
        """See BzrDir.has_workingtree."""
1685
        return True
1686
    
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1687
    def open_repository(self):
1688
        """See BzrDir.open_repository."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1689
        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.
1690
        return RepositoryFormat6().open(self, _found=True)
1691
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1692
    def open_workingtree(self, _unsupported=False,
1693
        recommend_upgrade=True):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1694
        """See BzrDir.create_workingtree."""
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1695
        # we don't warn here about upgrades; that ought to be handled for the
1696
        # 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.
1697
        from bzrlib.workingtree import WorkingTreeFormat2
1698
        return WorkingTreeFormat2().open(self, _found=True)
1699
1700
1701
class BzrDirMeta1(BzrDir):
1702
    """A .bzr meta version 1 control object.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1703
1704
    This is the first control object where the
1553.5.67 by Martin Pool
doc
1705
    individual aspects are really split out: there are separate repository,
1706
    workingtree and branch subdirectories and any subset of the three can be
1707
    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.
1708
    """
1709
1534.5.16 by Robert Collins
Review feedback.
1710
    def can_convert_format(self):
1711
        """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.
1712
        return True
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1713
5051.3.2 by Jelmer Vernooij
Add name argument to BzrDir.create_branch().
1714
    def create_branch(self, name=None):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1715
        """See BzrDir.create_branch."""
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1716
        return self._format.get_branch_format().initialize(self, name=name)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1717
5051.3.1 by Jelmer Vernooij
Add optional name argument to BzrDir.destroy_branch.
1718
    def destroy_branch(self, name=None):
2796.2.6 by Aaron Bentley
Implement destroy_branch
1719
        """See BzrDir.create_branch."""
5051.3.1 by Jelmer Vernooij
Add optional name argument to BzrDir.destroy_branch.
1720
        if name is not None:
1721
            raise errors.NoColocatedBranchSupport(self)
2796.2.6 by Aaron Bentley
Implement destroy_branch
1722
        self.transport.delete_tree('branch')
1723
1534.6.1 by Robert Collins
allow API creation of shared repositories
1724
    def create_repository(self, shared=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1725
        """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.
1726
        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.
1727
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
1728
    def destroy_repository(self):
1729
        """See BzrDir.destroy_repository."""
1730
        self.transport.delete_tree('repository')
1731
3123.5.2 by Aaron Bentley
Allow checkout --files_from
1732
    def create_workingtree(self, revision_id=None, from_branch=None,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1733
                           accelerator_tree=None, hardlink=False):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1734
        """See BzrDir.create_workingtree."""
2955.5.3 by Vincent Ladeuil
Fix second unwanted connection by providing the right branch to create_checkout.
1735
        return self._format.workingtree_format.initialize(
3123.5.2 by Aaron Bentley
Allow checkout --files_from
1736
            self, revision_id, from_branch=from_branch,
3136.1.3 by Aaron Bentley
Implement hard-link support for branch and checkout
1737
            accelerator_tree=accelerator_tree, hardlink=hardlink)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1738
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1739
    def destroy_workingtree(self):
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
1740
        """See BzrDir.destroy_workingtree."""
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1741
        wt = self.open_workingtree(recommend_upgrade=False)
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1742
        repository = wt.branch.repository
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
1743
        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'
1744
        wt.revert(old_tree=empty)
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1745
        self.destroy_workingtree_metadata()
1746
1747
    def destroy_workingtree_metadata(self):
1748
        self.transport.delete_tree('checkout')
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
1749
5147.4.1 by Jelmer Vernooij
Pass branch names in more places.
1750
    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.
1751
        """Find the branch 'format' for this bzrdir.
1752
1753
        This might be a synthetic object for e.g. RemoteBranch and SVN.
1754
        """
1755
        from bzrlib.branch import BranchFormat
5147.4.3 by Jelmer Vernooij
Support branch name argument to BzrDir.get_branch_reference.
1756
        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.
1757
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1758
    def _get_mkdir_mode(self):
1759
        """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
1760
        temp_control = lockable_files.LockableFiles(self.transport, '',
1761
                                     lockable_files.TransportLock)
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1762
        return temp_control._dir_mode
1763
5147.4.3 by Jelmer Vernooij
Support branch name argument to BzrDir.get_branch_reference.
1764
    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.
1765
        """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)
1766
        from bzrlib.branch import BranchFormat
5147.4.3 by Jelmer Vernooij
Support branch name argument to BzrDir.get_branch_reference.
1767
        format = BranchFormat.find_format(self, name=name)
1768
        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.
1769
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1770
    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.
1771
        """See BzrDir.get_branch_transport()."""
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
1772
        if name is not None:
1773
            raise errors.NoColocatedBranchSupport(self)
4570.3.6 by Martin Pool
doc
1774
        # XXX: this shouldn't implicitly create the directory if it's just
1775
        # 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.
1776
        if branch_format is None:
1777
            return self.transport.clone('branch')
1778
        try:
1779
            branch_format.get_format_string()
1780
        except NotImplementedError:
1781
            raise errors.IncompatibleFormat(branch_format, self._format)
1782
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1783
            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.
1784
        except errors.FileExists:
1785
            pass
1786
        return self.transport.clone('branch')
1787
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1788
    def get_repository_transport(self, repository_format):
1789
        """See BzrDir.get_repository_transport()."""
1790
        if repository_format is None:
1791
            return self.transport.clone('repository')
1792
        try:
1793
            repository_format.get_format_string()
1794
        except NotImplementedError:
1795
            raise errors.IncompatibleFormat(repository_format, self._format)
1796
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1797
            self.transport.mkdir('repository', mode=self._get_mkdir_mode())
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1798
        except errors.FileExists:
1799
            pass
1800
        return self.transport.clone('repository')
1801
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
1802
    def get_workingtree_transport(self, workingtree_format):
1803
        """See BzrDir.get_workingtree_transport()."""
1804
        if workingtree_format is None:
1805
            return self.transport.clone('checkout')
1806
        try:
1807
            workingtree_format.get_format_string()
1808
        except NotImplementedError:
1809
            raise errors.IncompatibleFormat(workingtree_format, self._format)
1810
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1811
            self.transport.mkdir('checkout', mode=self._get_mkdir_mode())
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
1812
        except errors.FileExists:
1813
            pass
1814
        return self.transport.clone('checkout')
1815
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.
1816
    def has_workingtree(self):
1817
        """Tell if this bzrdir contains a working tree.
1818
1819
        This will still raise an exception if the bzrdir has a workingtree that
1820
        is remote & inaccessible.
1821
1822
        Note: if you're going to open the working tree, you should just go
1823
        ahead and try, and not ask permission first.
1824
        """
1825
        from bzrlib.workingtree import WorkingTreeFormat
1826
        try:
1827
            WorkingTreeFormat.find_format(self)
1828
        except errors.NoWorkingTree:
1829
            return False
1830
        return True
1831
1534.5.16 by Robert Collins
Review feedback.
1832
    def needs_format_conversion(self, format=None):
1833
        """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.
1834
        if format is None:
3943.2.5 by Martin Pool
deprecate needs_format_conversion(format=None)
1835
            symbol_versioning.warn(symbol_versioning.deprecated_in((1, 13, 0))
1836
                % 'needs_format_conversion(format=None)')
1837
        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.
1838
            format = BzrDirFormat.get_default_format()
1839
        if not isinstance(self._format, format.__class__):
1840
            # it is not a meta dir format, conversion is needed.
1841
            return True
1842
        # we might want to push this down to the repository?
1843
        try:
1844
            if not isinstance(self.open_repository()._format,
1845
                              format.repository_format.__class__):
1846
                # the repository needs an upgrade.
1847
                return True
1848
        except errors.NoRepositoryPresent:
1849
            pass
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
1850
        for branch in self.list_branches():
1851
            if not isinstance(branch._format,
2230.3.55 by Aaron Bentley
Updates from review
1852
                              format.get_branch_format().__class__):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1853
                # the branch needs an upgrade.
1854
                return True
1855
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1856
            my_wt = self.open_workingtree(recommend_upgrade=False)
1857
            if not isinstance(my_wt._format,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1858
                              format.workingtree_format.__class__):
1859
                # the workingtree needs an upgrade.
1860
                return True
2255.2.196 by Robert Collins
Fix test_upgrade defects related to non local or absent working trees.
1861
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1862
            pass
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1863
        return False
1864
5051.3.4 by Jelmer Vernooij
Support name to BzrDir.open_branch.
1865
    def open_branch(self, name=None, unsupported=False,
1866
                    ignore_fallbacks=False):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1867
        """See BzrDir.open_branch."""
5147.4.3 by Jelmer Vernooij
Support branch name argument to BzrDir.get_branch_reference.
1868
        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)
1869
        self._check_supported(format, unsupported)
5051.3.13 by Jelmer Vernooij
Pass colocated branch name around rather than raising an exception directly.
1870
        return format.open(self, name=name,
1871
            _found=True, ignore_fallbacks=ignore_fallbacks)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1872
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1873
    def open_repository(self, unsupported=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1874
        """See BzrDir.open_repository."""
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1875
        from bzrlib.repository import RepositoryFormat
1876
        format = RepositoryFormat.find_format(self)
1877
        self._check_supported(format, unsupported)
1878
        return format.open(self, _found=True)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1879
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1880
    def open_workingtree(self, unsupported=False,
1881
            recommend_upgrade=True):
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1882
        """See BzrDir.open_workingtree."""
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1883
        from bzrlib.workingtree import WorkingTreeFormat
1884
        format = WorkingTreeFormat.find_format(self)
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1885
        self._check_supported(format, unsupported,
1886
            recommend_upgrade,
2323.6.5 by Martin Pool
Recommended-upgrade message should give base dir not the control dir url
1887
            basedir=self.root_transport.base)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1888
        return format.open(self, _found=True)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1889
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
1890
    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.
1891
        return config.TransportConfig(self.transport, 'control.conf')
3242.1.1 by Aaron Bentley
Implement BzrDir configuration
1892
4294.2.4 by Robert Collins
Move dir, bzrdir and repo acquisition into a single method on bzrdir format.
1893
1534.4.39 by Robert Collins
Basic BzrDir support.
1894
class BzrDirFormat(object):
1895
    """An encapsulation of the initialization and open routines for a format.
1896
1897
    Formats provide three things:
1898
     * An initialization routine,
1899
     * a format string,
1900
     * an open routine.
1901
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1902
    Formats are placed in a dict by their format string for reference
1534.4.39 by Robert Collins
Basic BzrDir support.
1903
    during bzrdir opening. These should be subclasses of BzrDirFormat
1904
    for consistency.
1905
1906
    Once a format is deprecated, just deprecate the initialize and open
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1907
    methods on the format class. Do not deprecate the object, as the
1534.4.39 by Robert Collins
Basic BzrDir support.
1908
    object will be created every system load.
5075.1.1 by Jelmer Vernooij
Document that BzrDirFormat.colocated_branches is a cvar.
1909
1910
    :cvar colocated_branches: Whether this formats supports colocated branches.
1534.4.39 by Robert Collins
Basic BzrDir support.
1911
    """
1912
1913
    _default_format = None
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1914
    """The default format used for new .bzr dirs."""
1534.4.39 by Robert Collins
Basic BzrDir support.
1915
1916
    _formats = {}
1917
    """The known formats."""
1918
1733.1.7 by Jelmer Vernooij
Change set of control dir formats to list.
1919
    _control_formats = []
1733.1.6 by Jelmer Vernooij
Fix a couple of minor issues after review by Martin.
1920
    """The registered control formats - .bzr, ....
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1921
1733.1.7 by Jelmer Vernooij
Change set of control dir formats to list.
1922
    This is a list of BzrDirFormat objects.
1733.1.6 by Jelmer Vernooij
Fix a couple of minor issues after review by Martin.
1923
    """
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1924
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.
1925
    _control_server_formats = []
1926
    """The registered control server formats, e.g. RemoteBzrDirs.
1927
1928
    This is a list of BzrDirFormat objects.
1929
    """
1930
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1931
    _lock_file_name = 'branch-lock'
1932
5051.3.3 by Jelmer Vernooij
Add tests for colo branches.
1933
    colocated_branches = False
1934
    """Whether co-located branches are supported for this control dir format.
1935
    """
1936
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1937
    # _lock_class must be set in subclasses to the lock type, typ.
1938
    # TransportLock or LockDir
1939
1534.4.39 by Robert Collins
Basic BzrDir support.
1940
    @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.
1941
    def find_format(klass, transport, _server_formats=True):
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1942
        """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.
1943
        if _server_formats:
1944
            formats = klass._control_server_formats + klass._control_formats
1945
        else:
1946
            formats = klass._control_formats
1947
        for format in formats:
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1948
            try:
1949
                return format.probe_transport(transport)
1950
            except errors.NotBranchError:
1951
                # this format does not find a control dir here.
1952
                pass
1953
        raise errors.NotBranchError(path=transport.base)
1954
1955
    @classmethod
1956
    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.
1957
        """Return the .bzrdir style format present in a directory."""
1534.4.39 by Robert Collins
Basic BzrDir support.
1958
        try:
4708.2.1 by Martin
Ensure all files opened by bazaar proper are explicitly closed
1959
            format_string = transport.get_bytes(".bzr/branch-format")
5215.3.3 by Marius Kruger
remove inappropriate catches
1960
        except errors.NoSuchFile:
1733.2.3 by Michael Ellerman
Don't coallesce try blocks, it can lead to confusing exceptions.
1961
            raise errors.NotBranchError(path=transport.base)
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):
4708.2.2 by Martin
Workingtree changes sitting around since November, more explict closing of files in bzrlib
2876
        f = self.branch.repository.inventory_store.get(rev_id)
2877
        try:
2878
            old_inv_xml = f.read()
2879
        finally:
2880
            f.close()
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
2881
        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
2882
        inv.revision_id = rev_id
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2883
        rev = self.revisions[rev_id]
2884
        return inv
2885
2886
    def _load_updated_inventory(self, rev_id):
2887
        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.
2888
        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.
2889
        return inv
2890
2891
    def _convert_one_rev(self, rev_id):
2892
        """Convert revision and all referenced objects to new format."""
2893
        rev = self.revisions[rev_id]
2894
        inv = self._load_old_inventory(rev_id)
2895
        present_parents = [p for p in rev.parent_ids
2896
                           if p not in self.absent_revisions]
2897
        self._convert_revision_contents(rev, inv, present_parents)
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2898
        self._store_new_inv(rev, inv, present_parents)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2899
        self.converted_revs.add(rev_id)
2900
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2901
    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.
2902
        new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2903
        new_inv_sha1 = sha_string(new_inv_xml)
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2904
        self.inv_weave.add_lines(rev.revision_id,
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
2905
                                 present_parents,
2906
                                 new_inv_xml.splitlines(True))
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2907
        rev.inventory_sha1 = new_inv_sha1
2908
2909
    def _convert_revision_contents(self, rev, inv, present_parents):
2910
        """Convert all the files within a revision.
2911
2912
        Also upgrade the inventory to refer to the text revision ids."""
2913
        rev_id = rev.revision_id
2914
        mutter('converting texts of revision {%s}',
2915
               rev_id)
2916
        parent_invs = map(self._load_updated_inventory, present_parents)
1731.1.62 by Aaron Bentley
Changes from review comments
2917
        entries = inv.iter_entries()
2918
        entries.next()
2919
        for path, ie in entries:
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2920
            self._convert_file_version(rev, ie, parent_invs)
2921
2922
    def _convert_file_version(self, rev, ie, parent_invs):
2923
        """Convert one version of one file.
2924
2925
        The file needs to be added into the weave if it is a merge
2926
        of >=2 parents or if it's changed from its parent.
2927
        """
2928
        file_id = ie.file_id
2929
        rev_id = rev.revision_id
2930
        w = self.text_weaves.get(file_id)
2931
        if w is None:
2932
            w = Weave(file_id)
2933
            self.text_weaves[file_id] = w
2934
        text_changed = False
2776.1.5 by Robert Collins
Add reasonably comprehensive tests for path last modified and per file graph behaviour.
2935
        parent_candiate_entries = ie.parent_candidates(parent_invs)
2936
        heads = graph.Graph(self).heads(parent_candiate_entries.keys())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2937
        # 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.
2938
        # the previous code was also unordered.
2939
        previous_entries = dict((head, parent_candiate_entries[head]) for head
2940
            in heads)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2941
        self.snapshot_ie(previous_entries, ie, w, rev_id)
2942
        del ie.text_id
2943
3099.3.7 by John Arbash Meinel
Another parent provider I didn't realize existed.
2944
    def get_parent_map(self, revision_ids):
4379.3.3 by Gary van der Merwe
Rename and add doc string for StackedParentsProvider.
2945
        """See graph.StackedParentsProvider.get_parent_map"""
3099.3.7 by John Arbash Meinel
Another parent provider I didn't realize existed.
2946
        return dict((revision_id, self.revisions[revision_id])
2947
                    for revision_id in revision_ids
2948
                     if revision_id in self.revisions)
2949
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2950
    def snapshot_ie(self, previous_revisions, ie, w, rev_id):
2951
        # TODO: convert this logic, which is ~= snapshot to
2952
        # a call to:. This needs the path figured out. rather than a work_tree
2953
        # a v4 revision_tree can be given, or something that looks enough like
2954
        # 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
2955
        # 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.
2956
        # save against.
2957
        #ie.snapshot(rev, PATH, previous_revisions, REVISION_TREE, InMemoryWeaveStore(self.text_weaves))
2958
        if len(previous_revisions) == 1:
2959
            previous_ie = previous_revisions.values()[0]
2960
            if ie._unchanged(previous_ie):
2961
                ie.revision = previous_ie.revision
2962
                return
2963
        if ie.has_text():
4708.2.2 by Martin
Workingtree changes sitting around since November, more explict closing of files in bzrlib
2964
            f = self.branch.repository._text_store.get(ie.text_id)
2965
            try:
2966
                file_lines = f.readlines()
2967
            finally:
2968
                f.close()
1563.2.18 by Robert Collins
get knit repositories really using knits for text storage.
2969
            w.add_lines(rev_id, previous_revisions, file_lines)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2970
            self.text_count += 1
2971
        else:
1563.2.18 by Robert Collins
get knit repositories really using knits for text storage.
2972
            w.add_lines(rev_id, previous_revisions, [])
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2973
        ie.revision = rev_id
2974
2975
    def _make_order(self):
2976
        """Return a suitable order for importing revisions.
2977
2978
        The order must be such that an revision is imported after all
2979
        its (present) parents.
2980
        """
2981
        todo = set(self.revisions.keys())
2982
        done = self.absent_revisions.copy()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2983
        order = []
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2984
        while todo:
2985
            # scan through looking for a revision whose parents
2986
            # are all done
2987
            for rev_id in sorted(list(todo)):
2988
                rev = self.revisions[rev_id]
2989
                parent_ids = set(rev.parent_ids)
2990
                if parent_ids.issubset(done):
2991
                    # can take this one now
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2992
                    order.append(rev_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2993
                    todo.remove(rev_id)
2994
                    done.add(rev_id)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2995
        return order
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2996
2997
2998
class ConvertBzrDir5To6(Converter):
2999
    """Converts format 5 bzr dirs to format 6."""
3000
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
3001
    def convert(self, to_convert, pb):
3002
        """See Converter.convert()."""
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3003
        self.bzrdir = to_convert
4961.2.18 by Martin Pool
Remove more pb-passing
3004
        pb = ui.ui_factory.nested_progress_bar()
4961.2.14 by Martin Pool
Further pb cleanups
3005
        try:
3006
            ui.ui_factory.note('starting upgrade from format 5 to 6')
3007
            self._convert_to_prefixed()
5158.6.9 by Martin Pool
Simplify various code to use user_url
3008
            return BzrDir.open(self.bzrdir.user_url)
4961.2.14 by Martin Pool
Further pb cleanups
3009
        finally:
3010
            pb.finished()
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3011
3012
    def _convert_to_prefixed(self):
1608.2.1 by Martin Pool
[merge] Storage filename escaping
3013
        from bzrlib.store import TransportStore
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3014
        self.bzrdir.transport.delete('branch-format')
3015
        for store_name in ["weaves", "revision-store"]:
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
3016
            ui.ui_factory.note("adding prefixes to %s" % store_name)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3017
            store_transport = self.bzrdir.transport.clone(store_name)
1608.2.1 by Martin Pool
[merge] Storage filename escaping
3018
            store = TransportStore(store_transport, prefixed=True)
1608.1.1 by Martin Pool
[patch] LocalTransport.list_dir should return url-quoted strings (ddaa)
3019
            for urlfilename in store_transport.list_dir('.'):
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
3020
                filename = urlutils.unescape(urlfilename)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3021
                if (filename.endswith(".weave") or
3022
                    filename.endswith(".gz") or
3023
                    filename.endswith(".sig")):
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
3024
                    file_id, suffix = os.path.splitext(filename)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3025
                else:
3026
                    file_id = filename
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
3027
                    suffix = ''
3028
                new_name = store._mapper.map((file_id,)) + suffix
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3029
                # FIXME keep track of the dirs made RBC 20060121
3030
                try:
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
3031
                    store_transport.move(filename, new_name)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3032
                except errors.NoSuchFile: # catches missing dirs strangely enough
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
3033
                    store_transport.mkdir(osutils.dirname(new_name))
3034
                    store_transport.move(filename, new_name)
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
3035
        self.bzrdir.transport.put_bytes(
3036
            'branch-format',
3037
            BzrDirFormat6().get_format_string(),
3407.2.18 by Martin Pool
BzrDir takes responsibility for default file/dir modes
3038
            mode=self.bzrdir._get_file_mode())
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
3039
3040
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
3041
class ConvertBzrDir6ToMeta(Converter):
3042
    """Converts format 6 bzr dirs to metadirs."""
3043
3044
    def convert(self, to_convert, pb):
3045
        """See Converter.convert()."""
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
3046
        from bzrlib.repofmt.weaverepo import RepositoryFormat7
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
3047
        from bzrlib.branch import BzrBranchFormat5
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
3048
        self.bzrdir = to_convert
4961.2.14 by Martin Pool
Further pb cleanups
3049
        self.pb = ui.ui_factory.nested_progress_bar()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3050
        self.count = 0
3051
        self.total = 20 # the steps we know about
3052
        self.garbage_inventories = []
3407.2.18 by Martin Pool
BzrDir takes responsibility for default file/dir modes
3053
        self.dir_mode = self.bzrdir._get_dir_mode()
3054
        self.file_mode = self.bzrdir._get_file_mode()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3055
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
3056
        ui.ui_factory.note('starting upgrade from format 6 to metadir')
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
3057
        self.bzrdir.transport.put_bytes(
3058
                'branch-format',
3059
                "Converting to format 6",
3060
                mode=self.file_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3061
        # its faster to move specific files around than to open and use the apis...
3062
        # first off, nuke ancestry.weave, it was never used.
3063
        try:
3064
            self.step('Removing ancestry.weave')
3065
            self.bzrdir.transport.delete('ancestry.weave')
3066
        except errors.NoSuchFile:
3067
            pass
3068
        # find out whats there
3069
        self.step('Finding branch files')
1666.1.3 by Robert Collins
Fix and test upgrades from bzrdir 6 over SFTP.
3070
        last_revision = self.bzrdir.open_branch().last_revision()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3071
        bzrcontents = self.bzrdir.transport.list_dir('.')
3072
        for name in bzrcontents:
3073
            if name.startswith('basis-inventory.'):
3074
                self.garbage_inventories.append(name)
3075
        # create new directories for repository, working tree and branch
3076
        repository_names = [('inventory.weave', True),
3077
                            ('revision-store', True),
3078
                            ('weaves', True)]
3079
        self.step('Upgrading repository  ')
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
3080
        self.bzrdir.transport.mkdir('repository', mode=self.dir_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3081
        self.make_lock('repository')
3082
        # we hard code the formats here because we are converting into
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3083
        # the meta format. The meta format upgrader can take this to a
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3084
        # future format within each component.
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
3085
        self.put_format('repository', RepositoryFormat7())
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3086
        for entry in repository_names:
3087
            self.move_entry('repository', entry)
3088
3089
        self.step('Upgrading branch      ')
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
3090
        self.bzrdir.transport.mkdir('branch', mode=self.dir_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3091
        self.make_lock('branch')
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
3092
        self.put_format('branch', BzrBranchFormat5())
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3093
        branch_files = [('revision-history', True),
3094
                        ('branch-name', True),
3095
                        ('parent', False)]
3096
        for entry in branch_files:
3097
            self.move_entry('branch', entry)
3098
3099
        checkout_files = [('pending-merges', True),
3100
                          ('inventory', True),
3101
                          ('stat-cache', False)]
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
3102
        # If a mandatory checkout file is not present, the branch does not have
3103
        # a functional checkout. Do not create a checkout in the converted
3104
        # branch.
3105
        for name, mandatory in checkout_files:
3106
            if mandatory and name not in bzrcontents:
3107
                has_checkout = False
3108
                break
3109
        else:
3110
            has_checkout = True
3111
        if not has_checkout:
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
3112
            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
3113
            # If some checkout files are there, we may as well get rid of them.
3114
            for name, mandatory in checkout_files:
3115
                if name in bzrcontents:
3116
                    self.bzrdir.transport.delete(name)
3117
        else:
2123.2.1 by John Arbash Meinel
Fix bug #70716, make bzrlib.bzrdir directly import bzrlib.workingtree
3118
            from bzrlib.workingtree import WorkingTreeFormat3
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
3119
            self.step('Upgrading working tree')
3120
            self.bzrdir.transport.mkdir('checkout', mode=self.dir_mode)
3121
            self.make_lock('checkout')
3122
            self.put_format(
2123.2.1 by John Arbash Meinel
Fix bug #70716, make bzrlib.bzrdir directly import bzrlib.workingtree
3123
                'checkout', WorkingTreeFormat3())
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
3124
            self.bzrdir.transport.delete_multi(
3125
                self.garbage_inventories, self.pb)
3126
            for entry in checkout_files:
3127
                self.move_entry('checkout', entry)
3128
            if last_revision is not None:
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
3129
                self.bzrdir.transport.put_bytes(
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
3130
                    'checkout/last-revision', last_revision)
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
3131
        self.bzrdir.transport.put_bytes(
3132
            'branch-format',
3133
            BzrDirMetaFormat1().get_format_string(),
3134
            mode=self.file_mode)
4961.2.14 by Martin Pool
Further pb cleanups
3135
        self.pb.finished()
5158.6.9 by Martin Pool
Simplify various code to use user_url
3136
        return BzrDir.open(self.bzrdir.user_url)
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
3137
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3138
    def make_lock(self, name):
3139
        """Make a lock for the new control dir name."""
3140
        self.step('Make %s lock' % name)
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
3141
        ld = lockdir.LockDir(self.bzrdir.transport,
3142
                             '%s/lock' % name,
3143
                             file_modebits=self.file_mode,
3144
                             dir_modebits=self.dir_mode)
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
3145
        ld.create()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3146
3147
    def move_entry(self, new_dir, entry):
3148
        """Move then entry name into new_dir."""
3149
        name = entry[0]
3150
        mandatory = entry[1]
3151
        self.step('Moving %s' % name)
3152
        try:
3153
            self.bzrdir.transport.move(name, '%s/%s' % (new_dir, name))
3154
        except errors.NoSuchFile:
3155
            if mandatory:
3156
                raise
3157
3158
    def put_format(self, dirname, format):
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
3159
        self.bzrdir.transport.put_bytes('%s/format' % dirname,
3160
            format.get_format_string(),
3161
            self.file_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
3162
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.
3163
3164
class ConvertMetaToMeta(Converter):
3165
    """Converts the components of metadirs."""
3166
3167
    def __init__(self, target_format):
3168
        """Create a metadir to metadir converter.
3169
3170
        :param target_format: The final metadir format that is desired.
3171
        """
3172
        self.target_format = target_format
3173
3174
    def convert(self, to_convert, pb):
3175
        """See Converter.convert()."""
3176
        self.bzrdir = to_convert
4961.2.14 by Martin Pool
Further pb cleanups
3177
        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.
3178
        self.count = 0
3179
        self.total = 1
3180
        self.step('checking repository format')
3181
        try:
3182
            repo = self.bzrdir.open_repository()
3183
        except errors.NoRepositoryPresent:
3184
            pass
3185
        else:
3186
            if not isinstance(repo._format, self.target_format.repository_format.__class__):
3187
                from bzrlib.repository import CopyConverter
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
3188
                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.
3189
                converter = CopyConverter(self.target_format.repository_format)
3190
                converter.convert(repo, pb)
4997.1.3 by Jelmer Vernooij
Use list_branches during upgrades.
3191
        for branch in self.bzrdir.list_branches():
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3192
            # TODO: conversions of Branch and Tree should be done by
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3193
            # InterXFormat lookups/some sort of registry.
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
3194
            # Avoid circular imports
3195
            from bzrlib import branch as _mod_branch
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3196
            old = branch._format.__class__
3197
            new = self.target_format.get_branch_format().__class__
3198
            while old != new:
3199
                if (old == _mod_branch.BzrBranchFormat5 and
3200
                    new in (_mod_branch.BzrBranchFormat6,
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
3201
                        _mod_branch.BzrBranchFormat7,
3202
                        _mod_branch.BzrBranchFormat8)):
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3203
                    branch_converter = _mod_branch.Converter5to6()
3204
                elif (old == _mod_branch.BzrBranchFormat6 and
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
3205
                    new in (_mod_branch.BzrBranchFormat7,
3206
                            _mod_branch.BzrBranchFormat8)):
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3207
                    branch_converter = _mod_branch.Converter6to7()
4273.1.13 by Aaron Bentley
Implement upgrade from branch format 7 to 8.
3208
                elif (old == _mod_branch.BzrBranchFormat7 and
3209
                      new is _mod_branch.BzrBranchFormat8):
3210
                    branch_converter = _mod_branch.Converter7to8()
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3211
                else:
4608.1.3 by Martin Pool
BadConversionTarget error includes source format
3212
                    raise errors.BadConversionTarget("No converter", new,
3213
                        branch._format)
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
3214
                branch_converter.convert(branch)
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
3215
                branch = self.bzrdir.open_branch()
3216
                old = branch._format.__class__
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3217
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
3218
            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.
3219
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3220
            pass
3221
        else:
3222
            # TODO: conversions of Branch and Tree should be done by
3223
            # InterXFormat lookups
3224
            if (isinstance(tree, workingtree.WorkingTree3) and
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
3225
                not isinstance(tree, workingtree_4.DirStateWorkingTree) and
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3226
                isinstance(self.target_format.workingtree_format,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
3227
                    workingtree_4.DirStateWorkingTreeFormat)):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3228
                workingtree_4.Converter3to4().convert(tree)
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
3229
            if (isinstance(tree, workingtree_4.DirStateWorkingTree) and
3230
                not isinstance(tree, workingtree_4.WorkingTree5) and
3586.1.8 by Ian Clatworthy
add workingtree_5 and initial upgrade code
3231
                isinstance(self.target_format.workingtree_format,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
3232
                    workingtree_4.WorkingTreeFormat5)):
3233
                workingtree_4.Converter4to5().convert(tree)
4210.4.2 by Ian Clatworthy
split filtered views support out into WorkingTreeFormat6
3234
            if (isinstance(tree, workingtree_4.DirStateWorkingTree) and
3235
                not isinstance(tree, workingtree_4.WorkingTree6) and
3236
                isinstance(self.target_format.workingtree_format,
3237
                    workingtree_4.WorkingTreeFormat6)):
3238
                workingtree_4.Converter4or5to6().convert(tree)
4961.2.14 by Martin Pool
Further pb cleanups
3239
        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.
3240
        return to_convert
1731.2.18 by Aaron Bentley
Get extract in repository under test
3241
3242
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3243
# This is not in remote.py because it's relatively small, and needs to be
3244
# registered. Putting it in remote.py creates a circular import problem.
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
3245
# we can make it a lazy object if the control formats is turned into something
3246
# like a registry.
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3247
class RemoteBzrDirFormat(BzrDirMetaFormat1):
3248
    """Format representing bzrdirs accessed via a smart server"""
3249
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
3250
    def __init__(self):
3251
        BzrDirMetaFormat1.__init__(self)
4934.4.3 by Martin Pool
Initializing a bzrdir shouldn't mutate the RemoteBzrDirFormat
3252
        # XXX: It's a bit ugly that the network name is here, because we'd
3253
        # like to believe that format objects are stateless or at least
3254
        # immutable,  However, we do at least avoid mutating the name after
5243.1.2 by Martin
Point launchpad links in comments at production server rather than edge
3255
        # it's returned.  See <https://bugs.launchpad.net/bzr/+bug/504102>
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
3256
        self._network_name = None
3257
4934.3.2 by Martin Pool
Add RemoteBzrDirFormat repr
3258
    def __repr__(self):
3259
        return "%s(_network_name=%r)" % (self.__class__.__name__,
3260
            self._network_name)
3261
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3262
    def get_format_description(self):
4792.1.1 by Andrew Bennetts
Show real branch/repo format description in 'info -v' over HPSS.
3263
        if self._network_name:
3264
            real_format = network_format_registry.get(self._network_name)
4792.3.1 by Matt Nordhoff
Fix missing space in the description for remote bzrdirs
3265
            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).
3266
        return 'bzr remote bzrdir'
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3267
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
3268
    def get_format_string(self):
3269
        raise NotImplementedError(self.get_format_string)
4032.3.6 by Robert Collins
Fix test_source errors.
3270
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
3271
    def network_name(self):
3272
        if self._network_name:
3273
            return self._network_name
3274
        else:
3275
            raise AssertionError("No network name set.")
3276
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
3277
    @classmethod
3278
    def probe_transport(klass, transport):
3279
        """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).
3280
        try:
3241.1.4 by Andrew Bennetts
Use get_smart_medium as suggested by Robert, and deal with the fallout.
3281
            medium = transport.get_smart_medium()
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3282
        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).
3283
                errors.TransportNotPossible, errors.NoSmartMedium,
3284
                errors.SmartProtocolError):
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
3285
            # no smart server, so not a branch for this format type.
3286
            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).
3287
        else:
3241.1.2 by Andrew Bennetts
Tidy comments.
3288
            # 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).
3289
            # 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).
3290
            if medium.should_probe():
3291
                try:
3292
                    server_version = medium.protocol_version()
3293
                except errors.SmartProtocolError:
3294
                    # Apparently there's no usable smart server there, even though
3295
                    # the medium supports the smart protocol.
3296
                    raise errors.NotBranchError(path=transport.base)
3297
                if server_version != '2':
3298
                    raise errors.NotBranchError(path=transport.base)
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
3299
            return klass()
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3300
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
3301
    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.
3302
        try:
3303
            # 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.
3304
            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.
3305
        except errors.NoSmartMedium:
3306
            # TODO: lookup the local format from a server hint.
3307
            local_dir_format = BzrDirMetaFormat1()
3308
            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.
3309
        client = _SmartClient(client_medium)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
3310
        path = client.remote_path_from_transport(transport)
4384.1.1 by Andrew Bennetts
Translate ErrorFromSmartServer in RemoteBzrDirFormat.
3311
        try:
3312
            response = client.call('BzrDirFormat.initialize', path)
3313
        except errors.ErrorFromSmartServer, err:
3314
            remote._translate_error(err, path=path)
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
3315
        if response[0] != 'ok':
3316
            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.
3317
        format = RemoteBzrDirFormat()
3318
        self._supply_sub_formats_to(format)
3319
        return remote.RemoteBzrDir(transport, format)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
3320
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3321
    def parse_NoneTrueFalse(self, arg):
3322
        if not arg:
3323
            return None
3324
        if arg == 'False':
3325
            return False
3326
        if arg == 'True':
3327
            return True
3328
        raise AssertionError("invalid arg %r" % arg)
3329
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3330
    def _serialize_NoneTrueFalse(self, arg):
3331
        if arg is False:
3332
            return 'False'
3333
        if arg:
3334
            return 'True'
3335
        return ''
3336
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3337
    def _serialize_NoneString(self, arg):
3338
        return arg or ''
3339
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3340
    def initialize_on_transport_ex(self, transport, use_existing_dir=False,
3341
        create_prefix=False, force_new_repo=False, stacked_on=None,
3342
        stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
3343
        shared_repo=False):
3344
        try:
3345
            # hand off the request to the smart server
3346
            client_medium = transport.get_smart_medium()
3347
        except errors.NoSmartMedium:
4294.2.9 by Robert Collins
Fixup tests broken by cleaning up the layering.
3348
            do_vfs = True
3349
        else:
3350
            # Decline to open it if the server doesn't support our required
3351
            # version (3) so that the VFS-based transport will do it.
3352
            if client_medium.should_probe():
3353
                try:
3354
                    server_version = client_medium.protocol_version()
3355
                    if server_version != '2':
3356
                        do_vfs = True
3357
                    else:
3358
                        do_vfs = False
3359
                except errors.SmartProtocolError:
3360
                    # Apparently there's no usable smart server there, even though
3361
                    # the medium supports the smart protocol.
3362
                    do_vfs = True
3363
            else:
3364
                do_vfs = False
3365
        if not do_vfs:
3366
            client = _SmartClient(client_medium)
3367
            path = client.remote_path_from_transport(transport)
4436.1.1 by Andrew Bennetts
Rename BzrDirFormat.initialize_ex verb to BzrDirFormat.initialize_ex_1.16.
3368
            if client_medium._is_remote_before((1, 16)):
4294.2.9 by Robert Collins
Fixup tests broken by cleaning up the layering.
3369
                do_vfs = True
3370
        if do_vfs:
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3371
            # TODO: lookup the local format from a server hint.
3372
            local_dir_format = BzrDirMetaFormat1()
3373
            self._supply_sub_formats_to(local_dir_format)
3374
            return local_dir_format.initialize_on_transport_ex(transport,
3375
                use_existing_dir=use_existing_dir, create_prefix=create_prefix,
3376
                force_new_repo=force_new_repo, stacked_on=stacked_on,
3377
                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.
3378
                make_working_trees=make_working_trees, shared_repo=shared_repo,
3379
                vfs_only=True)
4384.1.1 by Andrew Bennetts
Translate ErrorFromSmartServer in RemoteBzrDirFormat.
3380
        return self._initialize_on_transport_ex_rpc(client, path, transport,
3381
            use_existing_dir, create_prefix, force_new_repo, stacked_on,
3382
            stack_on_pwd, repo_format_name, make_working_trees, shared_repo)
3383
3384
    def _initialize_on_transport_ex_rpc(self, client, path, transport,
3385
        use_existing_dir, create_prefix, force_new_repo, stacked_on,
3386
        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.
3387
        args = []
3388
        args.append(self._serialize_NoneTrueFalse(use_existing_dir))
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3389
        args.append(self._serialize_NoneTrueFalse(create_prefix))
3390
        args.append(self._serialize_NoneTrueFalse(force_new_repo))
3391
        args.append(self._serialize_NoneString(stacked_on))
3392
        # stack_on_pwd is often/usually our transport
3393
        if stack_on_pwd:
3394
            try:
3395
                stack_on_pwd = transport.relpath(stack_on_pwd)
3396
                if not stack_on_pwd:
3397
                    stack_on_pwd = '.'
3398
            except errors.PathNotChild:
3399
                pass
3400
        args.append(self._serialize_NoneString(stack_on_pwd))
3401
        args.append(self._serialize_NoneString(repo_format_name))
3402
        args.append(self._serialize_NoneTrueFalse(make_working_trees))
3403
        args.append(self._serialize_NoneTrueFalse(shared_repo))
4934.4.3 by Martin Pool
Initializing a bzrdir shouldn't mutate the RemoteBzrDirFormat
3404
        request_network_name = self._network_name or \
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3405
            BzrDirFormat.get_default_format().network_name()
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3406
        try:
4436.1.1 by Andrew Bennetts
Rename BzrDirFormat.initialize_ex verb to BzrDirFormat.initialize_ex_1.16.
3407
            response = client.call('BzrDirFormat.initialize_ex_1.16',
4934.4.3 by Martin Pool
Initializing a bzrdir shouldn't mutate the RemoteBzrDirFormat
3408
                request_network_name, path, *args)
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3409
        except errors.UnknownSmartMethod:
4436.1.1 by Andrew Bennetts
Rename BzrDirFormat.initialize_ex verb to BzrDirFormat.initialize_ex_1.16.
3410
            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.
3411
            local_dir_format = BzrDirMetaFormat1()
3412
            self._supply_sub_formats_to(local_dir_format)
3413
            return local_dir_format.initialize_on_transport_ex(transport,
3414
                use_existing_dir=use_existing_dir, create_prefix=create_prefix,
3415
                force_new_repo=force_new_repo, stacked_on=stacked_on,
3416
                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.
3417
                make_working_trees=make_working_trees, shared_repo=shared_repo,
3418
                vfs_only=True)
4384.1.1 by Andrew Bennetts
Translate ErrorFromSmartServer in RemoteBzrDirFormat.
3419
        except errors.ErrorFromSmartServer, err:
3420
            remote._translate_error(err, path=path)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3421
        repo_path = response[0]
3422
        bzrdir_name = response[6]
3423
        require_stacking = response[7]
3424
        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.
3425
        format = RemoteBzrDirFormat()
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3426
        format._network_name = bzrdir_name
4294.2.7 by Robert Collins
Start building up a BzrDir.initialize_ex verb for the smart server.
3427
        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.
3428
        bzrdir = remote.RemoteBzrDir(transport, format, _client=client)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3429
        if repo_path:
3430
            repo_format = remote.response_tuple_to_repo_format(response[1:])
3431
            if repo_path == '.':
3432
                repo_path = ''
3433
            if repo_path:
3434
                repo_bzrdir_format = RemoteBzrDirFormat()
3435
                repo_bzrdir_format._network_name = response[5]
3436
                repo_bzr = remote.RemoteBzrDir(transport.clone(repo_path),
3437
                    repo_bzrdir_format)
3438
            else:
3439
                repo_bzr = bzrdir
3440
            final_stack = response[8] or None
3441
            final_stack_pwd = response[9] or None
4416.3.8 by Jonathan Lange
This makes the unit test & one of the acceptance tests pass.
3442
            if final_stack_pwd:
4416.3.15 by Jonathan Lange
Use a URL joiner that works.
3443
                final_stack_pwd = urlutils.join(
3444
                    transport.base, final_stack_pwd)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3445
            remote_repo = remote.RemoteRepository(repo_bzr, repo_format)
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
3446
            if len(response) > 10:
3447
                # Updated server verb that locks remotely.
3448
                repo_lock_token = response[10] or None
3449
                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).
3450
                if repo_lock_token:
3451
                    remote_repo.dont_leave_lock_in_place()
4307.2.2 by Robert Collins
Lock repositories created by BzrDirFormat.initialize_on_transport_ex.
3452
            else:
4307.2.6 by Robert Collins
Handle repositories that mutex on writes (rather than transactions).
3453
                remote_repo.lock_write()
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3454
            policy = UseExistingRepository(remote_repo, final_stack,
3455
                final_stack_pwd, require_stacking)
3456
            policy.acquire_repository()
3457
        else:
3458
            remote_repo = None
3459
            policy = None
4466.1.1 by Andrew Bennetts
Quick fix 388908: set branch format on the result of initialize_ex before calling require_stacking.
3460
        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.
3461
        if require_stacking:
3462
            # The repo has already been created, but we need to make sure that
3463
            # we'll make a stackable branch.
3464
            bzrdir._format.require_stacking(_skip_repo=True)
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3465
        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.
3466
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3467
    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.
3468
        return remote.RemoteBzrDir(transport, self)
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3469
3470
    def __eq__(self, other):
3471
        if not isinstance(other, RemoteBzrDirFormat):
3472
            return False
3473
        return self.get_format_description() == other.get_format_description()
3474
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.
3475
    def __return_repository_format(self):
3476
        # Always return a RemoteRepositoryFormat object, but if a specific bzr
3477
        # repository format has been asked for, tell the RemoteRepositoryFormat
3478
        # 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.
3479
        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.
3480
        custom_format = getattr(self, '_repository_format', None)
3481
        if custom_format:
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
3482
            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.
3483
                return custom_format
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
3484
            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.
3485
                # We will use the custom format to create repositories over the
3486
                # wire; expose its details like rich_root_data for code to
3487
                # query
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
3488
                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.
3489
        return result
3490
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
3491
    def get_branch_format(self):
3492
        result = BzrDirMetaFormat1.get_branch_format(self)
3493
        if not isinstance(result, remote.RemoteBranchFormat):
3494
            new_result = remote.RemoteBranchFormat()
3495
            new_result._custom_format = result
3496
            # cache the result
3497
            self.set_branch_format(new_result)
3498
            result = new_result
3499
        return result
3500
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.
3501
    repository_format = property(__return_repository_format,
3502
        BzrDirMetaFormat1._set_repository_format) #.im_func)
3845.1.1 by John Arbash Meinel
Ensure that RepositoryFormat._matchingbzrdir.repository_format matches.
3503
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
3504
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
3505
BzrDirFormat.register_control_server_format(RemoteBzrDirFormat)
2018.5.45 by Andrew Bennetts
Merge from bzr.dev
3506
3507
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3508
class BzrDirFormatInfo(object):
3509
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3510
    def __init__(self, native, deprecated, hidden, experimental):
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3511
        self.deprecated = deprecated
3512
        self.native = native
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3513
        self.hidden = hidden
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3514
        self.experimental = experimental
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3515
3516
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3517
class BzrDirFormatRegistry(registry.Registry):
3518
    """Registry of user-selectable BzrDir subformats.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3519
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3520
    Differs from BzrDirFormat._control_formats in that it provides sub-formats,
3521
    e.g. BzrDirMeta1 with weave repository.  Also, it's more user-oriented.
3522
    """
3523
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3524
    def __init__(self):
3525
        """Create a BzrDirFormatRegistry."""
3526
        self._aliases = set()
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3527
        self._registration_order = list()
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3528
        super(BzrDirFormatRegistry, self).__init__()
3529
3530
    def aliases(self):
3531
        """Return a set of the format names which are aliases."""
3532
        return frozenset(self._aliases)
3533
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3534
    def register_metadir(self, key,
3535
             repository_format, help, native=True, deprecated=False,
3536
             branch_format=None,
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3537
             tree_format=None,
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3538
             hidden=False,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3539
             experimental=False,
3540
             alias=False):
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3541
        """Register a metadir subformat.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
3542
3543
        These all use a BzrDirMetaFormat1 bzrdir, but can be parameterized
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
3544
        by the Repository/Branch/WorkingTreeformats.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
3545
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3546
        :param repository_format: The fully-qualified repository format class
3547
            name as a string.
3548
        :param branch_format: Fully-qualified branch format class name as
3549
            a string.
3550
        :param tree_format: Fully-qualified tree format class name as
3551
            a string.
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3552
        """
3553
        # This should be expanded to support setting WorkingTree and Branch
3554
        # formats, once BzrDirMetaFormat1 supports that.
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3555
        def _load(full_name):
3556
            mod_name, factory_name = full_name.rsplit('.', 1)
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
3557
            try:
3558
                mod = __import__(mod_name, globals(), locals(),
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3559
                        [factory_name])
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
3560
            except ImportError, e:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3561
                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.
3562
            try:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3563
                factory = getattr(mod, factory_name)
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
3564
            except AttributeError:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3565
                raise AttributeError('no factory %s in module %r'
3566
                    % (full_name, mod))
3567
            return factory()
3568
3569
        def helper():
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3570
            bd = BzrDirMetaFormat1()
2230.3.1 by Aaron Bentley
Get branch6 creation working
3571
            if branch_format is not None:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
3572
                bd.set_branch_format(_load(branch_format))
3573
            if tree_format is not None:
3574
                bd.workingtree_format = _load(tree_format)
3575
            if repository_format is not None:
3576
                bd.repository_format = _load(repository_format)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3577
            return bd
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3578
        self.register(key, helper, help, native, deprecated, hidden,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3579
            experimental, alias)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3580
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3581
    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
3582
                 hidden=False, experimental=False, alias=False):
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3583
        """Register a BzrDirFormat factory.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3584
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3585
        The factory must be a callable that takes one parameter: the key.
3586
        It must produce an instance of the BzrDirFormat when called.
3587
3588
        This function mainly exists to prevent the info object from being
3589
        supplied directly.
3590
        """
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3591
        registry.Registry.register(self, key, factory, help,
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3592
            BzrDirFormatInfo(native, deprecated, hidden, experimental))
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3593
        if alias:
3594
            self._aliases.add(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3595
        self._registration_order.append(key)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3596
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
3597
    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
3598
        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
3599
        registry.Registry.register_lazy(self, key, module_name, member_name,
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3600
            help, BzrDirFormatInfo(native, deprecated, hidden, experimental))
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3601
        if alias:
3602
            self._aliases.add(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3603
        self._registration_order.append(key)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3604
3605
    def set_default(self, key):
3606
        """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
3607
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3608
        This method must be called once and only once.
3609
        """
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3610
        registry.Registry.register(self, 'default', self.get(key),
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3611
            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
3612
        self._aliases.add('default')
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3613
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
3614
    def set_default_repository(self, key):
3615
        """Set the FormatRegistry default and Repository default.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3616
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
3617
        This is a transitional method while Repository.set_default_format
3618
        is deprecated.
3619
        """
3620
        if 'default' in self:
3621
            self.remove('default')
3622
        self.set_default(key)
3623
        format = self.get('default')()
3624
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3625
    def make_bzrdir(self, key):
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
3626
        return self.get(key)()
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3627
3628
    def help_topic(self, topic):
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3629
        output = ""
2711.2.4 by Martin Pool
Fix unbound variable error in BzrDirFormatRegistry.get_help (test order dependent)
3630
        default_realkey = None
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3631
        default_help = self.get_help('default')
3632
        help_pairs = []
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3633
        for key in self._registration_order:
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3634
            if key == 'default':
3635
                continue
3636
            help = self.get_help(key)
3637
            if help == default_help:
3638
                default_realkey = key
3639
            else:
3640
                help_pairs.append((key, help))
3641
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3642
        def wrapped(key, help, info):
3643
            if info.native:
3644
                help = '(native) ' + help
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3645
            return ':%s:\n%s\n\n' % (key,
4070.11.2 by Martin Pool
Ask textwrap not to break long words or on hyphens
3646
                textwrap.fill(help, initial_indent='    ',
3647
                    subsequent_indent='    ',
4070.11.5 by Martin Pool
textwrap break_on_hyphens option is not available in python2.5
3648
                    break_long_words=False))
2711.2.4 by Martin Pool
Fix unbound variable error in BzrDirFormatRegistry.get_help (test order dependent)
3649
        if default_realkey is not None:
3650
            output += wrapped(default_realkey, '(default) %s' % default_help,
3651
                              self.get_info('default'))
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3652
        deprecated_pairs = []
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3653
        experimental_pairs = []
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3654
        for key, help in help_pairs:
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3655
            info = self.get_info(key)
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3656
            if info.hidden:
3657
                continue
3658
            elif info.deprecated:
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3659
                deprecated_pairs.append((key, help))
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3660
            elif info.experimental:
3661
                experimental_pairs.append((key, help))
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3662
            else:
3663
                output += wrapped(key, help, info)
4927.2.4 by Ian Clatworthy
improve linking in other-formats and current-formats
3664
        output += "\nSee :doc:`formats-help` for more about storage formats."
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3665
        other_output = ""
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3666
        if len(experimental_pairs) > 0:
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3667
            other_output += "Experimental formats are shown below.\n\n"
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
3668
            for key, help in experimental_pairs:
3669
                info = self.get_info(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3670
                other_output += wrapped(key, help, info)
3671
        else:
3672
            other_output += \
3673
                "No experimental formats are available.\n\n"
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3674
        if len(deprecated_pairs) > 0:
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3675
            other_output += "\nDeprecated formats are shown below.\n\n"
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3676
            for key, help in deprecated_pairs:
3677
                info = self.get_info(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3678
                other_output += wrapped(key, help, info)
3679
        else:
3680
            other_output += \
3681
                "\nNo deprecated formats are available.\n\n"
3682
        other_output += \
4927.2.4 by Ian Clatworthy
improve linking in other-formats and current-formats
3683
                "\nSee :doc:`formats-help` for more about storage formats."
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3684
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3685
        if topic == 'other-formats':
3686
            return other_output
3687
        else:
3688
            return output
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3689
3690
3242.2.14 by Aaron Bentley
Update from review comments
3691
class RepositoryAcquisitionPolicy(object):
3692
    """Abstract base class for repository acquisition policies.
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
3693
3242.2.14 by Aaron Bentley
Update from review comments
3694
    A repository acquisition policy decides how a BzrDir acquires a repository
3695
    for a branch that is being created.  The most basic policy decision is
3696
    whether to create a new repository or use an existing one.
3697
    """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3698
    def __init__(self, stack_on, stack_on_pwd, require_stacking):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3699
        """Constructor.
3700
3701
        :param stack_on: A location to stack on
3702
        :param stack_on_pwd: If stack_on is relative, the location it is
3703
            relative to.
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3704
        :param require_stacking: If True, it is a failure to not stack.
3242.3.35 by Aaron Bentley
Cleanups and documentation
3705
        """
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
3706
        self._stack_on = stack_on
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
3707
        self._stack_on_pwd = stack_on_pwd
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3708
        self._require_stacking = require_stacking
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
3709
3710
    def configure_branch(self, branch):
3242.2.13 by Aaron Bentley
Update docs
3711
        """Apply any configuration data from this policy to the branch.
3712
3242.3.18 by Aaron Bentley
Clean up repository-policy work
3713
        Default implementation sets repository stacking.
3242.2.13 by Aaron Bentley
Update docs
3714
        """
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3715
        if self._stack_on is None:
3716
            return
3717
        if self._stack_on_pwd is None:
3718
            stack_on = self._stack_on
3719
        else:
3720
            try:
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
3721
                stack_on = urlutils.rebase_url(self._stack_on,
3722
                    self._stack_on_pwd,
5158.6.9 by Martin Pool
Simplify various code to use user_url
3723
                    branch.user_url)
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3724
            except errors.InvalidRebaseURLs:
3725
                stack_on = self._get_full_stack_on()
3242.3.37 by Aaron Bentley
Updates from reviews
3726
        try:
3537.3.5 by Martin Pool
merge trunk including stacking policy
3727
            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.
3728
        except (errors.UnstackableBranchFormat,
3729
                errors.UnstackableRepositoryFormat):
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3730
            if self._require_stacking:
3731
                raise
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3732
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.
3733
    def requires_stacking(self):
3734
        """Return True if this policy requires stacking."""
3735
        return self._stack_on is not None and self._require_stacking
3736
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3737
    def _get_full_stack_on(self):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3738
        """Get a fully-qualified URL for the stack_on location."""
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3739
        if self._stack_on is None:
3740
            return None
3741
        if self._stack_on_pwd is None:
3742
            return self._stack_on
3743
        else:
3744
            return urlutils.join(self._stack_on_pwd, self._stack_on)
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
3745
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
3746
    def _add_fallback(self, repository, possible_transports=None):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3747
        """Add a fallback to the supplied repository, if stacking is set."""
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
3748
        stack_on = self._get_full_stack_on()
3749
        if stack_on is None:
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
3750
            return
4294.2.8 by Robert Collins
Reduce round trips pushing new branches substantially.
3751
        try:
3752
            stacked_dir = BzrDir.open(stack_on,
3753
                                      possible_transports=possible_transports)
3754
        except errors.JailBreak:
3755
            # We keep the stacking details, but we are in the server code so
3756
            # actually stacking is not needed.
3757
            return
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
3758
        try:
3759
            stacked_repo = stacked_dir.open_branch().repository
3760
        except errors.NotBranchError:
3761
            stacked_repo = stacked_dir.open_repository()
3242.3.37 by Aaron Bentley
Updates from reviews
3762
        try:
3763
            repository.add_fallback_repository(stacked_repo)
3764
        except errors.UnstackableRepositoryFormat:
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3765
            if self._require_stacking:
3766
                raise
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
3767
        else:
3768
            self._require_stacking = True
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
3769
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
3770
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
3771
        """Acquire a repository for this bzrdir.
3772
3773
        Implementations may create a new repository or use a pre-exising
3774
        repository.
3775
        :param make_working_trees: If creating a repository, set
3776
            make_working_trees to this value (if non-None)
3777
        :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.
3778
        :return: A repository, is_new_flag (True if the repository was
3779
            created).
3242.2.14 by Aaron Bentley
Update from review comments
3780
        """
3781
        raise NotImplemented(RepositoryAcquisitionPolicy.acquire_repository)
3782
3783
3784
class CreateRepository(RepositoryAcquisitionPolicy):
3242.2.13 by Aaron Bentley
Update docs
3785
    """A policy of creating a new repository"""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3786
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3787
    def __init__(self, bzrdir, stack_on=None, stack_on_pwd=None,
3788
                 require_stacking=False):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3789
        """
3790
        Constructor.
3791
        :param bzrdir: The bzrdir to create the repository on.
3792
        :param stack_on: A location to stack on
3793
        :param stack_on_pwd: If stack_on is relative, the location it is
3794
            relative to.
3795
        """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3796
        RepositoryAcquisitionPolicy.__init__(self, stack_on, stack_on_pwd,
3797
                                             require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3798
        self._bzrdir = bzrdir
3799
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
3800
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
3801
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
3242.2.13 by Aaron Bentley
Update docs
3802
3242.2.14 by Aaron Bentley
Update from review comments
3803
        Creates the desired repository in the bzrdir we already have.
3242.2.13 by Aaron Bentley
Update docs
3804
        """
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.
3805
        stack_on = self._get_full_stack_on()
3806
        if stack_on:
4401.1.2 by John Arbash Meinel
Move the logic back up into BzrDirFormat1.require_stacking, passing in the extra params.
3807
            format = self._bzrdir._format
3808
            format.require_stacking(stack_on=stack_on,
3809
                                    possible_transports=[self._bzrdir.root_transport])
3810
            if not self._require_stacking:
3811
                # We have picked up automatic stacking somewhere.
3812
                note('Using default stacking branch %s at %s', self._stack_on,
3813
                    self._stack_on_pwd)
3650.3.9 by Aaron Bentley
Move responsibility for stackable repo format to _get_metadir
3814
        repository = self._bzrdir.create_repository(shared=shared)
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
3815
        self._add_fallback(repository,
3816
                           possible_transports=[self._bzrdir.transport])
3242.2.4 by Aaron Bentley
Only set working tree policty when specified
3817
        if make_working_trees is not None:
3242.3.6 by Aaron Bentley
Work around strange test failure
3818
            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.
3819
        return repository, True
3242.2.2 by Aaron Bentley
Merge policy updates from stacked-policy thread
3820
3821
3242.2.14 by Aaron Bentley
Update from review comments
3822
class UseExistingRepository(RepositoryAcquisitionPolicy):
3242.2.13 by Aaron Bentley
Update docs
3823
    """A policy of reusing an existing repository"""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3824
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3825
    def __init__(self, repository, stack_on=None, stack_on_pwd=None,
3826
                 require_stacking=False):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3827
        """Constructor.
3828
3829
        :param repository: The repository to use.
3830
        :param stack_on: A location to stack on
3831
        :param stack_on_pwd: If stack_on is relative, the location it is
3832
            relative to.
3833
        """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3834
        RepositoryAcquisitionPolicy.__init__(self, stack_on, stack_on_pwd,
3835
                                             require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3836
        self._repository = repository
3837
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
3838
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
3839
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
3242.2.13 by Aaron Bentley
Update docs
3840
4070.9.8 by Andrew Bennetts
Use MiniSearchResult in clone_on_transport down (further tightening the test_push ratchets), and improve acquire_repository docstrings.
3841
        Returns an existing repository to use.
3242.2.13 by Aaron Bentley
Update docs
3842
        """
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
3843
        self._add_fallback(self._repository,
3844
                       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.
3845
        return self._repository, False
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3846
3847
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3848
# Please register new formats after old formats so that formats
3849
# appear in chronological order and format descriptions can build
3850
# on previous ones.
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3851
format_registry = BzrDirFormatRegistry()
3990.5.3 by Robert Collins
Docs and polish on RepositoryFormat.network_name.
3852
# The pre-0.8 formats have their repository format network name registered in
3853
# repository.py. MetaDir formats have their repository format network name
3854
# inferred from their disk format string.
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
3855
format_registry.register('weave', BzrDirFormat6,
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3856
    '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
3857
    ' support checkouts or shared repositories.',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3858
    hidden=True,
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
3859
    deprecated=True)
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
3860
format_registry.register_metadir('metaweave',
3861
    'bzrlib.repofmt.weaverepo.RepositoryFormat7',
2230.3.30 by Aaron Bentley
Fix whitespace issues
3862
    'Transitional format in 0.8.  Slower than knit.',
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3863
    branch_format='bzrlib.branch.BzrBranchFormat5',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
3864
    tree_format='bzrlib.workingtree.WorkingTreeFormat3',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3865
    hidden=True,
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3866
    deprecated=True)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3867
format_registry.register_metadir('knit',
3868
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3869
    'Format using knits.  Recommended for interoperation with bzr <= 0.14.',
3870
    branch_format='bzrlib.branch.BzrBranchFormat5',
3871
    tree_format='bzrlib.workingtree.WorkingTreeFormat3',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3872
    hidden=True,
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3873
    deprecated=True)
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3874
format_registry.register_metadir('dirstate',
3875
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3876
    help='New in 0.15: Fast local operations. Compatible with bzr 0.8 and '
3877
        'above when accessed over the network.',
3878
    branch_format='bzrlib.branch.BzrBranchFormat5',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
3879
    # this uses bzrlib.workingtree.WorkingTreeFormat4 because importing
3880
    # directly from workingtree_4 triggers a circular import.
3881
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3882
    hidden=True,
3892.1.1 by Ian Clatworthy
improve help on storage formats
3883
    deprecated=True)
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
3884
format_registry.register_metadir('dirstate-tags',
3885
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3886
    help='New in 0.15: Fast local operations and improved scaling for '
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3887
        'network operations. Additionally adds support for tags.'
3888
        ' Incompatible with bzr < 0.15.',
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
3889
    branch_format='bzrlib.branch.BzrBranchFormat6',
3890
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3891
    hidden=True,
3892.1.1 by Ian Clatworthy
improve help on storage formats
3892
    deprecated=True)
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
3893
format_registry.register_metadir('rich-root',
3894
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
3895
    help='New in 1.0.  Better handling of tree roots.  Incompatible with'
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3896
        ' bzr < 1.0.',
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
3897
    branch_format='bzrlib.branch.BzrBranchFormat6',
3898
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3899
    hidden=True,
3892.1.1 by Ian Clatworthy
improve help on storage formats
3900
    deprecated=True)
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3901
format_registry.register_metadir('dirstate-with-subtree',
3902
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
3903
    help='New in 0.15: Fast local operations and improved scaling for '
3904
        'network operations. Additionally adds support for versioning nested '
3905
        'bzr branches. Incompatible with bzr < 0.15.',
3906
    branch_format='bzrlib.branch.BzrBranchFormat6',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
3907
    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.
3908
    experimental=True,
3170.4.4 by Adeodato Simó
Keep the hidden flag for subtree formats after review from Aaron.
3909
    hidden=True,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3910
    )
3010.3.2 by Martin Pool
Rename pack0.92 to pack-0.92
3911
format_registry.register_metadir('pack-0.92',
2592.3.224 by Martin Pool
Rename GraphKnitRepository etc to KnitPackRepository
3912
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack1',
2939.2.1 by Ian Clatworthy
use 'knitpack' naming instead of 'experimental' for pack formats
3913
    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
3914
        'dirstate-tags format repositories. Interoperates with '
3915
        '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
3916
        ,
2592.3.22 by Robert Collins
Add new experimental repository formats.
3917
    branch_format='bzrlib.branch.BzrBranchFormat6',
3918
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3919
    )
3010.3.2 by Martin Pool
Rename pack0.92 to pack-0.92
3920
format_registry.register_metadir('pack-0.92-subtree',
2592.3.224 by Martin Pool
Rename GraphKnitRepository etc to KnitPackRepository
3921
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack3',
2939.2.1 by Ian Clatworthy
use 'knitpack' naming instead of 'experimental' for pack formats
3922
    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
3923
        'dirstate-with-subtree format repositories. Interoperates with '
3924
        '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
3925
        ,
2592.3.22 by Robert Collins
Add new experimental repository formats.
3926
    branch_format='bzrlib.branch.BzrBranchFormat6',
3927
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3190.1.2 by Aaron Bentley
Undo spurious change
3928
    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.
3929
    experimental=True,
2592.3.22 by Robert Collins
Add new experimental repository formats.
3930
    )
2996.2.11 by Aaron Bentley
Implement rich-root-pack format ( #164639)
3931
format_registry.register_metadir('rich-root-pack',
3932
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack4',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3933
    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.
3934
         '(needed for bzr-svn and bzr-git).',
2996.2.11 by Aaron Bentley
Implement rich-root-pack format ( #164639)
3935
    branch_format='bzrlib.branch.BzrBranchFormat6',
3936
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3937
    hidden=True,
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3938
    )
3575.2.1 by Martin Pool
Rename stacked format to 1.6
3939
format_registry.register_metadir('1.6',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3940
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5',
3892.1.6 by Ian Clatworthy
include feedback from poolie
3941
    help='A format that allows a branch to indicate that there is another '
3942
         '(stacked) repository that should be used to access data that is '
3943
         'not present locally.',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3944
    branch_format='bzrlib.branch.BzrBranchFormat7',
3945
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3946
    hidden=True,
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3947
    )
3606.10.2 by John Arbash Meinel
Name the new format 1.6.1-rich-root, and NEWS for fixing bug #262333
3948
format_registry.register_metadir('1.6.1-rich-root',
3549.1.6 by Martin Pool
Change stacked-subtree to stacked-rich-root
3949
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5RichRoot',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3950
    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.
3951
         '(needed for bzr-svn and bzr-git).',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3952
    branch_format='bzrlib.branch.BzrBranchFormat7',
3953
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3954
    hidden=True,
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3955
    )
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3956
format_registry.register_metadir('1.9',
3957
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3892.1.6 by Ian Clatworthy
include feedback from poolie
3958
    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
3959
         'are smaller in size, have smarter caching and provide faster '
3960
         'performance for most operations.',
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3961
    branch_format='bzrlib.branch.BzrBranchFormat7',
3962
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3963
    hidden=True,
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3964
    )
3965
format_registry.register_metadir('1.9-rich-root',
3966
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3967
    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.
3968
         '(needed for bzr-svn and bzr-git).',
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3969
    branch_format='bzrlib.branch.BzrBranchFormat7',
3970
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
4976.2.1 by Ian Clatworthy
Hide most storage formats
3971
    hidden=True,
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3972
    )
4210.4.1 by Ian Clatworthy
replace experimental development-wt5 formats with 1.14 formats
3973
format_registry.register_metadir('1.14',
3586.2.10 by Ian Clatworthy
rename formats from 1.7-* to 1.12-*
3974
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
4210.4.2 by Ian Clatworthy
split filtered views support out into WorkingTreeFormat6
3975
    help='A working-tree format that supports content filtering.',
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
    )
4210.4.1 by Ian Clatworthy
replace experimental development-wt5 formats with 1.14 formats
3979
format_registry.register_metadir('1.14-rich-root',
3586.2.10 by Ian Clatworthy
rename formats from 1.7-* to 1.12-*
3980
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
4210.4.1 by Ian Clatworthy
replace experimental development-wt5 formats with 1.14 formats
3981
    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.
3982
         '(needed for bzr-svn and bzr-git).',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
3983
    branch_format='bzrlib.branch.BzrBranchFormat7',
3995.7.1 by John Arbash Meinel
Fix bug #328135.
3984
    tree_format='bzrlib.workingtree.WorkingTreeFormat5',
3586.2.6 by Ian Clatworthy
add 1.7 and 1.7-rich-root formats
3985
    )
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)
3986
# The following un-numbered 'development' formats should always just be aliases.
3987
format_registry.register_metadir('development-rich-root',
3988
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
4241.15.17 by Matt Nordhoff
development-rich-root's help string didn't say it supported rich roots.
3989
    help='Current development format. Supports rich roots. Can convert data '
3990
        'to and from rich-root-pack (and anything compatible with '
3991
        'rich-root-pack) format repositories. Repositories and branches in '
3992
        '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
3993
        '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
3994
        'before use.',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
3995
    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)
3996
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3997
    experimental=True,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3998
    alias=True,
4976.2.1 by Ian Clatworthy
Hide most storage formats
3999
    hidden=True,
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
4000
    )
4001
format_registry.register_metadir('development-subtree',
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
4002
    'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
4003
    help='Current development format, subtree variant. Can convert data to and '
3221.11.7 by Robert Collins
Merge in real stacked repository work.
4004
        'from pack-0.92-subtree (and anything compatible with '
4005
        'pack-0.92-subtree) format repositories. Repositories and branches in '
4006
        '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
4007
        '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
4008
        'before use.',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
4009
    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)
4010
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
4011
    experimental=True,
4976.2.1 by Ian Clatworthy
Hide most storage formats
4012
    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)
4013
    alias=False, # Restore to being an alias when an actual development subtree format is added
4014
                 # This current non-alias status is simply because we did not introduce a
4015
                 # chk based subtree format.
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
4016
    )
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
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
4018
# 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)
4019
format_registry.register_metadir('development6-rich-root',
4020
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK1',
4021
    help='pack-1.9 with 255-way hashed CHK inv, group compress, rich roots '
4022
        'Please read '
4988.4.2 by Martin Pool
Change url to canonical.com or wiki, plus some doc improvements in passing
4023
        '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)
4024
        'before use.',
4025
    branch_format='bzrlib.branch.BzrBranchFormat7',
4026
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4027
    hidden=True,
3735.31.1 by John Arbash Meinel
Bring the groupcompress plugin into the brisbane-core branch.
4028
    experimental=True,
4029
    )
4030
4290.1.7 by Jelmer Vernooij
Add development7-rich-root format that uses the RIO Serializer.
4031
format_registry.register_metadir('development7-rich-root',
4032
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
4290.1.12 by Jelmer Vernooij
Use bencode rather than rio in the new revision serialiszer.
4033
    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.
4034
        'rich roots. Please read '
4988.4.2 by Martin Pool
Change url to canonical.com or wiki, plus some doc improvements in passing
4035
        '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.
4036
        'before use.',
4037
    branch_format='bzrlib.branch.BzrBranchFormat7',
4038
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4039
    hidden=True,
4040
    experimental=True,
4041
    )
4042
4428.2.1 by Martin Pool
Add 2a format
4043
format_registry.register_metadir('2a',
4044
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
4045
    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
4046
        'Uses group-compress storage.\n'
4428.2.6 by Martin Pool
Stupid typo fix
4047
        '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
4048
        # 'storage in packs, 255-way hashed CHK inventory, bencode revision, group compress, '
4049
        # 'rich roots. Supported by bzr 1.16 and later.',
4428.2.1 by Martin Pool
Add 2a format
4050
    branch_format='bzrlib.branch.BzrBranchFormat7',
4051
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4428.2.5 by Martin Pool
Mark 2a experimental and tweak its help per lifeless's review
4052
    experimental=True,
4428.2.1 by Martin Pool
Add 2a format
4053
    )
4428.2.2 by Martin Pool
Format 2a should not be hidden
4054
4119.6.2 by Jelmer Vernooij
Use existing alias mechanism for default-rich-root.
4055
# The following format should be an alias for the rich root equivalent 
4056
# of the default format
4057
format_registry.register_metadir('default-rich-root',
4599.4.37 by Robert Collins
Fix registration of default-rich-root as 2a.
4058
    'bzrlib.repofmt.groupcompress_repo.RepositoryFormat2a',
4059
    branch_format='bzrlib.branch.BzrBranchFormat7',
4060
    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
4599.4.23 by Robert Collins
default-rich-root should be an alias still.
4061
    alias=True,
4976.2.1 by Ian Clatworthy
Hide most storage formats
4062
    hidden=True,
4599.4.22 by mbp at sourcefrog
Don't forget to set default-rich-root to 2a too.
4063
    help='Same as 2a.')
4064
3221.11.2 by Robert Collins
Create basic stackable branch facility.
4065
# The current format that is made on 'bzr init'.
4599.4.1 by Robert Collins
Change the default format to 2a.
4066
format_registry.set_default('2a')