/brz/remove-bazaar

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