/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1
# Copyright (C) 2005, 2006, 2007 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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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.
21
"""
22
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
23
# TODO: Can we move specific formats into separate modules to make this file
24
# smaller?
25
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
26
from cStringIO import StringIO
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
27
import os
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
28
29
from bzrlib.lazy_import import lazy_import
30
lazy_import(globals(), """
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
31
from stat import S_ISDIR
2711.2.1 by Martin Pool
Deprecate BzrDir.create_repository
32
import textwrap
33
from warnings import warn
1534.4.39 by Robert Collins
Basic BzrDir support.
34
35
import bzrlib
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
36
from bzrlib import (
37
    errors,
2776.1.5 by Robert Collins
Add reasonably comprehensive tests for path last modified and per file graph behaviour.
38
    graph,
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
39
    lockable_files,
40
    lockdir,
2204.4.1 by Aaron Bentley
Add 'formats' help topic
41
    registry,
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
42
    remote,
1996.3.12 by John Arbash Meinel
Change how 'revision' is imported to avoid problems later
43
    revision as _mod_revision,
2204.4.12 by Aaron Bentley
Deprecate bzrdir.BzrDirFormat.set_default_format
44
    symbol_versioning,
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
45
    ui,
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
46
    urlutils,
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
47
    xml4,
48
    xml5,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
49
    workingtree,
50
    workingtree_4,
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
51
    )
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
52
from bzrlib.osutils import (
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
53
    sha_strings,
54
    sha_string,
55
    )
2018.5.159 by Andrew Bennetts
Rename SmartClient to _SmartClient.
56
from bzrlib.smart.client import _SmartClient
2432.3.1 by Andrew Bennetts
Try a version 1 hello probe to determine if we can use RemoteBzrDir on a particular transport, allowing smooth interoperation with older servers.
57
from bzrlib.smart import protocol
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
58
from bzrlib.store.revision.text import TextRevisionStore
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
59
from bzrlib.store.text import TextStore
1563.2.25 by Robert Collins
Merge in upstream.
60
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
61
from bzrlib.transactions import WriteTransaction
2164.2.21 by Vincent Ladeuil
Take bundles into account.
62
from bzrlib.transport import (
63
    do_catching_redirections,
64
    get_transport,
65
    )
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
66
from bzrlib.weave import Weave
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
67
""")
68
2164.2.1 by v.ladeuil+lp at free
First rough http branch redirection implementation.
69
from bzrlib.trace import (
70
    mutter,
71
    note,
72
    )
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
73
from bzrlib.transport.local import LocalTransport
2711.2.1 by Martin Pool
Deprecate BzrDir.create_repository
74
from bzrlib.symbol_versioning import (
75
    deprecated_function,
76
    deprecated_method,
77
    zero_ninetyone,
78
    )
1534.4.39 by Robert Collins
Basic BzrDir support.
79
80
81
class BzrDir(object):
82
    """A .bzr control diretory.
83
    
84
    BzrDir instances let you create or open any of the things that can be
85
    found within .bzr - checkouts, branches and repositories.
86
    
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
87
    transport
88
        the transport which this bzr dir is rooted at (i.e. file:///.../.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.
89
    root_transport
90
        a transport connected to the directory this bzr was opened from.
1534.4.39 by Robert Collins
Basic BzrDir support.
91
    """
92
1687.1.12 by Robert Collins
Hook in the full break-lock ui.
93
    def break_lock(self):
94
        """Invoke break_lock on the first object in the bzrdir.
95
96
        If there is a tree, the tree is opened and break_lock() called.
97
        Otherwise, branch is tried, and finally repository.
98
        """
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
99
        # XXX: This seems more like a UI function than something that really
100
        # belongs in this class.
1687.1.12 by Robert Collins
Hook in the full break-lock ui.
101
        try:
102
            thing_to_unlock = self.open_workingtree()
103
        except (errors.NotLocalUrl, errors.NoWorkingTree):
104
            try:
105
                thing_to_unlock = self.open_branch()
106
            except errors.NotBranchError:
107
                try:
108
                    thing_to_unlock = self.open_repository()
109
                except errors.NoRepositoryPresent:
110
                    return
111
        thing_to_unlock.break_lock()
112
1534.5.16 by Robert Collins
Review feedback.
113
    def can_convert_format(self):
114
        """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.
115
        return True
116
1910.2.12 by Aaron Bentley
Implement knit repo format 2
117
    def check_conversion_target(self, target_format):
118
        target_repo_format = target_format.repository_format
119
        source_repo_format = self._format.repository_format
120
        source_repo_format.check_conversion_target(target_repo_format)
121
1596.2.1 by Robert Collins
Fix BzrDir.open_containing of unsupported branches.
122
    @staticmethod
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
123
    def _check_supported(format, allow_unsupported,
124
        recommend_upgrade=True,
125
        basedir=None):
126
        """Give an error or warning on old formats.
127
128
        :param format: may be any kind of format - workingtree, branch, 
129
        or repository.
130
131
        :param allow_unsupported: If true, allow opening 
132
        formats that are strongly deprecated, and which may 
133
        have limited functionality.
134
135
        :param recommend_upgrade: If true (default), warn
136
        the user through the ui object that they may wish
137
        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.
138
        """
2323.5.19 by Martin Pool
No upgrade recommendation on source when cloning
139
        # TODO: perhaps move this into a base Format class; it's not BzrDir
140
        # specific. mbp 20070323
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
141
        if not allow_unsupported and not format.is_supported():
1596.2.1 by Robert Collins
Fix BzrDir.open_containing of unsupported branches.
142
            # see open_downlevel to open legacy branches.
1740.5.6 by Martin Pool
Clean up many exception classes.
143
            raise errors.UnsupportedFormatError(format=format)
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
144
        if recommend_upgrade \
145
            and getattr(format, 'upgrade_recommended', False):
146
            ui.ui_factory.recommend_upgrade(
147
                format.get_format_description(),
148
                basedir)
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
149
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
150
    def clone(self, url, revision_id=None, force_new_repo=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.
151
        """Clone this bzrdir and its contents to url verbatim.
152
153
        If urls last component does not exist, it will be created.
154
155
        if revision_id is not None, then the clone operation may tune
156
            itself to download less data.
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.
157
        :param force_new_repo: Do not use a shared repository for the target 
158
                               even if one is available.
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.
159
        """
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
160
        return self.clone_on_transport(get_transport(url),
161
                                       revision_id=revision_id,
162
                                       force_new_repo=force_new_repo)
163
164
    def clone_on_transport(self, transport, revision_id=None,
165
                           force_new_repo=False):
166
        """Clone this bzrdir and its contents to transport verbatim.
167
168
        If the target directory does not exist, it will be created.
169
170
        if revision_id is not None, then the clone operation may tune
171
            itself to download less data.
172
        :param force_new_repo: Do not use a shared repository for the target 
173
                               even if one is available.
174
        """
2475.3.3 by John Arbash Meinel
Change calls to try/mkdir('.')/except FileExists to ensure_base()
175
        transport.ensure_base()
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
176
        result = self._format.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.
177
        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.
178
            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.
179
        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.
180
            local_repo = None
181
        if local_repo:
182
            # may need to copy content in
183
            if force_new_repo:
1707.1.1 by Robert Collins
Bugfixes to bzrdir.sprout and clone. Sprout was failing to reset the
184
                result_repo = local_repo.clone(
185
                    result,
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
186
                    revision_id=revision_id)
1707.1.1 by Robert Collins
Bugfixes to bzrdir.sprout and clone. Sprout was failing to reset the
187
                result_repo.set_make_working_trees(local_repo.make_working_trees())
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.
188
            else:
189
                try:
190
                    result_repo = result.find_repository()
191
                    # fetch content this dir needs.
192
                    result_repo.fetch(local_repo, revision_id=revision_id)
193
                except errors.NoRepositoryPresent:
194
                    # needed to make one anyway.
1707.1.1 by Robert Collins
Bugfixes to bzrdir.sprout and clone. Sprout was failing to reset the
195
                    result_repo = local_repo.clone(
196
                        result,
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
197
                        revision_id=revision_id)
1707.1.1 by Robert Collins
Bugfixes to bzrdir.sprout and clone. Sprout was failing to reset the
198
                    result_repo.set_make_working_trees(local_repo.make_working_trees())
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.
199
        # 1 if there is a branch present
200
        #   make sure its content is available in the target repository
201
        #   clone it.
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.
202
        try:
203
            self.open_branch().clone(result, revision_id=revision_id)
204
        except errors.NotBranchError:
205
            pass
206
        try:
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
207
            self.open_workingtree().clone(result)
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
208
        except (errors.NoWorkingTree, errors.NotLocalUrl):
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.
209
            pass
210
        return result
211
1685.1.61 by Martin Pool
[broken] Change BzrDir._make_tail to use urlutils.split
212
    # TODO: This should be given a Transport, and should chdir up; otherwise
213
    # 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.
214
    def _make_tail(self, url):
2475.3.3 by John Arbash Meinel
Change calls to try/mkdir('.')/except FileExists to ensure_base()
215
        t = get_transport(url)
216
        t.ensure_base()
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
217
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
218
    @classmethod
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
219
    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.
220
        """Create a new BzrDir at the url 'base'.
1534.4.39 by Robert Collins
Basic BzrDir support.
221
        
222
        This will call the current default formats initialize with base
223
        as the only parameter.
224
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
225
        :param format: If supplied, the format of branch to create.  If not
226
            supplied, the default is used.
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
227
        :param possible_transports: If supplied, a list of transports that 
228
            can be reused to share a remote connection.
1534.4.39 by Robert Collins
Basic BzrDir support.
229
        """
1553.5.71 by Martin Pool
Change branch format 5 to use LockDirs, not transport locks
230
        if cls is not BzrDir:
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
231
            raise AssertionError("BzrDir.create always creates the default"
232
                " format, not one of %r" % cls)
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
233
        t = get_transport(base, possible_transports)
2475.3.3 by John Arbash Meinel
Change calls to try/mkdir('.')/except FileExists to ensure_base()
234
        t.ensure_base()
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
235
        if format is None:
236
            format = BzrDirFormat.get_default_format()
2485.8.45 by Vincent Ladeuil
Take jam's remarks into account.
237
        return format.initialize(base, possible_transports)
1534.4.39 by Robert Collins
Basic BzrDir support.
238
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
239
    def create_branch(self):
240
        """Create a branch in this BzrDir.
241
242
        The bzrdirs format will control what branch format is created.
243
        For more control see BranchFormatXX.create(a_bzrdir).
244
        """
245
        raise NotImplementedError(self.create_branch)
246
2796.2.6 by Aaron Bentley
Implement destroy_branch
247
    def destroy_branch(self):
2796.2.16 by Aaron Bentley
Documentation updates from review
248
        """Destroy the branch in this BzrDir"""
2796.2.6 by Aaron Bentley
Implement destroy_branch
249
        raise NotImplementedError(self.destroy_branch)
250
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
251
    @staticmethod
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
252
    def create_branch_and_repo(base, force_new_repo=False, format=None):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
253
        """Create a new BzrDir, Branch and Repository at the url 'base'.
254
255
        This will use the current default BzrDirFormat, and use whatever 
256
        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.
257
        create_repository. If a shared repository is available that is used
258
        preferentially.
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
259
260
        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.
261
262
        :param base: The URL to create the branch at.
263
        :param force_new_repo: If True a new repository is always created.
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
264
        """
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
265
        bzrdir = BzrDir.create(base, format)
1534.6.11 by Robert Collins
Review feedback.
266
        bzrdir._find_or_create_repository(force_new_repo)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
267
        return bzrdir.create_branch()
1534.6.11 by Robert Collins
Review feedback.
268
269
    def _find_or_create_repository(self, force_new_repo):
270
        """Create a new repository if needed, returning the repository."""
271
        if force_new_repo:
272
            return self.create_repository()
273
        try:
274
            return self.find_repository()
275
        except errors.NoRepositoryPresent:
276
            return self.create_repository()
2476.3.6 by Vincent Ladeuil
Fix the 'init connects multiple times' in a different way.
277
        
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
278
    @staticmethod
2476.3.6 by Vincent Ladeuil
Fix the 'init connects multiple times' in a different way.
279
    def create_branch_convenience(base, force_new_repo=False,
280
                                  force_new_tree=None, format=None,
2476.3.11 by Vincent Ladeuil
Cosmetic changes.
281
                                  possible_transports=None):
1534.6.10 by Robert Collins
Finish use of repositories support.
282
        """Create a new BzrDir, Branch and Repository at the url 'base'.
283
284
        This is a convenience function - it will use an existing repository
285
        if possible, can be told explicitly whether to create a working tree or
1534.6.12 by Robert Collins
Typo found by John Meinel.
286
        not.
1534.6.10 by Robert Collins
Finish use of repositories support.
287
288
        This will use the current default BzrDirFormat, and use whatever 
289
        repository format that that uses via bzrdir.create_branch and
290
        create_repository. If a shared repository is available that is used
291
        preferentially. Whatever repository is used, its tree creation policy
292
        is followed.
293
294
        The created Branch object is returned.
295
        If a working tree cannot be made due to base not being a file:// url,
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.
296
        no error is raised unless force_new_tree is True, in which case no 
297
        data is created on disk and NotLocalUrl is raised.
1534.6.10 by Robert Collins
Finish use of repositories support.
298
299
        :param base: The URL to create the branch at.
300
        :param force_new_repo: If True a new repository is always created.
301
        :param force_new_tree: If True or False force creation of a tree or 
302
                               prevent such creation respectively.
2476.3.6 by Vincent Ladeuil
Fix the 'init connects multiple times' in a different way.
303
        :param format: Override for the for the bzrdir format to create.
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
304
        :param possible_transports: An optional reusable transports list.
1534.6.10 by Robert Collins
Finish use of repositories support.
305
        """
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.
306
        if force_new_tree:
307
            # check for non local urls
2485.8.45 by Vincent Ladeuil
Take jam's remarks into account.
308
            t = get_transport(base, possible_transports)
2476.3.6 by Vincent Ladeuil
Fix the 'init connects multiple times' in a different way.
309
            if not isinstance(t, LocalTransport):
310
                raise errors.NotLocalUrl(base)
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
311
        bzrdir = BzrDir.create(base, format, possible_transports)
1534.6.11 by Robert Collins
Review feedback.
312
        repo = bzrdir._find_or_create_repository(force_new_repo)
1534.6.10 by Robert Collins
Finish use of repositories support.
313
        result = bzrdir.create_branch()
2476.3.4 by Vincent Ladeuil
Add tests.
314
        if force_new_tree or (repo.make_working_trees() and
1534.6.10 by Robert Collins
Finish use of repositories support.
315
                              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.
316
            try:
317
                bzrdir.create_workingtree()
318
            except errors.NotLocalUrl:
319
                pass
1534.6.10 by Robert Collins
Finish use of repositories support.
320
        return result
2476.3.4 by Vincent Ladeuil
Add tests.
321
1551.8.2 by Aaron Bentley
Add create_checkout_convenience
322
    @staticmethod
2711.2.1 by Martin Pool
Deprecate BzrDir.create_repository
323
    @deprecated_function(zero_ninetyone)
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
324
    def create_repository(base, shared=False, format=None):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
325
        """Create a new BzrDir and Repository at the url 'base'.
326
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
327
        If no format is supplied, this will default to the current default
328
        BzrDirFormat by default, and use whatever repository format that that
329
        uses for bzrdirformat.create_repository.
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
330
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
331
        :param shared: Create a shared repository rather than a standalone
1534.6.1 by Robert Collins
allow API creation of shared repositories
332
                       repository.
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
333
        The Repository object is returned.
334
335
        This must be overridden as an instance method in child classes, where
336
        it should take no parameters and construct whatever repository format
337
        that child class desires.
2711.2.1 by Martin Pool
Deprecate BzrDir.create_repository
338
339
        This method is deprecated, please call create_repository on a bzrdir
340
        instance instead.
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
341
        """
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
342
        bzrdir = BzrDir.create(base, format)
1841.2.1 by Jelmer Vernooij
Fix handling of `shared' parameter in BzrDir.create_repository().
343
        return bzrdir.create_repository(shared)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
344
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
345
    @staticmethod
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
346
    def create_standalone_workingtree(base, format=None):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
347
        """Create a new BzrDir, WorkingTree, Branch and Repository at 'base'.
348
349
        'base' must be a local path or a file:// url.
350
351
        This will use the current default BzrDirFormat, and use whatever 
352
        repository format that that uses for bzrdirformat.create_workingtree,
353
        create_branch and create_repository.
354
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
355
        :return: The WorkingTree object.
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
356
        """
2485.8.45 by Vincent Ladeuil
Take jam's remarks into account.
357
        t = get_transport(base)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
358
        if not isinstance(t, LocalTransport):
359
            raise errors.NotLocalUrl(base)
2485.8.45 by Vincent Ladeuil
Take jam's remarks into account.
360
        bzrdir = BzrDir.create_branch_and_repo(base,
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
361
                                               force_new_repo=True,
362
                                               format=format).bzrdir
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
363
        return bzrdir.create_workingtree()
364
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
365
    def create_workingtree(self, revision_id=None):
366
        """Create a working tree at this BzrDir.
367
        
368
        revision_id: create it as of this revision id.
369
        """
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
370
        raise NotImplementedError(self.create_workingtree)
371
2255.14.1 by Martin Pool
Add BzrDir.retire_bzrdir and partly fix subsume
372
    def retire_bzrdir(self):
373
        """Permanently disable the bzrdir.
374
375
        This is done by renaming it to give the user some ability to recover
376
        if there was a problem.
377
378
        This will have horrible consequences if anyone has anything locked or
379
        in use.
380
        """
381
        for i in xrange(10000):
382
            try:
383
                to_path = '.bzr.retired.%d' % i
384
                self.root_transport.rename('.bzr', to_path)
385
                note("renamed %s to %s"
386
                    % (self.root_transport.abspath('.bzr'), to_path))
387
                break
388
            except (errors.TransportError, IOError, errors.PathError):
389
                pass
390
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
391
    def destroy_workingtree(self):
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
392
        """Destroy the working tree at this BzrDir.
393
394
        Formats that do not support this may raise UnsupportedOperation.
395
        """
396
        raise NotImplementedError(self.destroy_workingtree)
397
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
398
    def destroy_workingtree_metadata(self):
399
        """Destroy the control files for the working tree at this BzrDir.
400
401
        The contents of working tree files are not affected.
402
        Formats that do not support this may raise UnsupportedOperation.
403
        """
404
        raise NotImplementedError(self.destroy_workingtree_metadata)
405
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.
406
    def find_repository(self):
407
        """Find the repository that should be used for a_bzrdir.
408
409
        This does not require a branch as we use it to find the repo for
410
        new branches as well as to hook existing branches up to their
411
        repository.
412
        """
413
        try:
414
            return self.open_repository()
415
        except errors.NoRepositoryPresent:
416
            pass
417
        next_transport = self.root_transport.clone('..')
418
        while True:
1725.2.5 by Robert Collins
Bugfix create_branch_convenience at the root of a file system to not loop
419
            # find the next containing bzrdir
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.
420
            try:
1534.6.11 by Robert Collins
Review feedback.
421
                found_bzrdir = BzrDir.open_containing_from_transport(
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.
422
                    next_transport)[0]
423
            except errors.NotBranchError:
1725.2.5 by Robert Collins
Bugfix create_branch_convenience at the root of a file system to not loop
424
                # none found
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
425
                raise errors.NoRepositoryPresent(self)
1725.2.5 by Robert Collins
Bugfix create_branch_convenience at the root of a file system to not loop
426
            # 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.
427
            try:
428
                repository = found_bzrdir.open_repository()
429
            except errors.NoRepositoryPresent:
430
                next_transport = found_bzrdir.root_transport.clone('..')
1725.2.5 by Robert Collins
Bugfix create_branch_convenience at the root of a file system to not loop
431
                if (found_bzrdir.root_transport.base == next_transport.base):
432
                    # top of the file system
433
                    break
434
                else:
435
                    continue
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
436
            if ((found_bzrdir.root_transport.base ==
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.
437
                 self.root_transport.base) or repository.is_shared()):
438
                return repository
439
            else:
440
                raise errors.NoRepositoryPresent(self)
441
        raise errors.NoRepositoryPresent(self)
442
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
443
    def get_branch_reference(self):
444
        """Return the referenced URL for the branch in this bzrdir.
445
446
        :raises NotBranchError: If there is no Branch.
447
        :return: The URL the branch in this bzrdir references if it is a
448
            reference branch, or None for regular branches.
449
        """
450
        return None
451
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
452
    def get_branch_transport(self, branch_format):
453
        """Get the transport for use by branch format in this BzrDir.
454
455
        Note that bzr dirs that do not support format strings will raise
456
        IncompatibleFormat if the branch format they are given has
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
457
        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.
458
459
        If branch_format is None, the transport is returned with no 
460
        checking. if it is not None, then the returned transport is
461
        guaranteed to point to an existing directory ready for use.
462
        """
463
        raise NotImplementedError(self.get_branch_transport)
464
        
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
465
    def get_repository_transport(self, repository_format):
466
        """Get the transport for use by repository format in this BzrDir.
467
468
        Note that bzr dirs that do not support format strings will raise
469
        IncompatibleFormat if the repository format they are given has
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
470
        a format string, and vice versa.
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
471
472
        If repository_format is None, the transport is returned with no 
473
        checking. if it is not None, then the returned transport is
474
        guaranteed to point to an existing directory ready for use.
475
        """
476
        raise NotImplementedError(self.get_repository_transport)
477
        
1534.4.53 by Robert Collins
Review feedback from John Meinel.
478
    def get_workingtree_transport(self, tree_format):
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
479
        """Get the transport for use by workingtree format in this BzrDir.
480
481
        Note that bzr dirs that do not support format strings will raise
2100.3.11 by Aaron Bentley
Add join --reference support
482
        IncompatibleFormat if the workingtree format they are given has a
483
        format string, and vice versa.
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
484
485
        If workingtree_format is None, the transport is returned with no 
486
        checking. if it is not None, then the returned transport is
487
        guaranteed to point to an existing directory ready for use.
488
        """
489
        raise NotImplementedError(self.get_workingtree_transport)
490
        
1534.4.39 by Robert Collins
Basic BzrDir support.
491
    def __init__(self, _transport, _format):
492
        """Initialize a Bzr control dir object.
493
        
494
        Only really common logic should reside here, concrete classes should be
495
        made with varying behaviours.
496
1534.4.53 by Robert Collins
Review feedback from John Meinel.
497
        :param _format: the format that is creating this BzrDir instance.
498
        :param _transport: the transport this dir is based at.
1534.4.39 by Robert Collins
Basic BzrDir support.
499
        """
500
        self._format = _format
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
501
        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.
502
        self.root_transport = _transport
1534.4.39 by Robert Collins
Basic BzrDir support.
503
1713.1.9 by Robert Collins
Paired performance tuning of bzr add. (Robert Collins, Martin Pool).
504
    def is_control_filename(self, filename):
505
        """True if filename is the name of a path which is reserved for bzrdir's.
506
        
507
        :param filename: A filename within the root transport of this bzrdir.
508
509
        This is true IF and ONLY IF the filename is part of the namespace reserved
510
        for bzr control dirs. Currently this is the '.bzr' directory in the root
511
        of the root_transport. it is expected that plugins will need to extend
512
        this in the future - for instance to make bzr talk with svn working
513
        trees.
514
        """
515
        # this might be better on the BzrDirFormat class because it refers to 
516
        # all the possible bzrdir disk formats. 
517
        # This method is tested via the workingtree is_control_filename tests- 
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
518
        # it was extracted from WorkingTree.is_control_filename. If the methods
1713.1.9 by Robert Collins
Paired performance tuning of bzr add. (Robert Collins, Martin Pool).
519
        # contract is extended beyond the current trivial  implementation please
520
        # add new tests for it to the appropriate place.
521
        return filename == '.bzr' or filename.startswith('.bzr/')
522
1534.5.16 by Robert Collins
Review feedback.
523
    def needs_format_conversion(self, format=None):
524
        """Return true if this bzrdir needs convert_format run on it.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
525
        
526
        For instance, if the repository format is out of date but the 
527
        branch and working tree are not, this should return True.
1534.5.13 by Robert Collins
Correct buggy test.
528
529
        :param format: Optional parameter indicating a specific desired
1534.5.16 by Robert Collins
Review feedback.
530
                       format we plan to arrive at.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
531
        """
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.
532
        raise NotImplementedError(self.needs_format_conversion)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
533
1534.4.39 by Robert Collins
Basic BzrDir support.
534
    @staticmethod
535
    def open_unsupported(base):
536
        """Open a branch which is not supported."""
537
        return BzrDir.open(base, _unsupported=True)
538
        
539
    @staticmethod
2806.2.2 by Vincent Ladeuil
Fix #128076 and #131396 by reusing bound branch transport.
540
    def open(base, _unsupported=False, possible_transports=None):
1534.4.53 by Robert Collins
Review feedback from John Meinel.
541
        """Open an existing bzrdir, rooted at 'base' (url)
1534.4.39 by Robert Collins
Basic BzrDir support.
542
        
543
        _unsupported is a private parameter to the BzrDir class.
544
        """
2806.2.2 by Vincent Ladeuil
Fix #128076 and #131396 by reusing bound branch transport.
545
        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.
546
        return BzrDir.open_from_transport(t, _unsupported=_unsupported)
547
548
    @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.
549
    def open_from_transport(transport, _unsupported=False,
550
                            _server_formats=True):
1910.11.1 by Andrew Bennetts
Add BzrDir.open_from_transport, refactored from duplicate code, no explicit tests.
551
        """Open a bzrdir within a particular directory.
552
553
        :param transport: Transport containing the bzrdir.
554
        :param _unsupported: private.
555
        """
2164.2.21 by Vincent Ladeuil
Take bundles into account.
556
        base = transport.base
557
558
        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.
559
            return transport, BzrDirFormat.find_format(
560
                transport, _server_formats=_server_formats)
2164.2.21 by Vincent Ladeuil
Take bundles into account.
561
562
        def redirected(transport, e, redirection_notice):
563
            qualified_source = e.get_source_url()
564
            relpath = transport.relpath(qualified_source)
565
            if not e.target.endswith(relpath):
566
                # Not redirected to a branch-format, not a branch
567
                raise errors.NotBranchError(path=e.target)
568
            target = e.target[:-len(relpath)]
569
            note('%s is%s redirected to %s',
570
                 transport.base, e.permanently, target)
571
            # Let's try with a new transport
572
            qualified_target = e.get_target_url()[:-len(relpath)]
2164.2.22 by Vincent Ladeuil
Take Aaron's review comments into account.
573
            # FIXME: If 'transport' has a qualifier, this should
2164.2.21 by Vincent Ladeuil
Take bundles into account.
574
            # be applied again to the new transport *iff* the
575
            # schemes used are the same. It's a bit tricky to
576
            # verify, so I'll punt for now
577
            # -- vila20070212
578
            return get_transport(target)
579
2164.2.22 by Vincent Ladeuil
Take Aaron's review comments into account.
580
        try:
2164.2.28 by Vincent Ladeuil
TestingHTTPServer.test_case_server renamed from test_case to avoid confusions.
581
            transport, format = do_catching_redirections(find_format,
582
                                                         transport,
2164.2.22 by Vincent Ladeuil
Take Aaron's review comments into account.
583
                                                         redirected)
584
        except errors.TooManyRedirections:
585
            raise errors.NotBranchError(base)
2164.2.21 by Vincent Ladeuil
Take bundles into account.
586
1596.2.1 by Robert Collins
Fix BzrDir.open_containing of unsupported branches.
587
        BzrDir._check_supported(format, _unsupported)
1910.11.1 by Andrew Bennetts
Add BzrDir.open_from_transport, refactored from duplicate code, no explicit tests.
588
        return format.open(transport, _found=True)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
589
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
590
    def open_branch(self, unsupported=False):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
591
        """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.
592
593
        If unsupported is True, then no longer supported branch formats can
594
        still be opened.
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
595
        
596
        TODO: static convenience version of this?
597
        """
598
        raise NotImplementedError(self.open_branch)
1534.4.39 by Robert Collins
Basic BzrDir support.
599
600
    @staticmethod
2485.8.37 by Vincent Ladeuil
Fix merge multiple connections. Test suite *not* passing (sftp
601
    def open_containing(url, possible_transports=None):
1534.4.39 by Robert Collins
Basic BzrDir support.
602
        """Open an existing branch which contains url.
603
        
1534.6.3 by Robert Collins
find_repository sufficiently robust.
604
        :param url: url to search from.
1534.6.11 by Robert Collins
Review feedback.
605
        See open_containing_from_transport for more detail.
1534.6.3 by Robert Collins
find_repository sufficiently robust.
606
        """
2485.8.37 by Vincent Ladeuil
Fix merge multiple connections. Test suite *not* passing (sftp
607
        transport = get_transport(url, possible_transports)
608
        return BzrDir.open_containing_from_transport(transport)
1534.6.3 by Robert Collins
find_repository sufficiently robust.
609
    
610
    @staticmethod
1534.6.11 by Robert Collins
Review feedback.
611
    def open_containing_from_transport(a_transport):
1534.6.3 by Robert Collins
find_repository sufficiently robust.
612
        """Open an existing branch which contains a_transport.base
613
614
        This probes for a branch at a_transport, and searches upwards from there.
1534.4.39 by Robert Collins
Basic BzrDir support.
615
616
        Basically we keep looking up until we find the control directory or
617
        run into the root.  If there isn't one, raises NotBranchError.
618
        If there is one and it is either an unrecognised format or an unsupported 
619
        format, UnknownFormatError or UnsupportedFormatError are raised.
620
        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
621
1685.1.28 by John Arbash Meinel
Changing open_containing to always return a unicode path.
622
        :return: The BzrDir that contains the path, and a Unicode path 
623
                for the rest of the URL.
1534.4.39 by Robert Collins
Basic BzrDir support.
624
        """
625
        # this gets the normalised url back. I.e. '.' -> the full path.
1534.6.3 by Robert Collins
find_repository sufficiently robust.
626
        url = a_transport.base
1534.4.39 by Robert Collins
Basic BzrDir support.
627
        while True:
628
            try:
1910.11.1 by Andrew Bennetts
Add BzrDir.open_from_transport, refactored from duplicate code, no explicit tests.
629
                result = BzrDir.open_from_transport(a_transport)
630
                return result, urlutils.unescape(a_transport.relpath(url))
1534.4.39 by Robert Collins
Basic BzrDir support.
631
            except errors.NotBranchError, e:
1685.1.60 by Martin Pool
[broken] NotBranchError should unescape the url if possible
632
                pass
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
633
            try:
634
                new_t = a_transport.clone('..')
635
            except errors.InvalidURLJoin:
636
                # reached the root, whatever that may be
637
                raise errors.NotBranchError(path=url)
1534.6.3 by Robert Collins
find_repository sufficiently robust.
638
            if new_t.base == a_transport.base:
1534.4.39 by Robert Collins
Basic BzrDir support.
639
                # reached the root, whatever that may be
640
                raise errors.NotBranchError(path=url)
1534.6.3 by Robert Collins
find_repository sufficiently robust.
641
            a_transport = new_t
1534.4.39 by Robert Collins
Basic BzrDir support.
642
2215.3.2 by Aaron Bentley
Add open_containing_tree_or_branch
643
    @classmethod
644
    def open_containing_tree_or_branch(klass, location):
645
        """Return the branch and working tree contained by a location.
646
647
        Returns (tree, branch, relpath).
648
        If there is no tree at containing the location, tree will be None.
649
        If there is no branch containing the location, an exception will be
650
        raised
651
        relpath is the portion of the path that is contained by the branch.
652
        """
653
        bzrdir, relpath = klass.open_containing(location)
654
        try:
655
            tree = bzrdir.open_workingtree()
2215.3.5 by Aaron Bentley
Add support for remote ls
656
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2215.3.2 by Aaron Bentley
Add open_containing_tree_or_branch
657
            tree = None
658
            branch = bzrdir.open_branch()
659
        else:
660
            branch = tree.branch
661
        return tree, branch, relpath
662
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
663
    def open_repository(self, _unsupported=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
664
        """Open the repository object at this BzrDir if one is present.
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
665
666
        This will not follow the Branch object pointer - its strictly a direct
667
        open facility. Most client code should use open_branch().repository to
668
        get at a repository.
669
670
        _unsupported is 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.
671
        TODO: static convenience version of this?
672
        """
673
        raise NotImplementedError(self.open_repository)
674
2400.2.2 by Robert Collins
Document BzrDir.open_workingtree's new recommend_upgrade parameter.
675
    def open_workingtree(self, _unsupported=False,
676
            recommend_upgrade=True):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
677
        """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.
678
679
        :param recommend_upgrade: Optional keyword parameter, when True (the
680
            default), emit through the ui module a recommendation that the user
681
            upgrade the working tree when the workingtree being opened is old
682
            (but still fully supported).
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
683
        """
684
        raise NotImplementedError(self.open_workingtree)
685
1662.1.19 by Martin Pool
Better error message when initting existing tree
686
    def has_branch(self):
687
        """Tell if this bzrdir contains a branch.
688
        
689
        Note: if you're going to open the branch, you should just go ahead
690
        and try, and not ask permission first.  (This method just opens the 
691
        branch and discards it, and that's somewhat expensive.) 
692
        """
693
        try:
694
            self.open_branch()
695
            return True
696
        except errors.NotBranchError:
697
            return False
698
699
    def has_workingtree(self):
700
        """Tell if this bzrdir contains a working tree.
701
702
        This will still raise an exception if the bzrdir has a workingtree that
703
        is remote & inaccessible.
704
        
705
        Note: if you're going to open the working tree, you should just go ahead
706
        and try, and not ask permission first.  (This method just opens the 
707
        workingtree and discards it, and that's somewhat expensive.) 
708
        """
709
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
710
            self.open_workingtree(recommend_upgrade=False)
1662.1.19 by Martin Pool
Better error message when initting existing tree
711
            return True
712
        except errors.NoWorkingTree:
713
            return False
714
2018.5.96 by Andrew Bennetts
Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's
715
    def _cloning_metadir(self):
1910.2.41 by Aaron Bentley
Clean up clone format creation
716
        """Produce a metadir suitable for cloning with"""
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
717
        result_format = self._format.__class__()
718
        try:
1910.2.41 by Aaron Bentley
Clean up clone format creation
719
            try:
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
720
                branch = self.open_branch()
721
                source_repository = branch.repository
1910.2.41 by Aaron Bentley
Clean up clone format creation
722
            except errors.NotBranchError:
723
                source_branch = None
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
724
                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.
725
        except errors.NoRepositoryPresent:
2100.3.24 by Aaron Bentley
Get all tests passing again
726
            source_repository = None
2305.3.1 by Andrew Bennetts
Tidy up BzrDir.cloning_metadir: bogus try/except, and basis argument isn't actually used.
727
        else:
2018.5.138 by Robert Collins
Merge bzr.dev.
728
            # XXX TODO: This isinstance is here because we have not implemented
729
            # the fix recommended in bug # 103195 - to delegate this choice the
730
            # repository itself.
2018.5.94 by Andrew Bennetts
Various small changes in aid of making tests pass (including deleting one invalid test).
731
            repo_format = source_repository._format
732
            if not isinstance(repo_format, remote.RemoteRepositoryFormat):
733
                result_format.repository_format = repo_format
2100.3.28 by Aaron Bentley
Make sprout recursive
734
        try:
2323.5.19 by Martin Pool
No upgrade recommendation on source when cloning
735
            # TODO: Couldn't we just probe for the format in these cases,
736
            # rather than opening the whole tree?  It would be a little
737
            # faster. mbp 20070401
738
            tree = self.open_workingtree(recommend_upgrade=False)
2100.3.28 by Aaron Bentley
Make sprout recursive
739
        except (errors.NoWorkingTree, errors.NotLocalUrl):
740
            result_format.workingtree_format = None
741
        else:
742
            result_format.workingtree_format = tree._format.__class__()
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
743
        return result_format, source_repository
744
2018.5.96 by Andrew Bennetts
Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's
745
    def cloning_metadir(self):
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
746
        """Produce a metadir suitable for cloning or sprouting with.
1910.2.41 by Aaron Bentley
Clean up clone format creation
747
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
748
        These operations may produce workingtrees (yes, even though they're
749
        "cloning" something that doesn't have a tree, so a viable workingtree
750
        format must be selected.
751
        """
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
752
        format, repository = self._cloning_metadir()
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
753
        if format._workingtree_format is None:
2100.3.34 by Aaron Bentley
Fix BzrDir.cloning_metadir with no format
754
            if repository is None:
755
                return format
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
756
            tree_format = repository._format._matchingbzrdir.workingtree_format
2100.3.28 by Aaron Bentley
Make sprout recursive
757
            format.workingtree_format = tree_format.__class__()
2100.3.21 by Aaron Bentley
Work on checking out by-reference trees
758
        return format
759
2100.3.32 by Aaron Bentley
fix tree format, basis_tree call, in sprout
760
    def checkout_metadir(self):
761
        return self.cloning_metadir()
762
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
763
    def sprout(self, url, revision_id=None, force_new_repo=False,
2485.8.56 by Vincent Ladeuil
Fix bug #112173 and bzr branch multiple connections.
764
               recurse='down', possible_transports=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.
765
        """Create a copy of this bzrdir prepared for use as a new line of
766
        development.
767
768
        If urls last component does not exist, it will be created.
769
770
        Attributes related to the identity of the source branch like
771
        branch nickname will be cleaned, a working tree is created
772
        whether one existed before or not; and a local branch is always
773
        created.
774
775
        if revision_id is not None, then the clone operation may tune
776
            itself to download less data.
777
        """
2485.8.56 by Vincent Ladeuil
Fix bug #112173 and bzr branch multiple connections.
778
        target_transport = get_transport(url, possible_transports)
2475.3.3 by John Arbash Meinel
Change calls to try/mkdir('.')/except FileExists to ensure_base()
779
        target_transport.ensure_base()
2305.3.1 by Andrew Bennetts
Tidy up BzrDir.cloning_metadir: bogus try/except, and basis argument isn't actually used.
780
        cloning_format = self.cloning_metadir()
2475.3.1 by John Arbash Meinel
Fix bug #75721. Update the BzrDir api to add clone_on_transport()
781
        result = cloning_format.initialize_on_transport(target_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.
782
        try:
783
            source_branch = self.open_branch()
784
            source_repository = source_branch.repository
785
        except errors.NotBranchError:
786
            source_branch = None
787
            try:
788
                source_repository = self.open_repository()
789
            except errors.NoRepositoryPresent:
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
790
                source_repository = None
1534.6.9 by Robert Collins
sprouting into shared repositories
791
        if force_new_repo:
792
            result_repo = None
793
        else:
794
            try:
795
                result_repo = result.find_repository()
796
            except errors.NoRepositoryPresent:
797
                result_repo = None
798
        if source_repository is None and result_repo is not None:
799
            pass
800
        elif source_repository is None and result_repo is None:
801
            # no repo available, make a new one
802
            result.create_repository()
803
        elif source_repository is not None and result_repo is None:
1707.1.1 by Robert Collins
Bugfixes to bzrdir.sprout and clone. Sprout was failing to reset the
804
            # have source, and want to make a new target repo
2485.8.56 by Vincent Ladeuil
Fix bug #112173 and bzr branch multiple connections.
805
            result_repo = source_repository.sprout(result,
806
                                                   revision_id=revision_id)
2440.1.1 by Martin Pool
Add new Repository.sprout,
807
        else:
1534.6.9 by Robert Collins
sprouting into shared repositories
808
            # fetch needed content into target.
1910.4.10 by Andrew Bennetts
Skip various test_sprout* tests when sprouting to non-local bzrdirs that can't have working trees; plus fix a test method naming clash and the bug it revealed in bzrdir.sprout.
809
            if source_repository is not None:
2018.18.20 by Martin Pool
Route branch operations through remote copy_content_into
810
                # would rather do 
2485.8.56 by Vincent Ladeuil
Fix bug #112173 and bzr branch multiple connections.
811
                # source_repository.copy_content_into(result_repo,
812
                #                                     revision_id=revision_id)
2018.18.20 by Martin Pool
Route branch operations through remote copy_content_into
813
                # so we can override the copy method
1910.4.10 by Andrew Bennetts
Skip various test_sprout* tests when sprouting to non-local bzrdirs that can't have working trees; plus fix a test method naming clash and the bug it revealed in bzrdir.sprout.
814
                result_repo.fetch(source_repository, 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.
815
        if source_branch is not None:
816
            source_branch.sprout(result, revision_id=revision_id)
817
        else:
818
            result.create_branch()
2485.8.56 by Vincent Ladeuil
Fix bug #112173 and bzr branch multiple connections.
819
        if isinstance(target_transport, LocalTransport) and (
820
            result_repo is None or result_repo.make_working_trees()):
1731.1.33 by Aaron Bentley
Revert no-special-root changes
821
            wt = result.create_workingtree()
2255.2.77 by Robert Collins
Tune working inventory generation more: walk the blocks, skipping deleted rows.
822
            wt.lock_write()
823
            try:
824
                if wt.path2id('') is None:
825
                    try:
826
                        wt.set_root_id(self.open_workingtree.get_root_id())
827
                    except errors.NoWorkingTree:
828
                        pass
829
            finally:
830
                wt.unlock()
2100.3.28 by Aaron Bentley
Make sprout recursive
831
        else:
832
            wt = None
833
        if recurse == 'down':
834
            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.
835
                basis = wt.basis_tree()
836
                basis.lock_read()
837
                subtrees = basis.iter_references()
2100.3.28 by Aaron Bentley
Make sprout recursive
838
                recurse_branch = wt.branch
839
            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.
840
                basis = source_branch.basis_tree()
841
                basis.lock_read()
842
                subtrees = basis.iter_references()
2100.3.28 by Aaron Bentley
Make sprout recursive
843
                recurse_branch = source_branch
844
            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.
845
                subtrees = []
846
                basis = None
847
            try:
848
                for path, file_id in subtrees:
849
                    target = urlutils.join(url, urlutils.escape(path))
850
                    sublocation = source_branch.reference_parent(file_id, path)
851
                    sublocation.bzrdir.sprout(target,
852
                        basis.get_reference_revision(file_id, path),
853
                        force_new_repo=force_new_repo, recurse=recurse)
854
            finally:
855
                if basis is not None:
856
                    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.
857
        return result
858
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
859
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
860
class BzrDirPreSplitOut(BzrDir):
861
    """A common class for the all-in-one formats."""
862
1534.5.3 by Robert Collins
Make format 4/5/6 branches share a single LockableFiles instance across wt/branch/repository.
863
    def __init__(self, _transport, _format):
864
        """See BzrDir.__init__."""
865
        super(BzrDirPreSplitOut, self).__init__(_transport, _format)
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
866
        assert self._format._lock_class == lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
867
        assert self._format._lock_file_name == 'branch-lock'
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
868
        self._control_files = lockable_files.LockableFiles(
869
                                            self.get_branch_transport(None),
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
870
                                            self._format._lock_file_name,
871
                                            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.
872
1687.1.12 by Robert Collins
Hook in the full break-lock ui.
873
    def break_lock(self):
874
        """Pre-splitout bzrdirs do not suffer from stale locks."""
875
        raise NotImplementedError(self.break_lock)
876
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
877
    def clone(self, url, revision_id=None, force_new_repo=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.
878
        """See BzrDir.clone()."""
879
        from bzrlib.workingtree import WorkingTreeFormat2
880
        self._make_tail(url)
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
881
        result = self._format._initialize_for_clone(url)
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
882
        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)
883
        from_branch = self.open_branch()
884
        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.
885
        try:
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
886
            self.open_workingtree().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.
887
        except errors.NotLocalUrl:
888
            # make a new one, this format always has to have one.
1563.2.38 by Robert Collins
make push preserve tree formats.
889
            try:
890
                WorkingTreeFormat2().initialize(result)
891
            except errors.NotLocalUrl:
1692.7.9 by Martin Pool
Don't create broken standalone branches over sftp (Malone #43064)
892
                # but we cannot do it for remote trees.
893
                to_branch = result.open_branch()
894
                WorkingTreeFormat2().stub_initialize_remote(to_branch.control_files)
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.
895
        return result
896
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
897
    def create_branch(self):
898
        """See BzrDir.create_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.
899
        return self.open_branch()
900
2796.2.6 by Aaron Bentley
Implement destroy_branch
901
    def destroy_branch(self):
2796.2.16 by Aaron Bentley
Documentation updates from review
902
        """See BzrDir.destroy_branch."""
2796.2.6 by Aaron Bentley
Implement destroy_branch
903
        raise errors.UnsupportedOperation(self.destroy_branch, self)
904
1534.6.1 by Robert Collins
allow API creation of shared repositories
905
    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.
906
        """See BzrDir.create_repository."""
1534.6.1 by Robert Collins
allow API creation of shared repositories
907
        if shared:
908
            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.
909
        return self.open_repository()
910
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
911
    def create_workingtree(self, revision_id=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.
912
        """See BzrDir.create_workingtree."""
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
913
        # this looks buggy but is not -really-
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
914
        # because this format creates the workingtree when the bzrdir is
915
        # created
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
916
        # clone and sprout will have set the revision_id
917
        # and that will have set it for us, its only
918
        # specific uses of create_workingtree in isolation
919
        # that can do wonky stuff here, and that only
920
        # happens for creating checkouts, which cannot be 
921
        # done on this format anyway. So - acceptable wart.
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
922
        result = self.open_workingtree(recommend_upgrade=False)
1508.1.24 by Robert Collins
Add update command for use with checkouts.
923
        if revision_id is not None:
1996.3.12 by John Arbash Meinel
Change how 'revision' is imported to avoid problems later
924
            if revision_id == _mod_revision.NULL_REVISION:
1551.8.20 by Aaron Bentley
Fix BzrDir.create_workingtree for NULL_REVISION
925
                result.set_parent_ids([])
926
            else:
927
                result.set_parent_ids([revision_id])
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
928
        return result
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
929
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
930
    def destroy_workingtree(self):
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
931
        """See BzrDir.destroy_workingtree."""
932
        raise errors.UnsupportedOperation(self.destroy_workingtree, self)
933
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
934
    def destroy_workingtree_metadata(self):
935
        """See BzrDir.destroy_workingtree_metadata."""
936
        raise errors.UnsupportedOperation(self.destroy_workingtree_metadata, 
937
                                          self)
938
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
939
    def get_branch_transport(self, branch_format):
940
        """See BzrDir.get_branch_transport()."""
941
        if branch_format is None:
942
            return self.transport
943
        try:
944
            branch_format.get_format_string()
945
        except NotImplementedError:
946
            return self.transport
947
        raise errors.IncompatibleFormat(branch_format, self._format)
948
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
949
    def get_repository_transport(self, repository_format):
950
        """See BzrDir.get_repository_transport()."""
951
        if repository_format is None:
952
            return self.transport
953
        try:
954
            repository_format.get_format_string()
955
        except NotImplementedError:
956
            return self.transport
957
        raise errors.IncompatibleFormat(repository_format, self._format)
958
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
959
    def get_workingtree_transport(self, workingtree_format):
960
        """See BzrDir.get_workingtree_transport()."""
961
        if workingtree_format is None:
962
            return self.transport
963
        try:
964
            workingtree_format.get_format_string()
965
        except NotImplementedError:
966
            return self.transport
967
        raise errors.IncompatibleFormat(workingtree_format, self._format)
968
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.
969
    def needs_format_conversion(self, format=None):
970
        """See BzrDir.needs_format_conversion()."""
971
        # if the format is not the same as the system default,
972
        # an upgrade is needed.
973
        if format is None:
974
            format = BzrDirFormat.get_default_format()
975
        return not isinstance(self._format, format.__class__)
976
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
977
    def open_branch(self, unsupported=False):
978
        """See BzrDir.open_branch."""
979
        from bzrlib.branch import BzrBranchFormat4
980
        format = BzrBranchFormat4()
981
        self._check_supported(format, unsupported)
982
        return format.open(self, _found=True)
983
2485.8.56 by Vincent Ladeuil
Fix bug #112173 and bzr branch multiple connections.
984
    def sprout(self, url, revision_id=None, force_new_repo=False,
985
               possible_transports=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.
986
        """See BzrDir.sprout()."""
987
        from bzrlib.workingtree import WorkingTreeFormat2
988
        self._make_tail(url)
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
989
        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.
990
        try:
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
991
            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.
992
        except errors.NoRepositoryPresent:
993
            pass
994
        try:
995
            self.open_branch().sprout(result, revision_id=revision_id)
996
        except errors.NotBranchError:
997
            pass
1587.1.5 by Robert Collins
Put bzr branch behaviour back to the 0.7 ignore-working-tree state.
998
        # we always want a working tree
999
        WorkingTreeFormat2().initialize(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.
1000
        return result
1001
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1002
1003
class BzrDir4(BzrDirPreSplitOut):
1508.1.25 by Robert Collins
Update per review comments.
1004
    """A .bzr version 4 control object.
1005
    
1006
    This is a deprecated format and may be removed after sept 2006.
1007
    """
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1008
1534.6.1 by Robert Collins
allow API creation of shared repositories
1009
    def create_repository(self, shared=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1010
        """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.
1011
        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.
1012
1534.5.16 by Robert Collins
Review feedback.
1013
    def needs_format_conversion(self, format=None):
1014
        """Format 4 dirs are always in need of conversion."""
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1015
        return True
1016
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1017
    def open_repository(self):
1018
        """See BzrDir.open_repository."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1019
        from bzrlib.repofmt.weaverepo import RepositoryFormat4
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1020
        return RepositoryFormat4().open(self, _found=True)
1021
1022
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1023
class BzrDir5(BzrDirPreSplitOut):
1508.1.25 by Robert Collins
Update per review comments.
1024
    """A .bzr version 5 control object.
1025
1026
    This is a deprecated format and may be removed after sept 2006.
1027
    """
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1028
1029
    def open_repository(self):
1030
        """See BzrDir.open_repository."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1031
        from bzrlib.repofmt.weaverepo import RepositoryFormat5
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1032
        return RepositoryFormat5().open(self, _found=True)
1033
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1034
    def open_workingtree(self, _unsupported=False,
1035
            recommend_upgrade=True):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1036
        """See BzrDir.create_workingtree."""
1037
        from bzrlib.workingtree import WorkingTreeFormat2
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1038
        wt_format = WorkingTreeFormat2()
1039
        # we don't warn here about upgrades; that ought to be handled for the
1040
        # bzrdir as a whole
1041
        return wt_format.open(self, _found=True)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1042
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1043
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1044
class BzrDir6(BzrDirPreSplitOut):
1508.1.25 by Robert Collins
Update per review comments.
1045
    """A .bzr version 6 control object.
1046
1047
    This is a deprecated format and may be removed after sept 2006.
1048
    """
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1049
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1050
    def open_repository(self):
1051
        """See BzrDir.open_repository."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1052
        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.
1053
        return RepositoryFormat6().open(self, _found=True)
1054
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1055
    def open_workingtree(self, _unsupported=False,
1056
        recommend_upgrade=True):
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1057
        """See BzrDir.create_workingtree."""
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1058
        # we don't warn here about upgrades; that ought to be handled for the
1059
        # 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.
1060
        from bzrlib.workingtree import WorkingTreeFormat2
1061
        return WorkingTreeFormat2().open(self, _found=True)
1062
1063
1064
class BzrDirMeta1(BzrDir):
1065
    """A .bzr meta version 1 control object.
1066
    
1067
    This is the first control object where the 
1553.5.67 by Martin Pool
doc
1068
    individual aspects are really split out: there are separate repository,
1069
    workingtree and branch subdirectories and any subset of the three can be
1070
    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.
1071
    """
1072
1534.5.16 by Robert Collins
Review feedback.
1073
    def can_convert_format(self):
1074
        """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.
1075
        return True
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1076
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1077
    def create_branch(self):
1078
        """See BzrDir.create_branch."""
2230.3.55 by Aaron Bentley
Updates from review
1079
        return self._format.get_branch_format().initialize(self)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1080
2796.2.6 by Aaron Bentley
Implement destroy_branch
1081
    def destroy_branch(self):
1082
        """See BzrDir.create_branch."""
1083
        self.transport.delete_tree('branch')
1084
1534.6.1 by Robert Collins
allow API creation of shared repositories
1085
    def create_repository(self, shared=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1086
        """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.
1087
        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.
1088
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1089
    def create_workingtree(self, revision_id=None):
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1090
        """See BzrDir.create_workingtree."""
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1091
        from bzrlib.workingtree import WorkingTreeFormat
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
1092
        return self._format.workingtree_format.initialize(self, revision_id)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1093
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1094
    def destroy_workingtree(self):
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
1095
        """See BzrDir.destroy_workingtree."""
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1096
        wt = self.open_workingtree(recommend_upgrade=False)
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1097
        repository = wt.branch.repository
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
1098
        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'
1099
        wt.revert(old_tree=empty)
1551.8.37 by Aaron Bentley
Cleaner implementation of destroy_working_tree
1100
        self.destroy_workingtree_metadata()
1101
1102
    def destroy_workingtree_metadata(self):
1103
        self.transport.delete_tree('checkout')
1551.8.36 by Aaron Bentley
Introduce BzrDir.destroy_workingtree
1104
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
1105
    def find_branch_format(self):
1106
        """Find the branch 'format' for this bzrdir.
1107
1108
        This might be a synthetic object for e.g. RemoteBranch and SVN.
1109
        """
1110
        from bzrlib.branch import BranchFormat
1111
        return BranchFormat.find_format(self)
1112
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1113
    def _get_mkdir_mode(self):
1114
        """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
1115
        temp_control = lockable_files.LockableFiles(self.transport, '',
1116
                                     lockable_files.TransportLock)
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1117
        return temp_control._dir_mode
1118
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
1119
    def get_branch_reference(self):
1120
        """See BzrDir.get_branch_reference()."""
1121
        from bzrlib.branch import BranchFormat
1122
        format = BranchFormat.find_format(self)
1123
        return format.get_reference(self)
1124
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1125
    def get_branch_transport(self, branch_format):
1126
        """See BzrDir.get_branch_transport()."""
1127
        if branch_format is None:
1128
            return self.transport.clone('branch')
1129
        try:
1130
            branch_format.get_format_string()
1131
        except NotImplementedError:
1132
            raise errors.IncompatibleFormat(branch_format, self._format)
1133
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1134
            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.
1135
        except errors.FileExists:
1136
            pass
1137
        return self.transport.clone('branch')
1138
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1139
    def get_repository_transport(self, repository_format):
1140
        """See BzrDir.get_repository_transport()."""
1141
        if repository_format is None:
1142
            return self.transport.clone('repository')
1143
        try:
1144
            repository_format.get_format_string()
1145
        except NotImplementedError:
1146
            raise errors.IncompatibleFormat(repository_format, self._format)
1147
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1148
            self.transport.mkdir('repository', mode=self._get_mkdir_mode())
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1149
        except errors.FileExists:
1150
            pass
1151
        return self.transport.clone('repository')
1152
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
1153
    def get_workingtree_transport(self, workingtree_format):
1154
        """See BzrDir.get_workingtree_transport()."""
1155
        if workingtree_format is None:
1156
            return self.transport.clone('checkout')
1157
        try:
1158
            workingtree_format.get_format_string()
1159
        except NotImplementedError:
1160
            raise errors.IncompatibleFormat(workingtree_format, self._format)
1161
        try:
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1162
            self.transport.mkdir('checkout', mode=self._get_mkdir_mode())
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
1163
        except errors.FileExists:
1164
            pass
1165
        return self.transport.clone('checkout')
1166
1534.5.16 by Robert Collins
Review feedback.
1167
    def needs_format_conversion(self, format=None):
1168
        """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.
1169
        if format is None:
1170
            format = BzrDirFormat.get_default_format()
1171
        if not isinstance(self._format, format.__class__):
1172
            # it is not a meta dir format, conversion is needed.
1173
            return True
1174
        # we might want to push this down to the repository?
1175
        try:
1176
            if not isinstance(self.open_repository()._format,
1177
                              format.repository_format.__class__):
1178
                # the repository needs an upgrade.
1179
                return True
1180
        except errors.NoRepositoryPresent:
1181
            pass
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
1182
        try:
1183
            if not isinstance(self.open_branch()._format,
2230.3.55 by Aaron Bentley
Updates from review
1184
                              format.get_branch_format().__class__):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1185
                # the branch needs an upgrade.
1186
                return True
1187
        except errors.NotBranchError:
1188
            pass
1189
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1190
            my_wt = self.open_workingtree(recommend_upgrade=False)
1191
            if not isinstance(my_wt._format,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1192
                              format.workingtree_format.__class__):
1193
                # the workingtree needs an upgrade.
1194
                return True
2255.2.196 by Robert Collins
Fix test_upgrade defects related to non local or absent working trees.
1195
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
1196
            pass
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1197
        return False
1198
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1199
    def open_branch(self, unsupported=False):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1200
        """See BzrDir.open_branch."""
2414.2.1 by Andrew Bennetts
Some miscellaneous new APIs, tests and other changes from the hpss branch.
1201
        format = self.find_branch_format()
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1202
        self._check_supported(format, unsupported)
1203
        return format.open(self, _found=True)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
1204
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1205
    def open_repository(self, unsupported=False):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1206
        """See BzrDir.open_repository."""
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
1207
        from bzrlib.repository import RepositoryFormat
1208
        format = RepositoryFormat.find_format(self)
1209
        self._check_supported(format, unsupported)
1210
        return format.open(self, _found=True)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1211
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1212
    def open_workingtree(self, unsupported=False,
1213
            recommend_upgrade=True):
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
1214
        """See BzrDir.open_workingtree."""
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1215
        from bzrlib.workingtree import WorkingTreeFormat
1216
        format = WorkingTreeFormat.find_format(self)
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
1217
        self._check_supported(format, unsupported,
1218
            recommend_upgrade,
2323.6.5 by Martin Pool
Recommended-upgrade message should give base dir not the control dir url
1219
            basedir=self.root_transport.base)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
1220
        return format.open(self, _found=True)
1534.4.42 by Robert Collins
add working tree to the BzrDir facilities.
1221
1534.4.39 by Robert Collins
Basic BzrDir support.
1222
1223
class BzrDirFormat(object):
1224
    """An encapsulation of the initialization and open routines for a format.
1225
1226
    Formats provide three things:
1227
     * An initialization routine,
1228
     * a format string,
1229
     * an open routine.
1230
1231
    Formats are placed in an dict by their format string for reference 
1232
    during bzrdir opening. These should be subclasses of BzrDirFormat
1233
    for consistency.
1234
1235
    Once a format is deprecated, just deprecate the initialize and open
1236
    methods on the format class. Do not deprecate the object, as the 
1237
    object will be created every system load.
1238
    """
1239
1240
    _default_format = None
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1241
    """The default format used for new .bzr dirs."""
1534.4.39 by Robert Collins
Basic BzrDir support.
1242
1243
    _formats = {}
1244
    """The known formats."""
1245
1733.1.7 by Jelmer Vernooij
Change set of control dir formats to list.
1246
    _control_formats = []
1733.1.6 by Jelmer Vernooij
Fix a couple of minor issues after review by Martin.
1247
    """The registered control formats - .bzr, ....
1248
    
1733.1.7 by Jelmer Vernooij
Change set of control dir formats to list.
1249
    This is a list of BzrDirFormat objects.
1733.1.6 by Jelmer Vernooij
Fix a couple of minor issues after review by Martin.
1250
    """
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1251
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.
1252
    _control_server_formats = []
1253
    """The registered control server formats, e.g. RemoteBzrDirs.
1254
1255
    This is a list of BzrDirFormat objects.
1256
    """
1257
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1258
    _lock_file_name = 'branch-lock'
1259
1260
    # _lock_class must be set in subclasses to the lock type, typ.
1261
    # TransportLock or LockDir
1262
1534.4.39 by Robert Collins
Basic BzrDir support.
1263
    @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.
1264
    def find_format(klass, transport, _server_formats=True):
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1265
        """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.
1266
        if _server_formats:
1267
            formats = klass._control_server_formats + klass._control_formats
1268
        else:
1269
            formats = klass._control_formats
1270
        for format in formats:
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1271
            try:
1272
                return format.probe_transport(transport)
1273
            except errors.NotBranchError:
1274
                # this format does not find a control dir here.
1275
                pass
1276
        raise errors.NotBranchError(path=transport.base)
1277
1278
    @classmethod
1279
    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.
1280
        """Return the .bzrdir style format present in a directory."""
1534.4.39 by Robert Collins
Basic BzrDir support.
1281
        try:
2164.2.18 by Vincent Ladeuil
Take Aaron comments into account.
1282
            format_string = transport.get(".bzr/branch-format").read()
1733.2.3 by Michael Ellerman
Don't coallesce try blocks, it can lead to confusing exceptions.
1283
        except errors.NoSuchFile:
1284
            raise errors.NotBranchError(path=transport.base)
1285
1286
        try:
1534.4.39 by Robert Collins
Basic BzrDir support.
1287
            return klass._formats[format_string]
1288
        except KeyError:
1740.5.6 by Martin Pool
Clean up many exception classes.
1289
            raise errors.UnknownFormatError(format=format_string)
1534.4.39 by Robert Collins
Basic BzrDir support.
1290
1291
    @classmethod
1292
    def get_default_format(klass):
1293
        """Return the current default format."""
1294
        return klass._default_format
1295
1296
    def get_format_string(self):
1297
        """Return the ASCII format string that identifies this format."""
1298
        raise NotImplementedError(self.get_format_string)
1299
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
1300
    def get_format_description(self):
1301
        """Return the short description for this format."""
1302
        raise NotImplementedError(self.get_format_description)
1303
1534.5.16 by Robert Collins
Review feedback.
1304
    def get_converter(self, format=None):
1305
        """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.
1306
1307
        This returns a bzrlib.bzrdir.Converter object.
1308
1309
        This should return the best upgrader to step this format towards the
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
1310
        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.
1311
        some means for them to extend the range of returnable converters.
1534.5.13 by Robert Collins
Correct buggy test.
1312
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
1313
        :param format: Optional format to override the default format of the 
1534.5.13 by Robert Collins
Correct buggy test.
1314
                       library.
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1315
        """
1534.5.16 by Robert Collins
Review feedback.
1316
        raise NotImplementedError(self.get_converter)
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1317
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
1318
    def initialize(self, url, possible_transports=None):
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1319
        """Create a bzr control dir at this url and return an opened copy.
1320
        
1321
        Subclasses should typically override initialize_on_transport
1322
        instead of this method.
1323
        """
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
1324
        return self.initialize_on_transport(get_transport(url,
1325
                                                          possible_transports))
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1326
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1327
    def initialize_on_transport(self, transport):
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1328
        """Initialize a new bzrdir in the base directory of a Transport."""
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
1329
        # Since we don't have a .bzr directory, inherit the
1534.4.39 by Robert Collins
Basic BzrDir support.
1330
        # mode from the root directory
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1331
        temp_control = lockable_files.LockableFiles(transport,
1332
                            '', lockable_files.TransportLock)
1534.4.39 by Robert Collins
Basic BzrDir support.
1333
        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.
1334
                                      # FIXME: RBC 20060121 don't peek under
1534.4.39 by Robert Collins
Basic BzrDir support.
1335
                                      # the covers
1336
                                      mode=temp_control._dir_mode)
1337
        file_mode = temp_control._file_mode
1338
        del temp_control
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1339
        mutter('created control directory in ' + transport.base)
1340
        control = transport.clone('.bzr')
1534.4.39 by Robert Collins
Basic BzrDir support.
1341
        utf8_files = [('README', 
1342
                       "This is a Bazaar-NG control directory.\n"
1343
                       "Do not change any files in this directory.\n"),
1344
                      ('branch-format', self.get_format_string()),
1345
                      ]
1346
        # NB: no need to escape relative paths that are url safe.
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1347
        control_files = lockable_files.LockableFiles(control,
1348
                            self._lock_file_name, self._lock_class)
1553.5.60 by Martin Pool
New LockableFiles.create_lock() method
1349
        control_files.create_lock()
1534.4.39 by Robert Collins
Basic BzrDir support.
1350
        control_files.lock_write()
1351
        try:
1352
            for file, content in utf8_files:
1353
                control_files.put_utf8(file, content)
1354
        finally:
1355
            control_files.unlock()
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1356
        return self.open(transport, _found=True)
1534.4.39 by Robert Collins
Basic BzrDir support.
1357
1358
    def is_supported(self):
1359
        """Is this format supported?
1360
1361
        Supported formats must be initializable and openable.
1362
        Unsupported formats may not support initialization or committing or 
1363
        some other features depending on the reason for not being supported.
1364
        """
1365
        return True
1366
1910.2.14 by Aaron Bentley
Fail when trying to use interrepository on Knit2 and Knit1
1367
    def same_model(self, target_format):
1368
        return (self.repository_format.rich_root_data == 
1369
            target_format.rich_root_data)
1370
1733.1.3 by Robert Collins
Extend the test suite to run bzrdir conformance tests on non .bzr based control dirs.
1371
    @classmethod
1372
    def known_formats(klass):
1373
        """Return all the known formats.
1374
        
1375
        Concrete formats should override _known_formats.
1376
        """
1733.1.6 by Jelmer Vernooij
Fix a couple of minor issues after review by Martin.
1377
        # There is double indirection here to make sure that control 
1378
        # formats used by more than one dir format will only be probed 
1379
        # 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.
1380
        result = set()
1381
        for format in klass._control_formats:
1382
            result.update(format._known_formats())
1383
        return result
1384
    
1385
    @classmethod
1386
    def _known_formats(klass):
1387
        """Return the known format instances for this control format."""
1388
        return set(klass._formats.values())
1389
1534.4.39 by Robert Collins
Basic BzrDir support.
1390
    def open(self, transport, _found=False):
1391
        """Return an instance of this format for the dir transport points at.
1392
        
1393
        _found is a private parameter, do not use it.
1394
        """
1395
        if not _found:
2090.2.2 by Martin Pool
Fix an assertion with side effects
1396
            found_format = BzrDirFormat.find_format(transport)
1397
            if not isinstance(found_format, self.__class__):
1398
                raise AssertionError("%s was asked to open %s, but it seems to need "
1399
                        "format %s" 
1400
                        % (self, transport, found_format))
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1401
        return self._open(transport)
1402
1403
    def _open(self, transport):
1404
        """Template method helper for opening BzrDirectories.
1405
1406
        This performs the actual open and any additional logic or parameter
1407
        passing.
1408
        """
1409
        raise NotImplementedError(self._open)
1534.4.39 by Robert Collins
Basic BzrDir support.
1410
1411
    @classmethod
1412
    def register_format(klass, format):
1413
        klass._formats[format.get_format_string()] = format
1414
1415
    @classmethod
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1416
    def register_control_format(klass, format):
2164.2.13 by v.ladeuil+lp at free
Add tests for redirection. Preserve transport decorations.
1417
        """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.
1418
1419
        TODO: This should be pulled up into a 'ControlDirFormat' base class
1420
        which BzrDirFormat can inherit from, and renamed to register_format 
1421
        there. It has been done without that for now for simplicity of
1422
        implementation.
1423
        """
1733.1.7 by Jelmer Vernooij
Change set of control dir formats to list.
1424
        klass._control_formats.append(format)
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1425
1426
    @classmethod
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
1427
    def register_control_server_format(klass, format):
1428
        """Register a control format for client-server environments.
1429
1430
        These formats will be tried before ones registered with
1431
        register_control_format.  This gives implementations that decide to the
1432
        chance to grab it before anything looks at the contents of the format
1433
        file.
1434
        """
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.
1435
        klass._control_server_formats.append(format)
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
1436
1437
    @classmethod
2204.4.12 by Aaron Bentley
Deprecate bzrdir.BzrDirFormat.set_default_format
1438
    @symbol_versioning.deprecated_method(symbol_versioning.zero_fourteen)
1534.4.39 by Robert Collins
Basic BzrDir support.
1439
    def set_default_format(klass, format):
2204.5.2 by Aaron Bentley
Tweak set_default_format
1440
        klass._set_default_format(format)
1534.4.39 by Robert Collins
Basic BzrDir support.
1441
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
1442
    @classmethod
1443
    def _set_default_format(klass, format):
1444
        """Set default format (for testing behavior of defaults only)"""
1445
        klass._default_format = format
1446
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
1447
    def __str__(self):
1448
        return self.get_format_string()[:-1]
1449
1534.4.39 by Robert Collins
Basic BzrDir support.
1450
    @classmethod
1451
    def unregister_format(klass, format):
1452
        assert klass._formats[format.get_format_string()] is format
1453
        del klass._formats[format.get_format_string()]
1454
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1455
    @classmethod
1456
    def unregister_control_format(klass, format):
1457
        klass._control_formats.remove(format)
1458
1459
1534.4.39 by Robert Collins
Basic BzrDir support.
1460
class BzrDirFormat4(BzrDirFormat):
1461
    """Bzr dir format 4.
1462
1463
    This format is a combined format for working tree, branch and repository.
1464
    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.
1465
     - Format 1 working trees [always]
1466
     - Format 4 branches [always]
1467
     - Format 4 repositories [always]
1534.4.39 by Robert Collins
Basic BzrDir support.
1468
1469
    This format is deprecated: it indexes texts using a text it which is
1470
    removed in format 5; write support for this format has been removed.
1471
    """
1472
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1473
    _lock_class = lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1474
1534.4.39 by Robert Collins
Basic BzrDir support.
1475
    def get_format_string(self):
1476
        """See BzrDirFormat.get_format_string()."""
1477
        return "Bazaar-NG branch, format 0.0.4\n"
1478
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
1479
    def get_format_description(self):
1480
        """See BzrDirFormat.get_format_description()."""
1481
        return "All-in-one format 4"
1482
1534.5.16 by Robert Collins
Review feedback.
1483
    def get_converter(self, format=None):
1484
        """See BzrDirFormat.get_converter()."""
1534.5.13 by Robert Collins
Correct buggy test.
1485
        # 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.
1486
        return ConvertBzrDir4To5()
1487
        
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1488
    def initialize_on_transport(self, transport):
1534.4.39 by Robert Collins
Basic BzrDir support.
1489
        """Format 4 branches cannot be created."""
1490
        raise errors.UninitializableFormat(self)
1491
1492
    def is_supported(self):
1493
        """Format 4 is not supported.
1494
1495
        It is not supported because the model changed from 4 to 5 and the
1496
        conversion logic is expensive - so doing it on the fly was not 
1497
        feasible.
1498
        """
1499
        return False
1500
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1501
    def _open(self, transport):
1502
        """See BzrDirFormat._open."""
1503
        return BzrDir4(transport, self)
1504
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.
1505
    def __return_repository_format(self):
1506
        """Circular import protection."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1507
        from bzrlib.repofmt.weaverepo import RepositoryFormat4
1910.2.12 by Aaron Bentley
Implement knit repo format 2
1508
        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.
1509
    repository_format = property(__return_repository_format)
1510
1534.4.39 by Robert Collins
Basic BzrDir support.
1511
1512
class BzrDirFormat5(BzrDirFormat):
1513
    """Bzr control format 5.
1514
1515
    This format is a combined format for working tree, branch and repository.
1516
    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.
1517
     - Format 2 working trees [always] 
1518
     - Format 4 branches [always] 
1534.4.53 by Robert Collins
Review feedback from John Meinel.
1519
     - 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.
1520
       Unhashed stores in the repository.
1534.4.39 by Robert Collins
Basic BzrDir support.
1521
    """
1522
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1523
    _lock_class = lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1524
1534.4.39 by Robert Collins
Basic BzrDir support.
1525
    def get_format_string(self):
1526
        """See BzrDirFormat.get_format_string()."""
1527
        return "Bazaar-NG branch, format 5\n"
1528
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
1529
    def get_format_description(self):
1530
        """See BzrDirFormat.get_format_description()."""
1531
        return "All-in-one format 5"
1532
1534.5.16 by Robert Collins
Review feedback.
1533
    def get_converter(self, format=None):
1534
        """See BzrDirFormat.get_converter()."""
1534.5.13 by Robert Collins
Correct buggy test.
1535
        # 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.
1536
        return ConvertBzrDir5To6()
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1537
1538
    def _initialize_for_clone(self, url):
1539
        return self.initialize_on_transport(get_transport(url), _cloning=True)
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1540
        
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1541
    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.
1542
        """Format 5 dirs always have working tree, branch and repository.
1543
        
1544
        Except when they are being cloned.
1545
        """
1546
        from bzrlib.branch import BzrBranchFormat4
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1547
        from bzrlib.repofmt.weaverepo import RepositoryFormat5
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.
1548
        from bzrlib.workingtree import WorkingTreeFormat2
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1549
        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.
1550
        RepositoryFormat5().initialize(result, _internal=True)
1551
        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.
1552
            branch = BzrBranchFormat4().initialize(result)
1553
            try:
1554
                WorkingTreeFormat2().initialize(result)
1555
            except errors.NotLocalUrl:
1556
                # Even though we can't access the working tree, we need to
1557
                # create its control files.
1558
                WorkingTreeFormat2().stub_initialize_remote(branch.control_files)
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
1559
        return result
1560
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1561
    def _open(self, transport):
1562
        """See BzrDirFormat._open."""
1563
        return BzrDir5(transport, self)
1564
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.
1565
    def __return_repository_format(self):
1566
        """Circular import protection."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1567
        from bzrlib.repofmt.weaverepo import RepositoryFormat5
1910.2.12 by Aaron Bentley
Implement knit repo format 2
1568
        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.
1569
    repository_format = property(__return_repository_format)
1570
1534.4.39 by Robert Collins
Basic BzrDir support.
1571
1572
class BzrDirFormat6(BzrDirFormat):
1573
    """Bzr control format 6.
1574
1575
    This format is a combined format for working tree, branch and repository.
1576
    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.
1577
     - Format 2 working trees [always] 
1578
     - Format 4 branches [always] 
1579
     - Format 6 repositories [always]
1534.4.39 by Robert Collins
Basic BzrDir support.
1580
    """
1581
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1582
    _lock_class = lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1583
1534.4.39 by Robert Collins
Basic BzrDir support.
1584
    def get_format_string(self):
1585
        """See BzrDirFormat.get_format_string()."""
1586
        return "Bazaar-NG branch, format 6\n"
1587
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
1588
    def get_format_description(self):
1589
        """See BzrDirFormat.get_format_description()."""
1590
        return "All-in-one format 6"
1591
1534.5.16 by Robert Collins
Review feedback.
1592
    def get_converter(self, format=None):
1593
        """See BzrDirFormat.get_converter()."""
1534.5.13 by Robert Collins
Correct buggy test.
1594
        # 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.
1595
        return ConvertBzrDir6ToMeta()
1596
        
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1597
    def _initialize_for_clone(self, url):
1598
        return self.initialize_on_transport(get_transport(url), _cloning=True)
1599
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1600
    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.
1601
        """Format 6 dirs always have working tree, branch and repository.
1602
        
1603
        Except when they are being cloned.
1604
        """
1605
        from bzrlib.branch import BzrBranchFormat4
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1606
        from bzrlib.repofmt.weaverepo import RepositoryFormat6
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.
1607
        from bzrlib.workingtree import WorkingTreeFormat2
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1608
        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.
1609
        RepositoryFormat6().initialize(result, _internal=True)
1610
        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.
1611
            branch = BzrBranchFormat4().initialize(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.
1612
            try:
1613
                WorkingTreeFormat2().initialize(result)
1614
            except errors.NotLocalUrl:
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.
1615
                # Even though we can't access the working tree, we need to
1616
                # create its control files.
1617
                WorkingTreeFormat2().stub_initialize_remote(branch.control_files)
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.
1618
        return result
1619
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1620
    def _open(self, transport):
1621
        """See BzrDirFormat._open."""
1622
        return BzrDir6(transport, self)
1623
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.
1624
    def __return_repository_format(self):
1625
        """Circular import protection."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1626
        from bzrlib.repofmt.weaverepo import RepositoryFormat6
1910.2.12 by Aaron Bentley
Implement knit repo format 2
1627
        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.
1628
    repository_format = property(__return_repository_format)
1629
1534.4.39 by Robert Collins
Basic BzrDir support.
1630
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1631
class BzrDirMetaFormat1(BzrDirFormat):
1632
    """Bzr meta control format 1
1633
1634
    This is the first format with split out working tree, branch and repository
1635
    disk storage.
1636
    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.
1637
     - Format 3 working trees [optional]
1638
     - Format 5 branches [optional]
1639
     - 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.
1640
    """
1641
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1642
    _lock_class = lockdir.LockDir
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1643
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
1644
    def __init__(self):
1645
        self._workingtree_format = None
2230.3.1 by Aaron Bentley
Get branch6 creation working
1646
        self._branch_format = None
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
1647
2100.3.15 by Aaron Bentley
get test suite passing
1648
    def __eq__(self, other):
1649
        if other.__class__ is not self.__class__:
1650
            return False
1651
        if other.repository_format != self.repository_format:
1652
            return False
1653
        if other.workingtree_format != self.workingtree_format:
1654
            return False
1655
        return True
1656
2100.3.35 by Aaron Bentley
equality operations on bzrdir
1657
    def __ne__(self, other):
1658
        return not self == other
1659
2230.3.55 by Aaron Bentley
Updates from review
1660
    def get_branch_format(self):
2230.3.1 by Aaron Bentley
Get branch6 creation working
1661
        if self._branch_format is None:
1662
            from bzrlib.branch import BranchFormat
1663
            self._branch_format = BranchFormat.get_default_format()
1664
        return self._branch_format
1665
2230.3.55 by Aaron Bentley
Updates from review
1666
    def set_branch_format(self, format):
2230.3.1 by Aaron Bentley
Get branch6 creation working
1667
        self._branch_format = format
1668
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.
1669
    def get_converter(self, format=None):
1670
        """See BzrDirFormat.get_converter()."""
1671
        if format is None:
1672
            format = BzrDirFormat.get_default_format()
1673
        if not isinstance(self, format.__class__):
1674
            # converting away from metadir is not implemented
1675
            raise NotImplementedError(self.get_converter)
1676
        return ConvertMetaToMeta(format)
1677
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1678
    def get_format_string(self):
1679
        """See BzrDirFormat.get_format_string()."""
1680
        return "Bazaar-NG meta directory, format 1\n"
1681
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
1682
    def get_format_description(self):
1683
        """See BzrDirFormat.get_format_description()."""
1684
        return "Meta directory format 1"
1685
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1686
    def _open(self, transport):
1687
        """See BzrDirFormat._open."""
2230.3.24 by Aaron Bentley
Remove format-on-open code
1688
        return BzrDirMeta1(transport, self)
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1689
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.
1690
    def __return_repository_format(self):
1691
        """Circular import protection."""
1692
        if getattr(self, '_repository_format', None):
1693
            return self._repository_format
1694
        from bzrlib.repository import RepositoryFormat
1695
        return RepositoryFormat.get_default_format()
1696
1697
    def __set_repository_format(self, value):
1698
        """Allow changint the repository format for metadir formats."""
1699
        self._repository_format = value
1553.5.72 by Martin Pool
Clean up test for Branch5 lockdirs
1700
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.
1701
    repository_format = property(__return_repository_format, __set_repository_format)
1702
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
1703
    def __get_workingtree_format(self):
1704
        if self._workingtree_format is None:
1705
            from bzrlib.workingtree import WorkingTreeFormat
1706
            self._workingtree_format = WorkingTreeFormat.get_default_format()
1707
        return self._workingtree_format
1708
1709
    def __set_workingtree_format(self, wt_format):
1710
        self._workingtree_format = wt_format
1711
1712
    workingtree_format = property(__get_workingtree_format,
1713
                                  __set_workingtree_format)
1714
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
1715
2164.2.19 by Vincent Ladeuil
Revert BzrDirFormat1 registering.
1716
# Register bzr control format
1717
BzrDirFormat.register_control_format(BzrDirFormat)
2164.2.13 by v.ladeuil+lp at free
Add tests for redirection. Preserve transport decorations.
1718
1719
# Register bzr formats
1534.4.39 by Robert Collins
Basic BzrDir support.
1720
BzrDirFormat.register_format(BzrDirFormat4())
1721
BzrDirFormat.register_format(BzrDirFormat5())
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1722
BzrDirFormat.register_format(BzrDirFormat6())
1723
__default_format = BzrDirMetaFormat1()
1534.4.39 by Robert Collins
Basic BzrDir support.
1724
BzrDirFormat.register_format(__default_format)
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
1725
BzrDirFormat._default_format = __default_format
1534.4.39 by Robert Collins
Basic BzrDir support.
1726
1727
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1728
class Converter(object):
1729
    """Converts a disk format object from one format to another."""
1730
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1731
    def convert(self, to_convert, pb):
1732
        """Perform the conversion of to_convert, giving feedback via pb.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1733
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1734
        :param to_convert: The disk object to convert.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1735
        :param pb: a progress bar to use for progress information.
1736
        """
1737
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.
1738
    def step(self, message):
1739
        """Update the pb by a step."""
1740
        self.count +=1
1741
        self.pb.update(message, self.count, self.total)
1742
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1743
1744
class ConvertBzrDir4To5(Converter):
1745
    """Converts format 4 bzr dirs to format 5."""
1746
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1747
    def __init__(self):
1748
        super(ConvertBzrDir4To5, self).__init__()
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1749
        self.converted_revs = set()
1750
        self.absent_revisions = set()
1751
        self.text_count = 0
1752
        self.revisions = {}
1753
        
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1754
    def convert(self, to_convert, pb):
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1755
        """See Converter.convert()."""
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1756
        self.bzrdir = to_convert
1757
        self.pb = pb
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1758
        self.pb.note('starting upgrade from format 4 to 5')
1759
        if isinstance(self.bzrdir.transport, LocalTransport):
1760
            self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
1761
        self._convert_to_weaves()
1762
        return BzrDir.open(self.bzrdir.root_transport.base)
1763
1764
    def _convert_to_weaves(self):
1765
        self.pb.note('note: upgrade may be faster if all store files are ungzipped first')
1766
        try:
1767
            # TODO permissions
1768
            stat = self.bzrdir.transport.stat('weaves')
1769
            if not S_ISDIR(stat.st_mode):
1770
                self.bzrdir.transport.delete('weaves')
1771
                self.bzrdir.transport.mkdir('weaves')
1772
        except errors.NoSuchFile:
1773
            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.
1774
        # 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.
1775
        self.inv_weave = Weave('inventory')
1776
        # holds in-memory weaves for all files
1777
        self.text_weaves = {}
1778
        self.bzrdir.transport.delete('branch-format')
1779
        self.branch = self.bzrdir.open_branch()
1780
        self._convert_working_inv()
1781
        rev_history = self.branch.revision_history()
1782
        # to_read is a stack holding the revisions we still need to process;
1783
        # appending to it adds new highest-priority revisions
1784
        self.known_revisions = set(rev_history)
1785
        self.to_read = rev_history[-1:]
1786
        while self.to_read:
1787
            rev_id = self.to_read.pop()
1788
            if (rev_id not in self.revisions
1789
                and rev_id not in self.absent_revisions):
1790
                self._load_one_rev(rev_id)
1791
        self.pb.clear()
1792
        to_import = self._make_order()
1793
        for i, rev_id in enumerate(to_import):
1794
            self.pb.update('converting revision', i, len(to_import))
1795
            self._convert_one_rev(rev_id)
1796
        self.pb.clear()
1797
        self._write_all_weaves()
1798
        self._write_all_revs()
1799
        self.pb.note('upgraded to weaves:')
1800
        self.pb.note('  %6d revisions and inventories', len(self.revisions))
1801
        self.pb.note('  %6d revisions not present', len(self.absent_revisions))
1802
        self.pb.note('  %6d texts', self.text_count)
1803
        self._cleanup_spare_files_after_format4()
1804
        self.branch.control_files.put_utf8('branch-format', BzrDirFormat5().get_format_string())
1805
1806
    def _cleanup_spare_files_after_format4(self):
1807
        # FIXME working tree upgrade foo.
1808
        for n in 'merged-patches', 'pending-merged-patches':
1809
            try:
1810
                ## assert os.path.getsize(p) == 0
1811
                self.bzrdir.transport.delete(n)
1812
            except errors.NoSuchFile:
1813
                pass
1814
        self.bzrdir.transport.delete_tree('inventory-store')
1815
        self.bzrdir.transport.delete_tree('text-store')
1816
1817
    def _convert_working_inv(self):
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
1818
        inv = xml4.serializer_v4.read_inventory(
1819
                    self.branch.control_files.get('inventory'))
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
1820
        new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv, working=True)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1821
        # FIXME inventory is a working tree change.
1955.3.4 by John Arbash Meinel
Fix 2 calls to 'put()' that were using strings instead of files
1822
        self.branch.control_files.put('inventory', StringIO(new_inv_xml))
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1823
1824
    def _write_all_weaves(self):
1825
        controlweaves = WeaveStore(self.bzrdir.transport, prefixed=False)
1826
        weave_transport = self.bzrdir.transport.clone('weaves')
1827
        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
1828
        transaction = WriteTransaction()
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1829
1830
        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.
1831
            i = 0
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1832
            for file_id, file_weave in self.text_weaves.items():
1833
                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.
1834
                weaves._put_weave(file_id, file_weave, transaction)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1835
                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.
1836
            self.pb.update('inventory', 0, 1)
1837
            controlweaves._put_weave('inventory', self.inv_weave, transaction)
1838
            self.pb.update('inventory', 1, 1)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1839
        finally:
1840
            self.pb.clear()
1841
1842
    def _write_all_revs(self):
1843
        """Write all revisions out in new form."""
1844
        self.bzrdir.transport.delete_tree('revision-store')
1845
        self.bzrdir.transport.mkdir('revision-store')
1846
        revision_transport = self.bzrdir.transport.clone('revision-store')
1847
        # TODO permissions
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
1848
        _revision_store = TextRevisionStore(TextStore(revision_transport,
1849
                                                      prefixed=False,
1850
                                                      compressed=True))
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1851
        try:
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1852
            transaction = WriteTransaction()
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1853
            for i, rev_id in enumerate(self.converted_revs):
1854
                self.pb.update('write revision', i, len(self.converted_revs))
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
1855
                _revision_store.add_revision(self.revisions[rev_id], transaction)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1856
        finally:
1857
            self.pb.clear()
1858
            
1859
    def _load_one_rev(self, rev_id):
1860
        """Load a revision object into memory.
1861
1862
        Any parents not either loaded or abandoned get queued to be
1863
        loaded."""
1864
        self.pb.update('loading revision',
1865
                       len(self.revisions),
1866
                       len(self.known_revisions))
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
1867
        if not self.branch.repository.has_revision(rev_id):
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1868
            self.pb.clear()
1869
            self.pb.note('revision {%s} not present in branch; '
1870
                         'will be converted as a ghost',
1871
                         rev_id)
1872
            self.absent_revisions.add(rev_id)
1873
        else:
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
1874
            rev = self.branch.repository._revision_store.get_revision(rev_id,
1875
                self.branch.repository.get_transaction())
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1876
            for parent_id in rev.parent_ids:
1877
                self.known_revisions.add(parent_id)
1878
                self.to_read.append(parent_id)
1879
            self.revisions[rev_id] = rev
1880
1881
    def _load_old_inventory(self, rev_id):
1882
        assert rev_id not in self.converted_revs
1883
        old_inv_xml = self.branch.repository.inventory_store.get(rev_id).read()
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
1884
        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
1885
        inv.revision_id = rev_id
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1886
        rev = self.revisions[rev_id]
1887
        if rev.inventory_sha1:
1888
            assert rev.inventory_sha1 == sha_string(old_inv_xml), \
1889
                'inventory sha mismatch for {%s}' % rev_id
1890
        return inv
1891
1892
    def _load_updated_inventory(self, rev_id):
1893
        assert rev_id in self.converted_revs
1894
        inv_xml = self.inv_weave.get_text(rev_id)
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
1895
        inv = xml5.serializer_v5.read_inventory_from_string(inv_xml)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1896
        return inv
1897
1898
    def _convert_one_rev(self, rev_id):
1899
        """Convert revision and all referenced objects to new format."""
1900
        rev = self.revisions[rev_id]
1901
        inv = self._load_old_inventory(rev_id)
1902
        present_parents = [p for p in rev.parent_ids
1903
                           if p not in self.absent_revisions]
1904
        self._convert_revision_contents(rev, inv, present_parents)
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
1905
        self._store_new_inv(rev, inv, present_parents)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1906
        self.converted_revs.add(rev_id)
1907
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
1908
    def _store_new_inv(self, rev, inv, present_parents):
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1909
        # the XML is now updated with text versions
1910
        if __debug__:
1907.1.8 by Aaron Bentley
Remove is_root
1911
            entries = inv.iter_entries()
1912
            entries.next()
1913
            for path, ie in entries:
1963.2.6 by Robey Pointer
pychecker is on crack; go back to using 'is None'.
1914
                assert getattr(ie, 'revision', None) is not None, \
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1915
                    'no revision on {%s} in {%s}' % \
1916
                    (file_id, rev.revision_id)
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
1917
        new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1918
        new_inv_sha1 = sha_string(new_inv_xml)
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
1919
        self.inv_weave.add_lines(rev.revision_id,
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
1920
                                 present_parents,
1921
                                 new_inv_xml.splitlines(True))
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1922
        rev.inventory_sha1 = new_inv_sha1
1923
1924
    def _convert_revision_contents(self, rev, inv, present_parents):
1925
        """Convert all the files within a revision.
1926
1927
        Also upgrade the inventory to refer to the text revision ids."""
1928
        rev_id = rev.revision_id
1929
        mutter('converting texts of revision {%s}',
1930
               rev_id)
1931
        parent_invs = map(self._load_updated_inventory, present_parents)
1731.1.62 by Aaron Bentley
Changes from review comments
1932
        entries = inv.iter_entries()
1933
        entries.next()
1934
        for path, ie in entries:
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1935
            self._convert_file_version(rev, ie, parent_invs)
1936
1937
    def _convert_file_version(self, rev, ie, parent_invs):
1938
        """Convert one version of one file.
1939
1940
        The file needs to be added into the weave if it is a merge
1941
        of >=2 parents or if it's changed from its parent.
1942
        """
1943
        file_id = ie.file_id
1944
        rev_id = rev.revision_id
1945
        w = self.text_weaves.get(file_id)
1946
        if w is None:
1947
            w = Weave(file_id)
1948
            self.text_weaves[file_id] = w
1949
        text_changed = False
2776.1.5 by Robert Collins
Add reasonably comprehensive tests for path last modified and per file graph behaviour.
1950
        parent_candiate_entries = ie.parent_candidates(parent_invs)
1951
        for old_revision in parent_candiate_entries.keys():
1952
            # if this fails, its a ghost ?
1953
            assert old_revision in self.converted_revs, \
1954
                "Revision {%s} not in converted_revs" % old_revision
1955
        heads = graph.Graph(self).heads(parent_candiate_entries.keys())
1956
        # XXX: Note that this is unordered - and this is tolerable because 
1957
        # the previous code was also unordered.
1958
        previous_entries = dict((head, parent_candiate_entries[head]) for head
1959
            in heads)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1960
        self.snapshot_ie(previous_entries, ie, w, rev_id)
1961
        del ie.text_id
1962
        assert getattr(ie, 'revision', None) is not None
1963
2776.1.5 by Robert Collins
Add reasonably comprehensive tests for path last modified and per file graph behaviour.
1964
    def get_parents(self, revision_ids):
1965
        for revision_id in revision_ids:
1966
            yield self.revisions[revision_id].parent_ids
1967
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1968
    def snapshot_ie(self, previous_revisions, ie, w, rev_id):
1969
        # TODO: convert this logic, which is ~= snapshot to
1970
        # a call to:. This needs the path figured out. rather than a work_tree
1971
        # a v4 revision_tree can be given, or something that looks enough like
1972
        # one to give the file content to the entry if it needs it.
1973
        # and we need something that looks like a weave store for snapshot to 
1974
        # save against.
1975
        #ie.snapshot(rev, PATH, previous_revisions, REVISION_TREE, InMemoryWeaveStore(self.text_weaves))
1976
        if len(previous_revisions) == 1:
1977
            previous_ie = previous_revisions.values()[0]
1978
            if ie._unchanged(previous_ie):
1979
                ie.revision = previous_ie.revision
1980
                return
1981
        if ie.has_text():
2661.1.1 by Robert Collins
Ancient unused Repository.text_store attribute has been removed. (Robert Collins)
1982
            text = self.branch.repository.weave_store.get(ie.text_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1983
            file_lines = text.readlines()
1984
            assert sha_strings(file_lines) == ie.text_sha1
1985
            assert sum(map(len, file_lines)) == ie.text_size
1563.2.18 by Robert Collins
get knit repositories really using knits for text storage.
1986
            w.add_lines(rev_id, previous_revisions, file_lines)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1987
            self.text_count += 1
1988
        else:
1563.2.18 by Robert Collins
get knit repositories really using knits for text storage.
1989
            w.add_lines(rev_id, previous_revisions, [])
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
1990
        ie.revision = rev_id
1991
1992
    def _make_order(self):
1993
        """Return a suitable order for importing revisions.
1994
1995
        The order must be such that an revision is imported after all
1996
        its (present) parents.
1997
        """
1998
        todo = set(self.revisions.keys())
1999
        done = self.absent_revisions.copy()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2000
        order = []
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2001
        while todo:
2002
            # scan through looking for a revision whose parents
2003
            # are all done
2004
            for rev_id in sorted(list(todo)):
2005
                rev = self.revisions[rev_id]
2006
                parent_ids = set(rev.parent_ids)
2007
                if parent_ids.issubset(done):
2008
                    # can take this one now
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2009
                    order.append(rev_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2010
                    todo.remove(rev_id)
2011
                    done.add(rev_id)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2012
        return order
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2013
2014
2015
class ConvertBzrDir5To6(Converter):
2016
    """Converts format 5 bzr dirs to format 6."""
2017
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2018
    def convert(self, to_convert, pb):
2019
        """See Converter.convert()."""
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2020
        self.bzrdir = to_convert
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2021
        self.pb = pb
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2022
        self.pb.note('starting upgrade from format 5 to 6')
2023
        self._convert_to_prefixed()
2024
        return BzrDir.open(self.bzrdir.root_transport.base)
2025
2026
    def _convert_to_prefixed(self):
1608.2.1 by Martin Pool
[merge] Storage filename escaping
2027
        from bzrlib.store import TransportStore
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2028
        self.bzrdir.transport.delete('branch-format')
2029
        for store_name in ["weaves", "revision-store"]:
1608.2.1 by Martin Pool
[merge] Storage filename escaping
2030
            self.pb.note("adding prefixes to %s" % store_name)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2031
            store_transport = self.bzrdir.transport.clone(store_name)
1608.2.1 by Martin Pool
[merge] Storage filename escaping
2032
            store = TransportStore(store_transport, prefixed=True)
1608.1.1 by Martin Pool
[patch] LocalTransport.list_dir should return url-quoted strings (ddaa)
2033
            for urlfilename in store_transport.list_dir('.'):
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
2034
                filename = urlutils.unescape(urlfilename)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2035
                if (filename.endswith(".weave") or
2036
                    filename.endswith(".gz") or
2037
                    filename.endswith(".sig")):
2038
                    file_id = os.path.splitext(filename)[0]
2039
                else:
2040
                    file_id = filename
1608.2.1 by Martin Pool
[merge] Storage filename escaping
2041
                prefix_dir = store.hash_prefix(file_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2042
                # FIXME keep track of the dirs made RBC 20060121
2043
                try:
2044
                    store_transport.move(filename, prefix_dir + '/' + filename)
2045
                except errors.NoSuchFile: # catches missing dirs strangely enough
2046
                    store_transport.mkdir(prefix_dir)
2047
                    store_transport.move(filename, prefix_dir + '/' + filename)
2048
        self.bzrdir._control_files.put_utf8('branch-format', BzrDirFormat6().get_format_string())
2049
2050
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2051
class ConvertBzrDir6ToMeta(Converter):
2052
    """Converts format 6 bzr dirs to metadirs."""
2053
2054
    def convert(self, to_convert, pb):
2055
        """See Converter.convert()."""
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
2056
        from bzrlib.repofmt.weaverepo import RepositoryFormat7
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
2057
        from bzrlib.branch import BzrBranchFormat5
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2058
        self.bzrdir = to_convert
2059
        self.pb = pb
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2060
        self.count = 0
2061
        self.total = 20 # the steps we know about
2062
        self.garbage_inventories = []
2063
1534.5.13 by Robert Collins
Correct buggy test.
2064
        self.pb.note('starting upgrade from format 6 to metadir')
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2065
        self.bzrdir._control_files.put_utf8('branch-format', "Converting to format 6")
2066
        # its faster to move specific files around than to open and use the apis...
2067
        # first off, nuke ancestry.weave, it was never used.
2068
        try:
2069
            self.step('Removing ancestry.weave')
2070
            self.bzrdir.transport.delete('ancestry.weave')
2071
        except errors.NoSuchFile:
2072
            pass
2073
        # find out whats there
2074
        self.step('Finding branch files')
1666.1.3 by Robert Collins
Fix and test upgrades from bzrdir 6 over SFTP.
2075
        last_revision = self.bzrdir.open_branch().last_revision()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2076
        bzrcontents = self.bzrdir.transport.list_dir('.')
2077
        for name in bzrcontents:
2078
            if name.startswith('basis-inventory.'):
2079
                self.garbage_inventories.append(name)
2080
        # create new directories for repository, working tree and branch
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
2081
        self.dir_mode = self.bzrdir._control_files._dir_mode
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2082
        self.file_mode = self.bzrdir._control_files._file_mode
2083
        repository_names = [('inventory.weave', True),
2084
                            ('revision-store', True),
2085
                            ('weaves', True)]
2086
        self.step('Upgrading repository  ')
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
2087
        self.bzrdir.transport.mkdir('repository', mode=self.dir_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2088
        self.make_lock('repository')
2089
        # we hard code the formats here because we are converting into
2090
        # the meta format. The meta format upgrader can take this to a 
2091
        # future format within each component.
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
2092
        self.put_format('repository', RepositoryFormat7())
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2093
        for entry in repository_names:
2094
            self.move_entry('repository', entry)
2095
2096
        self.step('Upgrading branch      ')
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
2097
        self.bzrdir.transport.mkdir('branch', mode=self.dir_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2098
        self.make_lock('branch')
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
2099
        self.put_format('branch', BzrBranchFormat5())
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2100
        branch_files = [('revision-history', True),
2101
                        ('branch-name', True),
2102
                        ('parent', False)]
2103
        for entry in branch_files:
2104
            self.move_entry('branch', entry)
2105
2106
        checkout_files = [('pending-merges', True),
2107
                          ('inventory', True),
2108
                          ('stat-cache', False)]
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
2109
        # If a mandatory checkout file is not present, the branch does not have
2110
        # a functional checkout. Do not create a checkout in the converted
2111
        # branch.
2112
        for name, mandatory in checkout_files:
2113
            if mandatory and name not in bzrcontents:
2114
                has_checkout = False
2115
                break
2116
        else:
2117
            has_checkout = True
2118
        if not has_checkout:
2119
            self.pb.note('No working tree.')
2120
            # If some checkout files are there, we may as well get rid of them.
2121
            for name, mandatory in checkout_files:
2122
                if name in bzrcontents:
2123
                    self.bzrdir.transport.delete(name)
2124
        else:
2123.2.1 by John Arbash Meinel
Fix bug #70716, make bzrlib.bzrdir directly import bzrlib.workingtree
2125
            from bzrlib.workingtree import WorkingTreeFormat3
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
2126
            self.step('Upgrading working tree')
2127
            self.bzrdir.transport.mkdir('checkout', mode=self.dir_mode)
2128
            self.make_lock('checkout')
2129
            self.put_format(
2123.2.1 by John Arbash Meinel
Fix bug #70716, make bzrlib.bzrdir directly import bzrlib.workingtree
2130
                'checkout', WorkingTreeFormat3())
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
2131
            self.bzrdir.transport.delete_multi(
2132
                self.garbage_inventories, self.pb)
2133
            for entry in checkout_files:
2134
                self.move_entry('checkout', entry)
2135
            if last_revision is not None:
2136
                self.bzrdir._control_files.put_utf8(
2137
                    'checkout/last-revision', last_revision)
2138
        self.bzrdir._control_files.put_utf8(
2139
            'branch-format', BzrDirMetaFormat1().get_format_string())
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2140
        return BzrDir.open(self.bzrdir.root_transport.base)
2141
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2142
    def make_lock(self, name):
2143
        """Make a lock for the new control dir name."""
2144
        self.step('Make %s lock' % name)
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2145
        ld = lockdir.LockDir(self.bzrdir.transport,
2146
                             '%s/lock' % name,
2147
                             file_modebits=self.file_mode,
2148
                             dir_modebits=self.dir_mode)
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
2149
        ld.create()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2150
2151
    def move_entry(self, new_dir, entry):
2152
        """Move then entry name into new_dir."""
2153
        name = entry[0]
2154
        mandatory = entry[1]
2155
        self.step('Moving %s' % name)
2156
        try:
2157
            self.bzrdir.transport.move(name, '%s/%s' % (new_dir, name))
2158
        except errors.NoSuchFile:
2159
            if mandatory:
2160
                raise
2161
2162
    def put_format(self, dirname, format):
2163
        self.bzrdir._control_files.put_utf8('%s/format' % dirname, format.get_format_string())
2164
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.
2165
2166
class ConvertMetaToMeta(Converter):
2167
    """Converts the components of metadirs."""
2168
2169
    def __init__(self, target_format):
2170
        """Create a metadir to metadir converter.
2171
2172
        :param target_format: The final metadir format that is desired.
2173
        """
2174
        self.target_format = target_format
2175
2176
    def convert(self, to_convert, pb):
2177
        """See Converter.convert()."""
2178
        self.bzrdir = to_convert
2179
        self.pb = pb
2180
        self.count = 0
2181
        self.total = 1
2182
        self.step('checking repository format')
2183
        try:
2184
            repo = self.bzrdir.open_repository()
2185
        except errors.NoRepositoryPresent:
2186
            pass
2187
        else:
2188
            if not isinstance(repo._format, self.target_format.repository_format.__class__):
2189
                from bzrlib.repository import CopyConverter
2190
                self.pb.note('starting repository conversion')
2191
                converter = CopyConverter(self.target_format.repository_format)
2192
                converter.convert(repo, pb)
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
2193
        try:
2194
            branch = self.bzrdir.open_branch()
2195
        except errors.NotBranchError:
2196
            pass
2197
        else:
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2198
            # TODO: conversions of Branch and Tree should be done by
2199
            # InterXFormat lookups
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
2200
            # Avoid circular imports
2201
            from bzrlib import branch as _mod_branch
2202
            if (branch._format.__class__ is _mod_branch.BzrBranchFormat5 and
2230.3.55 by Aaron Bentley
Updates from review
2203
                self.target_format.get_branch_format().__class__ is
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
2204
                _mod_branch.BzrBranchFormat6):
2205
                branch_converter = _mod_branch.Converter5to6()
2206
                branch_converter.convert(branch)
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2207
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
2208
            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.
2209
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2210
            pass
2211
        else:
2212
            # TODO: conversions of Branch and Tree should be done by
2213
            # InterXFormat lookups
2214
            if (isinstance(tree, workingtree.WorkingTree3) and
2255.2.212 by Robert Collins
Fix upgrade bug exposed via repository tests, dont replace dirstate format trees during upgrade.
2215
                not isinstance(tree, workingtree_4.WorkingTree4) and
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2216
                isinstance(self.target_format.workingtree_format,
2217
                    workingtree_4.WorkingTreeFormat4)):
2218
                workingtree_4.Converter3to4().convert(tree)
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
2219
        return to_convert
1731.2.18 by Aaron Bentley
Get extract in repository under test
2220
2221
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
2222
# This is not in remote.py because it's small, and needs to be registered.
2223
# Putting it in remote.py creates a circular import problem.
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
2224
# we can make it a lazy object if the control formats is turned into something
2225
# like a registry.
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
2226
class RemoteBzrDirFormat(BzrDirMetaFormat1):
2227
    """Format representing bzrdirs accessed via a smart server"""
2228
2229
    def get_format_description(self):
2230
        return 'bzr remote bzrdir'
2231
    
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
2232
    @classmethod
2233
    def probe_transport(klass, transport):
2234
        """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).
2235
        try:
2432.3.1 by Andrew Bennetts
Try a version 1 hello probe to determine if we can use RemoteBzrDir on a particular transport, allowing smooth interoperation with older servers.
2236
            client = transport.get_smart_client()
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
2237
        except (NotImplementedError, AttributeError,
2238
                errors.TransportNotPossible):
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
2239
            # no smart server, so not a branch for this format type.
2240
            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).
2241
        else:
2432.3.3 by Andrew Bennetts
Update comment according to Martin's suggestion.
2242
            # Send a 'hello' request in protocol version one, and decline to
2243
            # open it if the server doesn't support our required version (2) so
2244
            # that the VFS-based transport will do it.
2432.3.1 by Andrew Bennetts
Try a version 1 hello probe to determine if we can use RemoteBzrDir on a particular transport, allowing smooth interoperation with older servers.
2245
            request = client.get_request()
2246
            smart_protocol = protocol.SmartClientRequestProtocolOne(request)
2432.3.2 by Andrew Bennetts
Add test, and tidy implementation.
2247
            server_version = smart_protocol.query_version()
2248
            if server_version != 2:
2432.3.1 by Andrew Bennetts
Try a version 1 hello probe to determine if we can use RemoteBzrDir on a particular transport, allowing smooth interoperation with older servers.
2249
                raise errors.NotBranchError(path=transport.base)
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
2250
            return klass()
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
2251
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2252
    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.
2253
        try:
2254
            # hand off the request to the smart server
2485.8.54 by Vincent Ladeuil
Refactor medium uses by making a distinction betweem shared and real medium.
2255
            shared_medium = transport.get_shared_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.
2256
        except errors.NoSmartMedium:
2257
            # TODO: lookup the local format from a server hint.
2258
            local_dir_format = BzrDirMetaFormat1()
2259
            return local_dir_format.initialize_on_transport(transport)
2485.8.54 by Vincent Ladeuil
Refactor medium uses by making a distinction betweem shared and real medium.
2260
        client = _SmartClient(shared_medium)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2261
        path = client.remote_path_from_transport(transport)
2485.8.54 by Vincent Ladeuil
Refactor medium uses by making a distinction betweem shared and real medium.
2262
        response = _SmartClient(shared_medium).call('BzrDirFormat.initialize',
2263
                                                    path)
2018.5.52 by Wouter van Heyst
Provide more information when encountering unexpected responses from a smart
2264
        assert response[0] in ('ok', ), 'unexpected response code %s' % (response,)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2265
        return remote.RemoteBzrDir(transport)
2266
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
2267
    def _open(self, transport):
2268
        return remote.RemoteBzrDir(transport)
2269
2270
    def __eq__(self, other):
2271
        if not isinstance(other, RemoteBzrDirFormat):
2272
            return False
2273
        return self.get_format_description() == other.get_format_description()
2274
2275
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
2276
BzrDirFormat.register_control_server_format(RemoteBzrDirFormat)
2018.5.45 by Andrew Bennetts
Merge from bzr.dev
2277
2278
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2279
class BzrDirFormatInfo(object):
2280
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2281
    def __init__(self, native, deprecated, hidden):
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2282
        self.deprecated = deprecated
2283
        self.native = native
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2284
        self.hidden = hidden
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2285
2286
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2287
class BzrDirFormatRegistry(registry.Registry):
2288
    """Registry of user-selectable BzrDir subformats.
2289
    
2290
    Differs from BzrDirFormat._control_formats in that it provides sub-formats,
2291
    e.g. BzrDirMeta1 with weave repository.  Also, it's more user-oriented.
2292
    """
2293
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2294
    def register_metadir(self, key,
2295
             repository_format, help, native=True, deprecated=False,
2296
             branch_format=None,
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2297
             tree_format=None,
2298
             hidden=False):
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2299
        """Register a metadir subformat.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2300
2301
        These all use a BzrDirMetaFormat1 bzrdir, but can be parameterized
2302
        by the Repository format.
2303
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2304
        :param repository_format: The fully-qualified repository format class
2305
            name as a string.
2306
        :param branch_format: Fully-qualified branch format class name as
2307
            a string.
2308
        :param tree_format: Fully-qualified tree format class name as
2309
            a string.
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2310
        """
2311
        # This should be expanded to support setting WorkingTree and Branch
2312
        # formats, once BzrDirMetaFormat1 supports that.
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2313
        def _load(full_name):
2314
            mod_name, factory_name = full_name.rsplit('.', 1)
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
2315
            try:
2316
                mod = __import__(mod_name, globals(), locals(),
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2317
                        [factory_name])
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
2318
            except ImportError, e:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2319
                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.
2320
            try:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2321
                factory = getattr(mod, factory_name)
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2322
            except AttributeError:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2323
                raise AttributeError('no factory %s in module %r'
2324
                    % (full_name, mod))
2325
            return factory()
2326
2327
        def helper():
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2328
            bd = BzrDirMetaFormat1()
2230.3.1 by Aaron Bentley
Get branch6 creation working
2329
            if branch_format is not None:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2330
                bd.set_branch_format(_load(branch_format))
2331
            if tree_format is not None:
2332
                bd.workingtree_format = _load(tree_format)
2333
            if repository_format is not None:
2334
                bd.repository_format = _load(repository_format)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2335
            return bd
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2336
        self.register(key, helper, help, native, deprecated, hidden)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2337
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2338
    def register(self, key, factory, help, native=True, deprecated=False,
2339
                 hidden=False):
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2340
        """Register a BzrDirFormat factory.
2341
        
2342
        The factory must be a callable that takes one parameter: the key.
2343
        It must produce an instance of the BzrDirFormat when called.
2344
2345
        This function mainly exists to prevent the info object from being
2346
        supplied directly.
2347
        """
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2348
        registry.Registry.register(self, key, factory, help, 
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2349
            BzrDirFormatInfo(native, deprecated, hidden))
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2350
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
2351
    def register_lazy(self, key, module_name, member_name, help, native=True,
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2352
                      deprecated=False, hidden=False):
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
2353
        registry.Registry.register_lazy(self, key, module_name, member_name, 
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2354
            help, BzrDirFormatInfo(native, deprecated, hidden))
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2355
2356
    def set_default(self, key):
2357
        """Set the 'default' key to be a clone of the supplied key.
2358
        
2359
        This method must be called once and only once.
2360
        """
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2361
        registry.Registry.register(self, 'default', self.get(key), 
2362
            self.get_help(key), info=self.get_info(key))
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2363
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
2364
    def set_default_repository(self, key):
2365
        """Set the FormatRegistry default and Repository default.
2366
        
2367
        This is a transitional method while Repository.set_default_format
2368
        is deprecated.
2369
        """
2370
        if 'default' in self:
2371
            self.remove('default')
2372
        self.set_default(key)
2373
        format = self.get('default')()
2374
        assert isinstance(format, BzrDirMetaFormat1)
2375
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2376
    def make_bzrdir(self, key):
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
2377
        return self.get(key)()
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2378
2379
    def help_topic(self, topic):
2380
        output = textwrap.dedent("""\
2381
            These formats can be used for creating branches, working trees, and
2382
            repositories.
2204.4.2 by Aaron Bentley
Tweak topic appearance
2383
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2384
            """)
2711.2.4 by Martin Pool
Fix unbound variable error in BzrDirFormatRegistry.get_help (test order dependent)
2385
        default_realkey = None
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2386
        default_help = self.get_help('default')
2387
        help_pairs = []
2388
        for key in self.keys():
2389
            if key == 'default':
2390
                continue
2391
            help = self.get_help(key)
2392
            if help == default_help:
2393
                default_realkey = key
2394
            else:
2395
                help_pairs.append((key, help))
2396
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2397
        def wrapped(key, help, info):
2398
            if info.native:
2399
                help = '(native) ' + help
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
2400
            return ':%s:\n%s\n\n' % (key, 
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2401
                    textwrap.fill(help, initial_indent='    ', 
2402
                    subsequent_indent='    '))
2711.2.4 by Martin Pool
Fix unbound variable error in BzrDirFormatRegistry.get_help (test order dependent)
2403
        if default_realkey is not None:
2404
            output += wrapped(default_realkey, '(default) %s' % default_help,
2405
                              self.get_info('default'))
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2406
        deprecated_pairs = []
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2407
        for key, help in help_pairs:
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2408
            info = self.get_info(key)
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2409
            if info.hidden:
2410
                continue
2411
            elif info.deprecated:
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2412
                deprecated_pairs.append((key, help))
2413
            else:
2414
                output += wrapped(key, help, info)
2415
        if len(deprecated_pairs) > 0:
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
2416
            output += "Deprecated formats are shown below.\n\n"
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2417
            for key, help in deprecated_pairs:
2418
                info = self.get_info(key)
2419
                output += wrapped(key, help, info)
2420
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2421
        return output
2422
2423
2424
format_registry = BzrDirFormatRegistry()
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
2425
format_registry.register('weave', BzrDirFormat6,
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2426
    '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
2427
    ' support checkouts or shared repositories.',
2428
    deprecated=True)
2429
format_registry.register_metadir('knit',
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
2430
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2431
    'Format using knits.  Recommended for interoperation with bzr <= 0.14.',
2432
    branch_format='bzrlib.branch.BzrBranchFormat5',
2255.2.199 by Robert Collins
Fix definition of knit format; typos are not good.
2433
    tree_format='bzrlib.workingtree.WorkingTreeFormat3')
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
2434
format_registry.register_metadir('metaweave',
2435
    'bzrlib.repofmt.weaverepo.RepositoryFormat7',
2230.3.30 by Aaron Bentley
Fix whitespace issues
2436
    'Transitional format in 0.8.  Slower than knit.',
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2437
    branch_format='bzrlib.branch.BzrBranchFormat5',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
2438
    tree_format='bzrlib.workingtree.WorkingTreeFormat3',
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2439
    deprecated=True)
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2440
format_registry.register_metadir('dirstate',
2441
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
2442
    help='New in 0.15: Fast local operations. Compatible with bzr 0.8 and '
2443
        'above when accessed over the network.',
2444
    branch_format='bzrlib.branch.BzrBranchFormat5',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
2445
    # this uses bzrlib.workingtree.WorkingTreeFormat4 because importing
2446
    # directly from workingtree_4 triggers a circular import.
2447
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2448
    )
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
2449
format_registry.register_metadir('dirstate-tags',
2450
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
2451
    help='New in 0.15: Fast local operations and improved scaling for '
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2452
        'network operations. Additionally adds support for tags.'
2453
        ' Incompatible with bzr < 0.15.',
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
2454
    branch_format='bzrlib.branch.BzrBranchFormat6',
2455
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
2456
    )
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2457
format_registry.register_metadir('dirstate-with-subtree',
2458
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
2459
    help='New in 0.15: Fast local operations and improved scaling for '
2460
        'network operations. Additionally adds support for versioning nested '
2461
        'bzr branches. Incompatible with bzr < 0.15.',
2462
    branch_format='bzrlib.branch.BzrBranchFormat6',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
2463
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2464
    hidden=True,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2465
    )
2696.3.1 by Martin Pool
(broken) start switching format to dirstate-tags
2466
format_registry.set_default('dirstate-tags')