/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.
85
    
86
    BzrDir instances let you create or open any of the things that can be
87
    found within .bzr - checkouts, branches and repositories.
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
133
        :param format: may be any kind of format - workingtree, branch, 
134
        or repository.
135
136
        :param allow_unsupported: If true, allow opening 
137
        formats that are strongly deprecated, and which may 
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)
3650.5.5 by Aaron Bentley
Make WorkingTree.clone use bzrdir's format
191
        metadir = self.cloning_metadir(require_stacking)
3650.5.1 by Aaron Bentley
Fix push to use clone all the time.
192
        result = metadir.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'.
1534.4.39 by Robert Collins
Basic BzrDir support.
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.
2476.3.8 by Vincent Ladeuil
Mark transports that need to be instrumented or refactored to check
254
        :param possible_transports: If supplied, a list of transports that 
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
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
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,
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.
462
        no error is raised unless force_new_tree is True, in which case no 
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.
467
        :param force_new_tree: If True or False force creation of a tree or 
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
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.
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.
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
            #
534
            # FIXME: bug 262450 -- the backup directory should have the same 
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
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
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
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
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)
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
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.
738
        
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.
752
        
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
        """
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.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
771
        
772
        For instance, if the repository format is out of date but the 
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)
784
        
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).
1534.4.39 by Robert Collins
Basic BzrDir support.
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.
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
832
        
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.
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)
1534.6.3 by Robert Collins
find_repository sufficiently robust.
846
    
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.
855
        If there is one and it is either an unrecognised format or an unsupported 
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
1685.1.28 by John Arbash Meinel
Changing open_containing to always return a unicode path.
859
        :return: The BzrDir that contains the path, and 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.
973
        
974
        Note: if you're going to open the branch, you should just go ahead
975
        and try, and not ask permission first.  (This method just opens the 
976
        branch and discards it, and that's somewhat expensive.) 
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.
989
        
990
        Note: if you're going to open the working tree, you should just go ahead
991
        and try, and not ask permission first.  (This method just opens the 
992
        workingtree and discards it, and that's somewhat expensive.) 
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.
1002
        
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
1261
        # happens for creating checkouts, which cannot be 
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."""
1290
        raise errors.UnsupportedOperation(self.destroy_workingtree_metadata, 
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.
1371
    
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.
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
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
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
1617
    methods on the format class. Do not deprecate the object, as the 
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, ....
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
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
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.
1701
        
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."""
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
1710
        # Since we don't have a .bzr directory, inherit the
1534.4.39 by Robert Collins
Basic BzrDir support.
1711
        # mode from the root directory
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1712
        temp_control = lockable_files.LockableFiles(transport,
1713
                            '', lockable_files.TransportLock)
1534.4.39 by Robert Collins
Basic BzrDir support.
1714
        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.
1715
                                      # FIXME: RBC 20060121 don't peek under
1534.4.39 by Robert Collins
Basic BzrDir support.
1716
                                      # the covers
1717
                                      mode=temp_control._dir_mode)
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
1718
        if sys.platform == 'win32' and isinstance(transport, local.LocalTransport):
3023.1.2 by Alexander Belchenko
Martin's review.
1719
            win32utils.set_file_attr_hidden(transport._abspath('.bzr'))
1534.4.39 by Robert Collins
Basic BzrDir support.
1720
        file_mode = temp_control._file_mode
1721
        del temp_control
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
1722
        bzrdir_transport = transport.clone('.bzr')
1723
        utf8_files = [('README',
3250.2.1 by Marius Kruger
update .bzr/README to not refer to Bazaar-NG, and add link to website.
1724
                       "This is a Bazaar control directory.\n"
1725
                       "Do not change any files in this directory.\n"
1726
                       "See http://bazaar-vcs.org/ for more information about Bazaar.\n"),
1534.4.39 by Robert Collins
Basic BzrDir support.
1727
                      ('branch-format', self.get_format_string()),
1728
                      ]
1729
        # NB: no need to escape relative paths that are url safe.
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
1730
        control_files = lockable_files.LockableFiles(bzrdir_transport,
1731
            self._lock_file_name, self._lock_class)
1553.5.60 by Martin Pool
New LockableFiles.create_lock() method
1732
        control_files.create_lock()
1534.4.39 by Robert Collins
Basic BzrDir support.
1733
        control_files.lock_write()
1734
        try:
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
1735
            for (filename, content) in utf8_files:
3407.2.12 by Martin Pool
Fix creation mode of control files
1736
                bzrdir_transport.put_bytes(filename, content,
1737
                    mode=file_mode)
1534.4.39 by Robert Collins
Basic BzrDir support.
1738
        finally:
1739
            control_files.unlock()
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.
1740
        # If we initialized using VFS methods on a RemoteTransport, return a
1741
        # Remote object: No need for it to be slower than necessary.
1742
        if isinstance(transport, remote_transport.RemoteTransport):
1743
            return self.open(transport)
1744
        else:
1745
            return self.open(transport, _found=True)
1534.4.39 by Robert Collins
Basic BzrDir support.
1746
1747
    def is_supported(self):
1748
        """Is this format supported?
1749
1750
        Supported formats must be initializable and openable.
1751
        Unsupported formats may not support initialization or committing or 
1752
        some other features depending on the reason for not being supported.
1753
        """
1754
        return True
1755
1910.2.14 by Aaron Bentley
Fail when trying to use interrepository on Knit2 and Knit1
1756
    def same_model(self, target_format):
1757
        return (self.repository_format.rich_root_data == 
1758
            target_format.rich_root_data)
1759
1733.1.3 by Robert Collins
Extend the test suite to run bzrdir conformance tests on non .bzr based control dirs.
1760
    @classmethod
1761
    def known_formats(klass):
1762
        """Return all the known formats.
1763
        
1764
        Concrete formats should override _known_formats.
1765
        """
1733.1.6 by Jelmer Vernooij
Fix a couple of minor issues after review by Martin.
1766
        # There is double indirection here to make sure that control 
1767
        # formats used by more than one dir format will only be probed 
1768
        # 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.
1769
        result = set()
1770
        for format in klass._control_formats:
1771
            result.update(format._known_formats())
1772
        return result
1773
    
1774
    @classmethod
1775
    def _known_formats(klass):
1776
        """Return the known format instances for this control format."""
1777
        return set(klass._formats.values())
1778
1534.4.39 by Robert Collins
Basic BzrDir support.
1779
    def open(self, transport, _found=False):
1780
        """Return an instance of this format for the dir transport points at.
1781
        
1782
        _found is a private parameter, do not use it.
1783
        """
1784
        if not _found:
2090.2.2 by Martin Pool
Fix an assertion with side effects
1785
            found_format = BzrDirFormat.find_format(transport)
1786
            if not isinstance(found_format, self.__class__):
1787
                raise AssertionError("%s was asked to open %s, but it seems to need "
1788
                        "format %s" 
1789
                        % (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.
1790
            # Allow subclasses - use the found format.
1791
            self._supply_sub_formats_to(found_format)
1792
            return found_format._open(transport)
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1793
        return self._open(transport)
1794
1795
    def _open(self, transport):
1796
        """Template method helper for opening BzrDirectories.
1797
1798
        This performs the actual open and any additional logic or parameter
1799
        passing.
1800
        """
1801
        raise NotImplementedError(self._open)
1534.4.39 by Robert Collins
Basic BzrDir support.
1802
1803
    @classmethod
1804
    def register_format(klass, format):
1805
        klass._formats[format.get_format_string()] = format
1806
1807
    @classmethod
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1808
    def register_control_format(klass, format):
2164.2.13 by v.ladeuil+lp at free
Add tests for redirection. Preserve transport decorations.
1809
        """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.
1810
1811
        TODO: This should be pulled up into a 'ControlDirFormat' base class
1812
        which BzrDirFormat can inherit from, and renamed to register_format 
1813
        there. It has been done without that for now for simplicity of
1814
        implementation.
1815
        """
1733.1.7 by Jelmer Vernooij
Change set of control dir formats to list.
1816
        klass._control_formats.append(format)
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1817
1818
    @classmethod
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
1819
    def register_control_server_format(klass, format):
1820
        """Register a control format for client-server environments.
1821
1822
        These formats will be tried before ones registered with
1823
        register_control_format.  This gives implementations that decide to the
1824
        chance to grab it before anything looks at the contents of the format
1825
        file.
1826
        """
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.
1827
        klass._control_server_formats.append(format)
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
1828
1829
    @classmethod
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
1830
    def _set_default_format(klass, format):
1831
        """Set default format (for testing behavior of defaults only)"""
1832
        klass._default_format = format
1833
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
1834
    def __str__(self):
2830.1.1 by Ian Clatworthy
bzrdir.py code clean-ups
1835
        # Trim the newline
1836
        return self.get_format_string().rstrip()
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
1837
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.
1838
    def _supply_sub_formats_to(self, other_format):
1839
        """Give other_format the same values for sub formats as this has.
1840
1841
        This method is expected to be used when parameterising a
1842
        RemoteBzrDirFormat instance with the parameters from a
1843
        BzrDirMetaFormat1 instance.
1844
1845
        :param other_format: other_format is a format which should be
1846
            compatible with whatever sub formats are supported by self.
1847
        :return: None.
1848
        """
1849
1534.4.39 by Robert Collins
Basic BzrDir support.
1850
    @classmethod
1851
    def unregister_format(klass, format):
1852
        del klass._formats[format.get_format_string()]
1853
1733.1.1 by Robert Collins
Support non '.bzr' control directories in bzrdir.
1854
    @classmethod
1855
    def unregister_control_format(klass, format):
1856
        klass._control_formats.remove(format)
1857
1858
1534.4.39 by Robert Collins
Basic BzrDir support.
1859
class BzrDirFormat4(BzrDirFormat):
1860
    """Bzr dir format 4.
1861
1862
    This format is a combined format for working tree, branch and repository.
1863
    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.
1864
     - Format 1 working trees [always]
1865
     - Format 4 branches [always]
1866
     - Format 4 repositories [always]
1534.4.39 by Robert Collins
Basic BzrDir support.
1867
1868
    This format is deprecated: it indexes texts using a text it which is
1869
    removed in format 5; write support for this format has been removed.
1870
    """
1871
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1872
    _lock_class = lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1873
1534.4.39 by Robert Collins
Basic BzrDir support.
1874
    def get_format_string(self):
1875
        """See BzrDirFormat.get_format_string()."""
1876
        return "Bazaar-NG branch, format 0.0.4\n"
1877
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
1878
    def get_format_description(self):
1879
        """See BzrDirFormat.get_format_description()."""
1880
        return "All-in-one format 4"
1881
1534.5.16 by Robert Collins
Review feedback.
1882
    def get_converter(self, format=None):
1883
        """See BzrDirFormat.get_converter()."""
1534.5.13 by Robert Collins
Correct buggy test.
1884
        # 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.
1885
        return ConvertBzrDir4To5()
1886
        
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1887
    def initialize_on_transport(self, transport):
1534.4.39 by Robert Collins
Basic BzrDir support.
1888
        """Format 4 branches cannot be created."""
1889
        raise errors.UninitializableFormat(self)
1890
1891
    def is_supported(self):
1892
        """Format 4 is not supported.
1893
1894
        It is not supported because the model changed from 4 to 5 and the
1895
        conversion logic is expensive - so doing it on the fly was not 
1896
        feasible.
1897
        """
1898
        return False
1899
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1900
    def _open(self, transport):
1901
        """See BzrDirFormat._open."""
1902
        return BzrDir4(transport, self)
1903
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.
1904
    def __return_repository_format(self):
1905
        """Circular import protection."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1906
        from bzrlib.repofmt.weaverepo import RepositoryFormat4
1910.2.12 by Aaron Bentley
Implement knit repo format 2
1907
        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.
1908
    repository_format = property(__return_repository_format)
1909
1534.4.39 by Robert Collins
Basic BzrDir support.
1910
1911
class BzrDirFormat5(BzrDirFormat):
1912
    """Bzr control format 5.
1913
1914
    This format is a combined format for working tree, branch and repository.
1915
    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.
1916
     - Format 2 working trees [always] 
1917
     - Format 4 branches [always] 
1534.4.53 by Robert Collins
Review feedback from John Meinel.
1918
     - 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.
1919
       Unhashed stores in the repository.
1534.4.39 by Robert Collins
Basic BzrDir support.
1920
    """
1921
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1922
    _lock_class = lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1923
1534.4.39 by Robert Collins
Basic BzrDir support.
1924
    def get_format_string(self):
1925
        """See BzrDirFormat.get_format_string()."""
1926
        return "Bazaar-NG branch, format 5\n"
1927
3650.2.2 by Aaron Bentley
Implement get_branch_format, to unify branch creation code
1928
    def get_branch_format(self):
1929
        from bzrlib import branch
1930
        return branch.BzrBranchFormat4()
1931
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
1932
    def get_format_description(self):
1933
        """See BzrDirFormat.get_format_description()."""
1934
        return "All-in-one format 5"
1935
1534.5.16 by Robert Collins
Review feedback.
1936
    def get_converter(self, format=None):
1937
        """See BzrDirFormat.get_converter()."""
1534.5.13 by Robert Collins
Correct buggy test.
1938
        # 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.
1939
        return ConvertBzrDir5To6()
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1940
1941
    def _initialize_for_clone(self, url):
1942
        return self.initialize_on_transport(get_transport(url), _cloning=True)
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
1943
        
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
1944
    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.
1945
        """Format 5 dirs always have working tree, branch and repository.
1946
        
1947
        Except when they are being cloned.
1948
        """
1949
        from bzrlib.branch import BzrBranchFormat4
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1950
        from bzrlib.repofmt.weaverepo import RepositoryFormat5
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1951
        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.
1952
        RepositoryFormat5().initialize(result, _internal=True)
1953
        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.
1954
            branch = BzrBranchFormat4().initialize(result)
3650.5.6 by Aaron Bentley
Fix cloning problems by creating missing working tree files
1955
            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.
1956
        return result
1957
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
1958
    def _open(self, transport):
1959
        """See BzrDirFormat._open."""
1960
        return BzrDir5(transport, self)
1961
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.
1962
    def __return_repository_format(self):
1963
        """Circular import protection."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
1964
        from bzrlib.repofmt.weaverepo import RepositoryFormat5
1910.2.12 by Aaron Bentley
Implement knit repo format 2
1965
        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.
1966
    repository_format = property(__return_repository_format)
1967
1534.4.39 by Robert Collins
Basic BzrDir support.
1968
1969
class BzrDirFormat6(BzrDirFormat):
1970
    """Bzr control format 6.
1971
1972
    This format is a combined format for working tree, branch and repository.
1973
    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.
1974
     - Format 2 working trees [always] 
1975
     - Format 4 branches [always] 
1976
     - Format 6 repositories [always]
1534.4.39 by Robert Collins
Basic BzrDir support.
1977
    """
1978
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
1979
    _lock_class = lockable_files.TransportLock
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
1980
1534.4.39 by Robert Collins
Basic BzrDir support.
1981
    def get_format_string(self):
1982
        """See BzrDirFormat.get_format_string()."""
1983
        return "Bazaar-NG branch, format 6\n"
1984
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
1985
    def get_format_description(self):
1986
        """See BzrDirFormat.get_format_description()."""
1987
        return "All-in-one format 6"
1988
3650.2.2 by Aaron Bentley
Implement get_branch_format, to unify branch creation code
1989
    def get_branch_format(self):
1990
        from bzrlib import branch
1991
        return branch.BzrBranchFormat4()
1992
1534.5.16 by Robert Collins
Review feedback.
1993
    def get_converter(self, format=None):
1994
        """See BzrDirFormat.get_converter()."""
1534.5.13 by Robert Collins
Correct buggy test.
1995
        # 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.
1996
        return ConvertBzrDir6ToMeta()
1997
        
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
1998
    def _initialize_for_clone(self, url):
1999
        return self.initialize_on_transport(get_transport(url), _cloning=True)
2000
1608.2.8 by Martin Pool
Separate out BzrDir.initialize_on_transport so it
2001
    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.
2002
        """Format 6 dirs always have working tree, branch and repository.
2003
        
2004
        Except when they are being cloned.
2005
        """
2006
        from bzrlib.branch import BzrBranchFormat4
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2007
        from bzrlib.repofmt.weaverepo import RepositoryFormat6
1651.1.6 by Martin Pool
Clean up clone-bzrdir code
2008
        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.
2009
        RepositoryFormat6().initialize(result, _internal=True)
2010
        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.
2011
            branch = BzrBranchFormat4().initialize(result)
3650.5.7 by Aaron Bentley
Fix working tree initialization
2012
            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.
2013
        return result
2014
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
2015
    def _open(self, transport):
2016
        """See BzrDirFormat._open."""
2017
        return BzrDir6(transport, self)
2018
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.
2019
    def __return_repository_format(self):
2020
        """Circular import protection."""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2021
        from bzrlib.repofmt.weaverepo import RepositoryFormat6
1910.2.12 by Aaron Bentley
Implement knit repo format 2
2022
        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.
2023
    repository_format = property(__return_repository_format)
2024
1534.4.39 by Robert Collins
Basic BzrDir support.
2025
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
2026
class BzrDirMetaFormat1(BzrDirFormat):
2027
    """Bzr meta control format 1
2028
2029
    This is the first format with split out working tree, branch and repository
2030
    disk storage.
2031
    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.
2032
     - Format 3 working trees [optional]
2033
     - Format 5 branches [optional]
2034
     - 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.
2035
    """
2036
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2037
    _lock_class = lockdir.LockDir
1553.5.69 by Martin Pool
BzrDirFormat subclasses can now control what kind of overall lock is used.
2038
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
2039
    def __init__(self):
2040
        self._workingtree_format = None
2230.3.1 by Aaron Bentley
Get branch6 creation working
2041
        self._branch_format = None
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
2042
2100.3.15 by Aaron Bentley
get test suite passing
2043
    def __eq__(self, other):
2044
        if other.__class__ is not self.__class__:
2045
            return False
2046
        if other.repository_format != self.repository_format:
2047
            return False
2048
        if other.workingtree_format != self.workingtree_format:
2049
            return False
2050
        return True
2051
2100.3.35 by Aaron Bentley
equality operations on bzrdir
2052
    def __ne__(self, other):
2053
        return not self == other
2054
2230.3.55 by Aaron Bentley
Updates from review
2055
    def get_branch_format(self):
2230.3.1 by Aaron Bentley
Get branch6 creation working
2056
        if self._branch_format is None:
2057
            from bzrlib.branch import BranchFormat
2058
            self._branch_format = BranchFormat.get_default_format()
2059
        return self._branch_format
2060
2230.3.55 by Aaron Bentley
Updates from review
2061
    def set_branch_format(self, format):
2230.3.1 by Aaron Bentley
Get branch6 creation working
2062
        self._branch_format = format
2063
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
2064
    def require_stacking(self):
2065
        if not self.get_branch_format().supports_stacking():
2066
            # We need to make a stacked branch, but the default format for the
2067
            # target doesn't support stacking.  So force a branch that *can*
2068
            # support stacking.
2069
            from bzrlib.branch import BzrBranchFormat7
2070
            self._branch_format = BzrBranchFormat7()
2071
            mutter("using %r for stacking" % (self._branch_format,))
2072
            from bzrlib.repofmt import pack_repo
2073
            if self.repository_format.rich_root_data:
2074
                bzrdir_format_name = '1.6.1-rich-root'
2075
                repo_format = pack_repo.RepositoryFormatKnitPack5RichRoot()
2076
            else:
2077
                bzrdir_format_name = '1.6'
2078
                repo_format = pack_repo.RepositoryFormatKnitPack5()
2079
            note('Source format does not support stacking, using format:'
2080
                 ' \'%s\'\n  %s\n',
2081
                 bzrdir_format_name, repo_format.get_format_description())
2082
            self.repository_format = repo_format
2083
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.
2084
    def get_converter(self, format=None):
2085
        """See BzrDirFormat.get_converter()."""
2086
        if format is None:
2087
            format = BzrDirFormat.get_default_format()
2088
        if not isinstance(self, format.__class__):
2089
            # converting away from metadir is not implemented
2090
            raise NotImplementedError(self.get_converter)
2091
        return ConvertMetaToMeta(format)
2092
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
2093
    def get_format_string(self):
2094
        """See BzrDirFormat.get_format_string()."""
2095
        return "Bazaar-NG meta directory, format 1\n"
2096
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
2097
    def get_format_description(self):
2098
        """See BzrDirFormat.get_format_description()."""
2099
        return "Meta directory format 1"
2100
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
2101
    def _open(self, transport):
2102
        """See BzrDirFormat._open."""
2230.3.24 by Aaron Bentley
Remove format-on-open code
2103
        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.
2104
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.
2105
    def __return_repository_format(self):
2106
        """Circular import protection."""
2107
        if getattr(self, '_repository_format', None):
2108
            return self._repository_format
2109
        from bzrlib.repository import RepositoryFormat
2110
        return RepositoryFormat.get_default_format()
2111
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.
2112
    def _set_repository_format(self, value):
3015.2.8 by Robert Collins
Typo in __set_repository_format's docstring.
2113
        """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.
2114
        self._repository_format = value
1553.5.72 by Martin Pool
Clean up test for Branch5 lockdirs
2115
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.
2116
    repository_format = property(__return_repository_format,
2117
        _set_repository_format)
2118
2119
    def _supply_sub_formats_to(self, other_format):
2120
        """Give other_format the same values for sub formats as this has.
2121
2122
        This method is expected to be used when parameterising a
2123
        RemoteBzrDirFormat instance with the parameters from a
2124
        BzrDirMetaFormat1 instance.
2125
2126
        :param other_format: other_format is a format which should be
2127
            compatible with whatever sub formats are supported by self.
2128
        :return: None.
2129
        """
2130
        if getattr(self, '_repository_format', None) is not None:
2131
            other_format.repository_format = self.repository_format
2132
        if self._branch_format is not None:
2133
            other_format._branch_format = self._branch_format
2134
        if self._workingtree_format is not None:
2135
            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.
2136
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
2137
    def __get_workingtree_format(self):
2138
        if self._workingtree_format is None:
2139
            from bzrlib.workingtree import WorkingTreeFormat
2140
            self._workingtree_format = WorkingTreeFormat.get_default_format()
2141
        return self._workingtree_format
2142
2143
    def __set_workingtree_format(self, wt_format):
2144
        self._workingtree_format = wt_format
2145
2146
    workingtree_format = property(__get_workingtree_format,
2147
                                  __set_workingtree_format)
2148
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
2149
2164.2.19 by Vincent Ladeuil
Revert BzrDirFormat1 registering.
2150
# Register bzr control format
2151
BzrDirFormat.register_control_format(BzrDirFormat)
2164.2.13 by v.ladeuil+lp at free
Add tests for redirection. Preserve transport decorations.
2152
2153
# Register bzr formats
1534.4.39 by Robert Collins
Basic BzrDir support.
2154
BzrDirFormat.register_format(BzrDirFormat4())
2155
BzrDirFormat.register_format(BzrDirFormat5())
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
2156
BzrDirFormat.register_format(BzrDirFormat6())
2157
__default_format = BzrDirMetaFormat1()
1534.4.39 by Robert Collins
Basic BzrDir support.
2158
BzrDirFormat.register_format(__default_format)
2204.4.13 by Aaron Bentley
Update all test cases to avoid set_default_format
2159
BzrDirFormat._default_format = __default_format
1534.4.39 by Robert Collins
Basic BzrDir support.
2160
2161
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2162
class Converter(object):
2163
    """Converts a disk format object from one format to another."""
2164
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2165
    def convert(self, to_convert, pb):
2166
        """Perform the conversion of to_convert, giving feedback via pb.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2167
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2168
        :param to_convert: The disk object to convert.
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2169
        :param pb: a progress bar to use for progress information.
2170
        """
2171
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.
2172
    def step(self, message):
2173
        """Update the pb by a step."""
2174
        self.count +=1
2175
        self.pb.update(message, self.count, self.total)
2176
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2177
2178
class ConvertBzrDir4To5(Converter):
2179
    """Converts format 4 bzr dirs to format 5."""
2180
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2181
    def __init__(self):
2182
        super(ConvertBzrDir4To5, self).__init__()
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2183
        self.converted_revs = set()
2184
        self.absent_revisions = set()
2185
        self.text_count = 0
2186
        self.revisions = {}
2187
        
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2188
    def convert(self, to_convert, pb):
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2189
        """See Converter.convert()."""
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2190
        self.bzrdir = to_convert
2191
        self.pb = pb
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2192
        self.pb.note('starting upgrade from format 4 to 5')
3224.5.24 by Andrew Bennetts
More minor import tidying suggested by pyflakes.
2193
        if isinstance(self.bzrdir.transport, local.LocalTransport):
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2194
            self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
2195
        self._convert_to_weaves()
2196
        return BzrDir.open(self.bzrdir.root_transport.base)
2197
2198
    def _convert_to_weaves(self):
2199
        self.pb.note('note: upgrade may be faster if all store files are ungzipped first')
2200
        try:
2201
            # TODO permissions
2202
            stat = self.bzrdir.transport.stat('weaves')
2203
            if not S_ISDIR(stat.st_mode):
2204
                self.bzrdir.transport.delete('weaves')
2205
                self.bzrdir.transport.mkdir('weaves')
2206
        except errors.NoSuchFile:
2207
            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.
2208
        # 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.
2209
        self.inv_weave = Weave('inventory')
2210
        # holds in-memory weaves for all files
2211
        self.text_weaves = {}
2212
        self.bzrdir.transport.delete('branch-format')
2213
        self.branch = self.bzrdir.open_branch()
2214
        self._convert_working_inv()
2215
        rev_history = self.branch.revision_history()
2216
        # to_read is a stack holding the revisions we still need to process;
2217
        # appending to it adds new highest-priority revisions
2218
        self.known_revisions = set(rev_history)
2219
        self.to_read = rev_history[-1:]
2220
        while self.to_read:
2221
            rev_id = self.to_read.pop()
2222
            if (rev_id not in self.revisions
2223
                and rev_id not in self.absent_revisions):
2224
                self._load_one_rev(rev_id)
2225
        self.pb.clear()
2226
        to_import = self._make_order()
2227
        for i, rev_id in enumerate(to_import):
2228
            self.pb.update('converting revision', i, len(to_import))
2229
            self._convert_one_rev(rev_id)
2230
        self.pb.clear()
2231
        self._write_all_weaves()
2232
        self._write_all_revs()
2233
        self.pb.note('upgraded to weaves:')
2234
        self.pb.note('  %6d revisions and inventories', len(self.revisions))
2235
        self.pb.note('  %6d revisions not present', len(self.absent_revisions))
2236
        self.pb.note('  %6d texts', self.text_count)
2237
        self._cleanup_spare_files_after_format4()
3407.2.13 by Martin Pool
Remove indirection through control_files to get transports
2238
        self.branch._transport.put_bytes(
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2239
            'branch-format',
2240
            BzrDirFormat5().get_format_string(),
3446.1.1 by Martin Pool
merge further LockableFile deprecations
2241
            mode=self.bzrdir._get_file_mode())
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2242
2243
    def _cleanup_spare_files_after_format4(self):
2244
        # FIXME working tree upgrade foo.
2245
        for n in 'merged-patches', 'pending-merged-patches':
2246
            try:
2247
                ## assert os.path.getsize(p) == 0
2248
                self.bzrdir.transport.delete(n)
2249
            except errors.NoSuchFile:
2250
                pass
2251
        self.bzrdir.transport.delete_tree('inventory-store')
2252
        self.bzrdir.transport.delete_tree('text-store')
2253
2254
    def _convert_working_inv(self):
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
2255
        inv = xml4.serializer_v4.read_inventory(
3407.2.1 by Martin Pool
Deprecate LockableFiles.get
2256
                self.branch._transport.get('inventory'))
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2257
        new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv, working=True)
3407.2.1 by Martin Pool
Deprecate LockableFiles.get
2258
        self.branch._transport.put_bytes('inventory', new_inv_xml,
3446.1.1 by Martin Pool
merge further LockableFile deprecations
2259
            mode=self.bzrdir._get_file_mode())
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2260
2261
    def _write_all_weaves(self):
2262
        controlweaves = WeaveStore(self.bzrdir.transport, prefixed=False)
2263
        weave_transport = self.bzrdir.transport.clone('weaves')
2264
        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
2265
        transaction = WriteTransaction()
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2266
2267
        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.
2268
            i = 0
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2269
            for file_id, file_weave in self.text_weaves.items():
2270
                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.
2271
                weaves._put_weave(file_id, file_weave, transaction)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2272
                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.
2273
            self.pb.update('inventory', 0, 1)
2274
            controlweaves._put_weave('inventory', self.inv_weave, transaction)
2275
            self.pb.update('inventory', 1, 1)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2276
        finally:
2277
            self.pb.clear()
2278
2279
    def _write_all_revs(self):
2280
        """Write all revisions out in new form."""
2281
        self.bzrdir.transport.delete_tree('revision-store')
2282
        self.bzrdir.transport.mkdir('revision-store')
2283
        revision_transport = self.bzrdir.transport.clone('revision-store')
2284
        # 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.
2285
        from bzrlib.xml5 import serializer_v5
3350.6.10 by Martin Pool
VersionedFiles review cleanups
2286
        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.
2287
        revision_store = RevisionTextStore(revision_transport,
2288
            serializer_v5, False, versionedfile.PrefixMapper(),
2289
            lambda:True, lambda:True)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2290
        try:
2291
            for i, rev_id in enumerate(self.converted_revs):
2292
                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.
2293
                text = serializer_v5.write_revision_to_string(
2294
                    self.revisions[rev_id])
2295
                key = (rev_id,)
2296
                revision_store.add_lines(key, None, osutils.split_lines(text))
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2297
        finally:
2298
            self.pb.clear()
2299
            
2300
    def _load_one_rev(self, rev_id):
2301
        """Load a revision object into memory.
2302
2303
        Any parents not either loaded or abandoned get queued to be
2304
        loaded."""
2305
        self.pb.update('loading revision',
2306
                       len(self.revisions),
2307
                       len(self.known_revisions))
1563.2.22 by Robert Collins
Move responsibility for repository.has_revision into RevisionStore
2308
        if not self.branch.repository.has_revision(rev_id):
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2309
            self.pb.clear()
2310
            self.pb.note('revision {%s} not present in branch; '
2311
                         'will be converted as a ghost',
2312
                         rev_id)
2313
            self.absent_revisions.add(rev_id)
2314
        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.
2315
            rev = self.branch.repository.get_revision(rev_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2316
            for parent_id in rev.parent_ids:
2317
                self.known_revisions.add(parent_id)
2318
                self.to_read.append(parent_id)
2319
            self.revisions[rev_id] = rev
2320
2321
    def _load_old_inventory(self, rev_id):
2322
        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.
2323
        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
2324
        inv.revision_id = rev_id
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2325
        rev = self.revisions[rev_id]
2326
        return inv
2327
2328
    def _load_updated_inventory(self, rev_id):
2329
        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.
2330
        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.
2331
        return inv
2332
2333
    def _convert_one_rev(self, rev_id):
2334
        """Convert revision and all referenced objects to new format."""
2335
        rev = self.revisions[rev_id]
2336
        inv = self._load_old_inventory(rev_id)
2337
        present_parents = [p for p in rev.parent_ids
2338
                           if p not in self.absent_revisions]
2339
        self._convert_revision_contents(rev, inv, present_parents)
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2340
        self._store_new_inv(rev, inv, present_parents)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2341
        self.converted_revs.add(rev_id)
2342
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2343
    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.
2344
        new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2345
        new_inv_sha1 = sha_string(new_inv_xml)
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
2346
        self.inv_weave.add_lines(rev.revision_id,
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
2347
                                 present_parents,
2348
                                 new_inv_xml.splitlines(True))
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2349
        rev.inventory_sha1 = new_inv_sha1
2350
2351
    def _convert_revision_contents(self, rev, inv, present_parents):
2352
        """Convert all the files within a revision.
2353
2354
        Also upgrade the inventory to refer to the text revision ids."""
2355
        rev_id = rev.revision_id
2356
        mutter('converting texts of revision {%s}',
2357
               rev_id)
2358
        parent_invs = map(self._load_updated_inventory, present_parents)
1731.1.62 by Aaron Bentley
Changes from review comments
2359
        entries = inv.iter_entries()
2360
        entries.next()
2361
        for path, ie in entries:
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2362
            self._convert_file_version(rev, ie, parent_invs)
2363
2364
    def _convert_file_version(self, rev, ie, parent_invs):
2365
        """Convert one version of one file.
2366
2367
        The file needs to be added into the weave if it is a merge
2368
        of >=2 parents or if it's changed from its parent.
2369
        """
2370
        file_id = ie.file_id
2371
        rev_id = rev.revision_id
2372
        w = self.text_weaves.get(file_id)
2373
        if w is None:
2374
            w = Weave(file_id)
2375
            self.text_weaves[file_id] = w
2376
        text_changed = False
2776.1.5 by Robert Collins
Add reasonably comprehensive tests for path last modified and per file graph behaviour.
2377
        parent_candiate_entries = ie.parent_candidates(parent_invs)
2378
        heads = graph.Graph(self).heads(parent_candiate_entries.keys())
2379
        # XXX: Note that this is unordered - and this is tolerable because 
2380
        # the previous code was also unordered.
2381
        previous_entries = dict((head, parent_candiate_entries[head]) for head
2382
            in heads)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2383
        self.snapshot_ie(previous_entries, ie, w, rev_id)
2384
        del ie.text_id
2385
3099.3.7 by John Arbash Meinel
Another parent provider I didn't realize existed.
2386
    @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.
2387
    def get_parents(self, revision_ids):
2388
        for revision_id in revision_ids:
2389
            yield self.revisions[revision_id].parent_ids
2390
3099.3.7 by John Arbash Meinel
Another parent provider I didn't realize existed.
2391
    def get_parent_map(self, revision_ids):
2392
        """See graph._StackedParentsProvider.get_parent_map"""
2393
        return dict((revision_id, self.revisions[revision_id])
2394
                    for revision_id in revision_ids
2395
                     if revision_id in self.revisions)
2396
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2397
    def snapshot_ie(self, previous_revisions, ie, w, rev_id):
2398
        # TODO: convert this logic, which is ~= snapshot to
2399
        # a call to:. This needs the path figured out. rather than a work_tree
2400
        # a v4 revision_tree can be given, or something that looks enough like
2401
        # one to give the file content to the entry if it needs it.
2402
        # and we need something that looks like a weave store for snapshot to 
2403
        # save against.
2404
        #ie.snapshot(rev, PATH, previous_revisions, REVISION_TREE, InMemoryWeaveStore(self.text_weaves))
2405
        if len(previous_revisions) == 1:
2406
            previous_ie = previous_revisions.values()[0]
2407
            if ie._unchanged(previous_ie):
2408
                ie.revision = previous_ie.revision
2409
                return
2410
        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.
2411
            text = self.branch.repository._text_store.get(ie.text_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2412
            file_lines = text.readlines()
1563.2.18 by Robert Collins
get knit repositories really using knits for text storage.
2413
            w.add_lines(rev_id, previous_revisions, file_lines)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2414
            self.text_count += 1
2415
        else:
1563.2.18 by Robert Collins
get knit repositories really using knits for text storage.
2416
            w.add_lines(rev_id, previous_revisions, [])
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2417
        ie.revision = rev_id
2418
2419
    def _make_order(self):
2420
        """Return a suitable order for importing revisions.
2421
2422
        The order must be such that an revision is imported after all
2423
        its (present) parents.
2424
        """
2425
        todo = set(self.revisions.keys())
2426
        done = self.absent_revisions.copy()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2427
        order = []
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2428
        while todo:
2429
            # scan through looking for a revision whose parents
2430
            # are all done
2431
            for rev_id in sorted(list(todo)):
2432
                rev = self.revisions[rev_id]
2433
                parent_ids = set(rev.parent_ids)
2434
                if parent_ids.issubset(done):
2435
                    # can take this one now
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2436
                    order.append(rev_id)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2437
                    todo.remove(rev_id)
2438
                    done.add(rev_id)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2439
        return order
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2440
2441
2442
class ConvertBzrDir5To6(Converter):
2443
    """Converts format 5 bzr dirs to format 6."""
2444
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2445
    def convert(self, to_convert, pb):
2446
        """See Converter.convert()."""
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2447
        self.bzrdir = to_convert
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2448
        self.pb = pb
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2449
        self.pb.note('starting upgrade from format 5 to 6')
2450
        self._convert_to_prefixed()
2451
        return BzrDir.open(self.bzrdir.root_transport.base)
2452
2453
    def _convert_to_prefixed(self):
1608.2.1 by Martin Pool
[merge] Storage filename escaping
2454
        from bzrlib.store import TransportStore
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2455
        self.bzrdir.transport.delete('branch-format')
2456
        for store_name in ["weaves", "revision-store"]:
1608.2.1 by Martin Pool
[merge] Storage filename escaping
2457
            self.pb.note("adding prefixes to %s" % store_name)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2458
            store_transport = self.bzrdir.transport.clone(store_name)
1608.2.1 by Martin Pool
[merge] Storage filename escaping
2459
            store = TransportStore(store_transport, prefixed=True)
1608.1.1 by Martin Pool
[patch] LocalTransport.list_dir should return url-quoted strings (ddaa)
2460
            for urlfilename in store_transport.list_dir('.'):
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
2461
                filename = urlutils.unescape(urlfilename)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2462
                if (filename.endswith(".weave") or
2463
                    filename.endswith(".gz") or
2464
                    filename.endswith(".sig")):
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
2465
                    file_id, suffix = os.path.splitext(filename)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2466
                else:
2467
                    file_id = filename
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
2468
                    suffix = ''
2469
                new_name = store._mapper.map((file_id,)) + suffix
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2470
                # FIXME keep track of the dirs made RBC 20060121
2471
                try:
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
2472
                    store_transport.move(filename, new_name)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2473
                except errors.NoSuchFile: # catches missing dirs strangely enough
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
2474
                    store_transport.mkdir(osutils.dirname(new_name))
2475
                    store_transport.move(filename, new_name)
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2476
        self.bzrdir.transport.put_bytes(
2477
            'branch-format',
2478
            BzrDirFormat6().get_format_string(),
3446.1.1 by Martin Pool
merge further LockableFile deprecations
2479
            mode=self.bzrdir._get_file_mode())
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
2480
2481
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2482
class ConvertBzrDir6ToMeta(Converter):
2483
    """Converts format 6 bzr dirs to metadirs."""
2484
2485
    def convert(self, to_convert, pb):
2486
        """See Converter.convert()."""
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
2487
        from bzrlib.repofmt.weaverepo import RepositoryFormat7
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
2488
        from bzrlib.branch import BzrBranchFormat5
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2489
        self.bzrdir = to_convert
2490
        self.pb = pb
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2491
        self.count = 0
2492
        self.total = 20 # the steps we know about
2493
        self.garbage_inventories = []
3446.1.1 by Martin Pool
merge further LockableFile deprecations
2494
        self.dir_mode = self.bzrdir._get_dir_mode()
2495
        self.file_mode = self.bzrdir._get_file_mode()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2496
1534.5.13 by Robert Collins
Correct buggy test.
2497
        self.pb.note('starting upgrade from format 6 to metadir')
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2498
        self.bzrdir.transport.put_bytes(
2499
                'branch-format',
2500
                "Converting to format 6",
2501
                mode=self.file_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2502
        # its faster to move specific files around than to open and use the apis...
2503
        # first off, nuke ancestry.weave, it was never used.
2504
        try:
2505
            self.step('Removing ancestry.weave')
2506
            self.bzrdir.transport.delete('ancestry.weave')
2507
        except errors.NoSuchFile:
2508
            pass
2509
        # find out whats there
2510
        self.step('Finding branch files')
1666.1.3 by Robert Collins
Fix and test upgrades from bzrdir 6 over SFTP.
2511
        last_revision = self.bzrdir.open_branch().last_revision()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2512
        bzrcontents = self.bzrdir.transport.list_dir('.')
2513
        for name in bzrcontents:
2514
            if name.startswith('basis-inventory.'):
2515
                self.garbage_inventories.append(name)
2516
        # create new directories for repository, working tree and branch
2517
        repository_names = [('inventory.weave', True),
2518
                            ('revision-store', True),
2519
                            ('weaves', True)]
2520
        self.step('Upgrading repository  ')
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
2521
        self.bzrdir.transport.mkdir('repository', mode=self.dir_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2522
        self.make_lock('repository')
2523
        # we hard code the formats here because we are converting into
2524
        # the meta format. The meta format upgrader can take this to a 
2525
        # future format within each component.
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
2526
        self.put_format('repository', RepositoryFormat7())
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2527
        for entry in repository_names:
2528
            self.move_entry('repository', entry)
2529
2530
        self.step('Upgrading branch      ')
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
2531
        self.bzrdir.transport.mkdir('branch', mode=self.dir_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2532
        self.make_lock('branch')
2094.3.5 by John Arbash Meinel
Fix imports to ensure modules are loaded before they are used
2533
        self.put_format('branch', BzrBranchFormat5())
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2534
        branch_files = [('revision-history', True),
2535
                        ('branch-name', True),
2536
                        ('parent', False)]
2537
        for entry in branch_files:
2538
            self.move_entry('branch', entry)
2539
2540
        checkout_files = [('pending-merges', True),
2541
                          ('inventory', True),
2542
                          ('stat-cache', False)]
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
2543
        # If a mandatory checkout file is not present, the branch does not have
2544
        # a functional checkout. Do not create a checkout in the converted
2545
        # branch.
2546
        for name, mandatory in checkout_files:
2547
            if mandatory and name not in bzrcontents:
2548
                has_checkout = False
2549
                break
2550
        else:
2551
            has_checkout = True
2552
        if not has_checkout:
2553
            self.pb.note('No working tree.')
2554
            # If some checkout files are there, we may as well get rid of them.
2555
            for name, mandatory in checkout_files:
2556
                if name in bzrcontents:
2557
                    self.bzrdir.transport.delete(name)
2558
        else:
2123.2.1 by John Arbash Meinel
Fix bug #70716, make bzrlib.bzrdir directly import bzrlib.workingtree
2559
            from bzrlib.workingtree import WorkingTreeFormat3
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
2560
            self.step('Upgrading working tree')
2561
            self.bzrdir.transport.mkdir('checkout', mode=self.dir_mode)
2562
            self.make_lock('checkout')
2563
            self.put_format(
2123.2.1 by John Arbash Meinel
Fix bug #70716, make bzrlib.bzrdir directly import bzrlib.workingtree
2564
                'checkout', WorkingTreeFormat3())
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
2565
            self.bzrdir.transport.delete_multi(
2566
                self.garbage_inventories, self.pb)
2567
            for entry in checkout_files:
2568
                self.move_entry('checkout', entry)
2569
            if last_revision is not None:
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2570
                self.bzrdir.transport.put_bytes(
1959.3.1 by John Arbash Meinel
David Allouche: bzr upgrade should work if there is no working tree
2571
                    'checkout/last-revision', last_revision)
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2572
        self.bzrdir.transport.put_bytes(
2573
            'branch-format',
2574
            BzrDirMetaFormat1().get_format_string(),
2575
            mode=self.file_mode)
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
2576
        return BzrDir.open(self.bzrdir.root_transport.base)
2577
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2578
    def make_lock(self, name):
2579
        """Make a lock for the new control dir name."""
2580
        self.step('Make %s lock' % name)
1996.3.3 by John Arbash Meinel
Shave off another 40ms by demand loading branch and bzrdir
2581
        ld = lockdir.LockDir(self.bzrdir.transport,
2582
                             '%s/lock' % name,
2583
                             file_modebits=self.file_mode,
2584
                             dir_modebits=self.dir_mode)
1553.5.79 by Martin Pool
upgrade to metadir should create LockDirs not files
2585
        ld.create()
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2586
2587
    def move_entry(self, new_dir, entry):
2588
        """Move then entry name into new_dir."""
2589
        name = entry[0]
2590
        mandatory = entry[1]
2591
        self.step('Moving %s' % name)
2592
        try:
2593
            self.bzrdir.transport.move(name, '%s/%s' % (new_dir, name))
2594
        except errors.NoSuchFile:
2595
            if mandatory:
2596
                raise
2597
2598
    def put_format(self, dirname, format):
3407.2.5 by Martin Pool
Deprecate LockableFiles.put_utf8
2599
        self.bzrdir.transport.put_bytes('%s/format' % dirname,
2600
            format.get_format_string(),
2601
            self.file_mode)
1534.5.11 by Robert Collins
Implement upgrades to Metaformat trees.
2602
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.
2603
2604
class ConvertMetaToMeta(Converter):
2605
    """Converts the components of metadirs."""
2606
2607
    def __init__(self, target_format):
2608
        """Create a metadir to metadir converter.
2609
2610
        :param target_format: The final metadir format that is desired.
2611
        """
2612
        self.target_format = target_format
2613
2614
    def convert(self, to_convert, pb):
2615
        """See Converter.convert()."""
2616
        self.bzrdir = to_convert
2617
        self.pb = pb
2618
        self.count = 0
2619
        self.total = 1
2620
        self.step('checking repository format')
2621
        try:
2622
            repo = self.bzrdir.open_repository()
2623
        except errors.NoRepositoryPresent:
2624
            pass
2625
        else:
2626
            if not isinstance(repo._format, self.target_format.repository_format.__class__):
2627
                from bzrlib.repository import CopyConverter
2628
                self.pb.note('starting repository conversion')
2629
                converter = CopyConverter(self.target_format.repository_format)
2630
                converter.convert(repo, pb)
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
2631
        try:
2632
            branch = self.bzrdir.open_branch()
2633
        except errors.NotBranchError:
2634
            pass
2635
        else:
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2636
            # TODO: conversions of Branch and Tree should be done by
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
2637
            # InterXFormat lookups/some sort of registry.
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
2638
            # Avoid circular imports
2639
            from bzrlib import branch as _mod_branch
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
2640
            old = branch._format.__class__
2641
            new = self.target_format.get_branch_format().__class__
2642
            while old != new:
2643
                if (old == _mod_branch.BzrBranchFormat5 and
2644
                    new in (_mod_branch.BzrBranchFormat6,
2645
                        _mod_branch.BzrBranchFormat7)):
2646
                    branch_converter = _mod_branch.Converter5to6()
2647
                elif (old == _mod_branch.BzrBranchFormat6 and
2648
                    new == _mod_branch.BzrBranchFormat7):
2649
                    branch_converter = _mod_branch.Converter6to7()
2650
                else:
2651
                    raise errors.BadConversionTarget("No converter", new)
2230.3.29 by Aaron Bentley
Implement conversion to branch 6
2652
                branch_converter.convert(branch)
3221.11.5 by Robert Collins
Correctly handle multi-step branch upgrades.
2653
                branch = self.bzrdir.open_branch()
2654
                old = branch._format.__class__
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2655
        try:
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
2656
            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.
2657
        except (errors.NoWorkingTree, errors.NotLocalUrl):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2658
            pass
2659
        else:
2660
            # TODO: conversions of Branch and Tree should be done by
2661
            # InterXFormat lookups
2662
            if (isinstance(tree, workingtree.WorkingTree3) and
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
2663
                not isinstance(tree, workingtree_4.DirStateWorkingTree) and
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2664
                isinstance(self.target_format.workingtree_format,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
2665
                    workingtree_4.DirStateWorkingTreeFormat)):
2255.12.1 by Robert Collins
Implement upgrade for working trees.
2666
                workingtree_4.Converter3to4().convert(tree)
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
2667
            if (isinstance(tree, workingtree_4.DirStateWorkingTree) and
2668
                not isinstance(tree, workingtree_4.WorkingTree5) and
3907.2.1 by Ian Clatworthy
WorkingTreeFormat5 supporting content filtering and views
2669
                isinstance(self.target_format.workingtree_format,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
2670
                    workingtree_4.WorkingTreeFormat5)):
2671
                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.
2672
        return to_convert
1731.2.18 by Aaron Bentley
Get extract in repository under test
2673
2674
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
2675
# This is not in remote.py because it's small, and needs to be registered.
2676
# Putting it in remote.py creates a circular import problem.
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
2677
# we can make it a lazy object if the control formats is turned into something
2678
# like a registry.
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
2679
class RemoteBzrDirFormat(BzrDirMetaFormat1):
2680
    """Format representing bzrdirs accessed via a smart server"""
2681
2682
    def get_format_description(self):
2683
        return 'bzr remote bzrdir'
2684
    
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
2685
    @classmethod
2686
    def probe_transport(klass, transport):
2687
        """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).
2688
        try:
3241.1.4 by Andrew Bennetts
Use get_smart_medium as suggested by Robert, and deal with the fallout.
2689
            medium = transport.get_smart_medium()
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
2690
        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).
2691
                errors.TransportNotPossible, errors.NoSmartMedium,
2692
                errors.SmartProtocolError):
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
2693
            # no smart server, so not a branch for this format type.
2694
            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).
2695
        else:
3241.1.2 by Andrew Bennetts
Tidy comments.
2696
            # 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).
2697
            # 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).
2698
            if medium.should_probe():
2699
                try:
2700
                    server_version = medium.protocol_version()
2701
                except errors.SmartProtocolError:
2702
                    # Apparently there's no usable smart server there, even though
2703
                    # the medium supports the smart protocol.
2704
                    raise errors.NotBranchError(path=transport.base)
2705
                if server_version != '2':
2706
                    raise errors.NotBranchError(path=transport.base)
2018.5.28 by Robert Collins
Fix RemoteBzrDirFormat probe api usage.
2707
            return klass()
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
2708
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2709
    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.
2710
        try:
2711
            # 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.
2712
            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.
2713
        except errors.NoSmartMedium:
2714
            # TODO: lookup the local format from a server hint.
2715
            local_dir_format = BzrDirMetaFormat1()
2716
            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.
2717
        client = _SmartClient(client_medium)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2718
        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.
2719
        response = client.call('BzrDirFormat.initialize', path)
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
2720
        if response[0] != 'ok':
2721
            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.
2722
        format = RemoteBzrDirFormat()
2723
        self._supply_sub_formats_to(format)
2724
        return remote.RemoteBzrDir(transport, format)
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
2725
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
2726
    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.
2727
        return remote.RemoteBzrDir(transport, self)
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
2728
2729
    def __eq__(self, other):
2730
        if not isinstance(other, RemoteBzrDirFormat):
2731
            return False
2732
        return self.get_format_description() == other.get_format_description()
2733
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.
2734
    def __return_repository_format(self):
2735
        # Always return a RemoteRepositoryFormat object, but if a specific bzr
2736
        # repository format has been asked for, tell the RemoteRepositoryFormat
2737
        # that it should use that for init() etc.
2738
        result =  remote.RemoteRepositoryFormat()
2739
        custom_format = getattr(self, '_repository_format', None)
2740
        if custom_format:
2741
            # We will use the custom format to create repositories over the
2742
            # wire; expose its details like rich_root_data for code to query
2743
            result._custom_format = custom_format
2744
            result.rich_root_data = custom_format.rich_root_data
2745
        return result
2746
2747
    repository_format = property(__return_repository_format,
2748
        BzrDirMetaFormat1._set_repository_format) #.im_func)
3845.1.1 by John Arbash Meinel
Ensure that RepositoryFormat._matchingbzrdir.repository_format matches.
2749
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
2750
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
2751
BzrDirFormat.register_control_server_format(RemoteBzrDirFormat)
2018.5.45 by Andrew Bennetts
Merge from bzr.dev
2752
2753
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2754
class BzrDirFormatInfo(object):
2755
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
2756
    def __init__(self, native, deprecated, hidden, experimental):
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2757
        self.deprecated = deprecated
2758
        self.native = native
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2759
        self.hidden = hidden
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
2760
        self.experimental = experimental
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2761
2762
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2763
class BzrDirFormatRegistry(registry.Registry):
2764
    """Registry of user-selectable BzrDir subformats.
2765
    
2766
    Differs from BzrDirFormat._control_formats in that it provides sub-formats,
2767
    e.g. BzrDirMeta1 with weave repository.  Also, it's more user-oriented.
2768
    """
2769
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
2770
    def __init__(self):
2771
        """Create a BzrDirFormatRegistry."""
2772
        self._aliases = set()
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2773
        self._registration_order = list()
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
2774
        super(BzrDirFormatRegistry, self).__init__()
2775
2776
    def aliases(self):
2777
        """Return a set of the format names which are aliases."""
2778
        return frozenset(self._aliases)
2779
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2780
    def register_metadir(self, key,
2781
             repository_format, help, native=True, deprecated=False,
2782
             branch_format=None,
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2783
             tree_format=None,
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
2784
             hidden=False,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
2785
             experimental=False,
2786
             alias=False):
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2787
        """Register a metadir subformat.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2788
2789
        These all use a BzrDirMetaFormat1 bzrdir, but can be parameterized
2790
        by the Repository format.
2791
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2792
        :param repository_format: The fully-qualified repository format class
2793
            name as a string.
2794
        :param branch_format: Fully-qualified branch format class name as
2795
            a string.
2796
        :param tree_format: Fully-qualified tree format class name as
2797
            a string.
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2798
        """
2799
        # This should be expanded to support setting WorkingTree and Branch
2800
        # formats, once BzrDirMetaFormat1 supports that.
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2801
        def _load(full_name):
2802
            mod_name, factory_name = full_name.rsplit('.', 1)
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
2803
            try:
2804
                mod = __import__(mod_name, globals(), locals(),
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2805
                        [factory_name])
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
2806
            except ImportError, e:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2807
                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.
2808
            try:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2809
                factory = getattr(mod, factory_name)
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
2810
            except AttributeError:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2811
                raise AttributeError('no factory %s in module %r'
2812
                    % (full_name, mod))
2813
            return factory()
2814
2815
        def helper():
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2816
            bd = BzrDirMetaFormat1()
2230.3.1 by Aaron Bentley
Get branch6 creation working
2817
            if branch_format is not None:
2255.2.158 by Martin Pool
Most of the integration of dirstate and subtree
2818
                bd.set_branch_format(_load(branch_format))
2819
            if tree_format is not None:
2820
                bd.workingtree_format = _load(tree_format)
2821
            if repository_format is not None:
2822
                bd.repository_format = _load(repository_format)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2823
            return bd
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
2824
        self.register(key, helper, help, native, deprecated, hidden,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
2825
            experimental, alias)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2826
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2827
    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
2828
                 hidden=False, experimental=False, alias=False):
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2829
        """Register a BzrDirFormat factory.
2830
        
2831
        The factory must be a callable that takes one parameter: the key.
2832
        It must produce an instance of the BzrDirFormat when called.
2833
2834
        This function mainly exists to prevent the info object from being
2835
        supplied directly.
2836
        """
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
2837
        registry.Registry.register(self, key, factory, help,
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
2838
            BzrDirFormatInfo(native, deprecated, hidden, experimental))
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
2839
        if alias:
2840
            self._aliases.add(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2841
        self._registration_order.append(key)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2842
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
2843
    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
2844
        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
2845
        registry.Registry.register_lazy(self, key, module_name, member_name,
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
2846
            help, BzrDirFormatInfo(native, deprecated, hidden, experimental))
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
2847
        if alias:
2848
            self._aliases.add(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2849
        self._registration_order.append(key)
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2850
2851
    def set_default(self, key):
2852
        """Set the 'default' key to be a clone of the supplied key.
2853
        
2854
        This method must be called once and only once.
2855
        """
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
2856
        registry.Registry.register(self, 'default', self.get(key),
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2857
            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
2858
        self._aliases.add('default')
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2859
2204.4.11 by Aaron Bentley
deprecate Repository.set_default_format, update upgrade tests
2860
    def set_default_repository(self, key):
2861
        """Set the FormatRegistry default and Repository default.
2862
        
2863
        This is a transitional method while Repository.set_default_format
2864
        is deprecated.
2865
        """
2866
        if 'default' in self:
2867
            self.remove('default')
2868
        self.set_default(key)
2869
        format = self.get('default')()
2870
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2871
    def make_bzrdir(self, key):
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
2872
        return self.get(key)()
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2873
2874
    def help_topic(self, topic):
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2875
        output = ""
2711.2.4 by Martin Pool
Fix unbound variable error in BzrDirFormatRegistry.get_help (test order dependent)
2876
        default_realkey = None
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2877
        default_help = self.get_help('default')
2878
        help_pairs = []
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2879
        for key in self._registration_order:
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2880
            if key == 'default':
2881
                continue
2882
            help = self.get_help(key)
2883
            if help == default_help:
2884
                default_realkey = key
2885
            else:
2886
                help_pairs.append((key, help))
2887
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2888
        def wrapped(key, help, info):
2889
            if info.native:
2890
                help = '(native) ' + help
2666.1.1 by Ian Clatworthy
Bazaar User Reference generated from online help
2891
            return ':%s:\n%s\n\n' % (key, 
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2892
                    textwrap.fill(help, initial_indent='    ', 
2893
                    subsequent_indent='    '))
2711.2.4 by Martin Pool
Fix unbound variable error in BzrDirFormatRegistry.get_help (test order dependent)
2894
        if default_realkey is not None:
2895
            output += wrapped(default_realkey, '(default) %s' % default_help,
2896
                              self.get_info('default'))
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2897
        deprecated_pairs = []
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
2898
        experimental_pairs = []
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2899
        for key, help in help_pairs:
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2900
            info = self.get_info(key)
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
2901
            if info.hidden:
2902
                continue
2903
            elif info.deprecated:
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2904
                deprecated_pairs.append((key, help))
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
2905
            elif info.experimental:
2906
                experimental_pairs.append((key, help))
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2907
            else:
2908
                output += wrapped(key, help, info)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2909
        output += "\nSee ``bzr help formats`` for more about storage formats."
2910
        other_output = ""
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
2911
        if len(experimental_pairs) > 0:
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2912
            other_output += "Experimental formats are shown below.\n\n"
2939.2.2 by Ian Clatworthy
allow bzrdir formats to be registered as experimental
2913
            for key, help in experimental_pairs:
2914
                info = self.get_info(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2915
                other_output += wrapped(key, help, info)
2916
        else:
2917
            other_output += \
2918
                "No experimental formats are available.\n\n"
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2919
        if len(deprecated_pairs) > 0:
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2920
            other_output += "\nDeprecated formats are shown below.\n\n"
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2921
            for key, help in deprecated_pairs:
2922
                info = self.get_info(key)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2923
                other_output += wrapped(key, help, info)
2924
        else:
2925
            other_output += \
2926
                "\nNo deprecated formats are available.\n\n"
2927
        other_output += \
2928
            "\nSee ``bzr help formats`` for more about storage formats."
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
2929
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
2930
        if topic == 'other-formats':
2931
            return other_output
2932
        else:
2933
            return output
2204.4.1 by Aaron Bentley
Add 'formats' help topic
2934
2935
3242.2.14 by Aaron Bentley
Update from review comments
2936
class RepositoryAcquisitionPolicy(object):
2937
    """Abstract base class for repository acquisition policies.
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
2938
3242.2.14 by Aaron Bentley
Update from review comments
2939
    A repository acquisition policy decides how a BzrDir acquires a repository
2940
    for a branch that is being created.  The most basic policy decision is
2941
    whether to create a new repository or use an existing one.
2942
    """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
2943
    def __init__(self, stack_on, stack_on_pwd, require_stacking):
3242.3.35 by Aaron Bentley
Cleanups and documentation
2944
        """Constructor.
2945
2946
        :param stack_on: A location to stack on
2947
        :param stack_on_pwd: If stack_on is relative, the location it is
2948
            relative to.
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
2949
        :param require_stacking: If True, it is a failure to not stack.
3242.3.35 by Aaron Bentley
Cleanups and documentation
2950
        """
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
2951
        self._stack_on = stack_on
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
2952
        self._stack_on_pwd = stack_on_pwd
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
2953
        self._require_stacking = require_stacking
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
2954
2955
    def configure_branch(self, branch):
3242.2.13 by Aaron Bentley
Update docs
2956
        """Apply any configuration data from this policy to the branch.
2957
3242.3.18 by Aaron Bentley
Clean up repository-policy work
2958
        Default implementation sets repository stacking.
3242.2.13 by Aaron Bentley
Update docs
2959
        """
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
2960
        if self._stack_on is None:
2961
            return
2962
        if self._stack_on_pwd is None:
2963
            stack_on = self._stack_on
2964
        else:
2965
            try:
3242.3.32 by Aaron Bentley
Defer handling relative stacking URLs as late as possible.
2966
                stack_on = urlutils.rebase_url(self._stack_on,
2967
                    self._stack_on_pwd,
2968
                    branch.bzrdir.root_transport.base)
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
2969
            except errors.InvalidRebaseURLs:
2970
                stack_on = self._get_full_stack_on()
3242.3.37 by Aaron Bentley
Updates from reviews
2971
        try:
3537.3.5 by Martin Pool
merge trunk including stacking policy
2972
            branch.set_stacked_on_url(stack_on)
3242.3.37 by Aaron Bentley
Updates from reviews
2973
        except errors.UnstackableBranchFormat:
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
2974
            if self._require_stacking:
2975
                raise
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
2976
2977
    def _get_full_stack_on(self):
3242.3.35 by Aaron Bentley
Cleanups and documentation
2978
        """Get a fully-qualified URL for the stack_on location."""
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
2979
        if self._stack_on is None:
2980
            return None
2981
        if self._stack_on_pwd is None:
2982
            return self._stack_on
2983
        else:
2984
            return urlutils.join(self._stack_on_pwd, self._stack_on)
3242.3.7 by Aaron Bentley
Delegate stacking to configure_branch
2985
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
2986
    def _add_fallback(self, repository, possible_transports=None):
3242.3.35 by Aaron Bentley
Cleanups and documentation
2987
        """Add a fallback to the supplied repository, if stacking is set."""
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
2988
        stack_on = self._get_full_stack_on()
2989
        if stack_on is None:
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
2990
            return
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
2991
        stacked_dir = BzrDir.open(stack_on,
2992
                                  possible_transports=possible_transports)
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
2993
        try:
2994
            stacked_repo = stacked_dir.open_branch().repository
2995
        except errors.NotBranchError:
2996
            stacked_repo = stacked_dir.open_repository()
3242.3.37 by Aaron Bentley
Updates from reviews
2997
        try:
2998
            repository.add_fallback_repository(stacked_repo)
2999
        except errors.UnstackableRepositoryFormat:
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3000
            if self._require_stacking:
3001
                raise
3904.3.1 by Andrew Bennetts
Probable fix for GaryvdM's bug when pushing a stacked qbzr branch to Launchpad.
3002
        else:
3003
            self._require_stacking = True
3242.3.30 by Aaron Bentley
Handle adding fallback repositories in acquire_repository
3004
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
3005
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
3006
        """Acquire a repository for this bzrdir.
3007
3008
        Implementations may create a new repository or use a pre-exising
3009
        repository.
3010
        :param make_working_trees: If creating a repository, set
3011
            make_working_trees to this value (if non-None)
3012
        :param shared: If creating a repository, make it shared if True
3013
        :return: A repository
3014
        """
3015
        raise NotImplemented(RepositoryAcquisitionPolicy.acquire_repository)
3016
3017
3018
class CreateRepository(RepositoryAcquisitionPolicy):
3242.2.13 by Aaron Bentley
Update docs
3019
    """A policy of creating a new repository"""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3020
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3021
    def __init__(self, bzrdir, stack_on=None, stack_on_pwd=None,
3022
                 require_stacking=False):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3023
        """
3024
        Constructor.
3025
        :param bzrdir: The bzrdir to create the repository on.
3026
        :param stack_on: A location to stack on
3027
        :param stack_on_pwd: If stack_on is relative, the location it is
3028
            relative to.
3029
        """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3030
        RepositoryAcquisitionPolicy.__init__(self, stack_on, stack_on_pwd,
3031
                                             require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3032
        self._bzrdir = bzrdir
3033
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
3034
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
3035
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
3242.2.13 by Aaron Bentley
Update docs
3036
3242.2.14 by Aaron Bentley
Update from review comments
3037
        Creates the desired repository in the bzrdir we already have.
3242.2.13 by Aaron Bentley
Update docs
3038
        """
3650.3.9 by Aaron Bentley
Move responsibility for stackable repo format to _get_metadir
3039
        repository = self._bzrdir.create_repository(shared=shared)
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
3040
        self._add_fallback(repository,
3041
                           possible_transports=[self._bzrdir.transport])
3242.2.4 by Aaron Bentley
Only set working tree policty when specified
3042
        if make_working_trees is not None:
3242.3.6 by Aaron Bentley
Work around strange test failure
3043
            repository.set_make_working_trees(make_working_trees)
3242.3.5 by Aaron Bentley
Implement stacking for clone_on_transport
3044
        return repository
3242.2.2 by Aaron Bentley
Merge policy updates from stacked-policy thread
3045
3046
3242.2.14 by Aaron Bentley
Update from review comments
3047
class UseExistingRepository(RepositoryAcquisitionPolicy):
3242.2.13 by Aaron Bentley
Update docs
3048
    """A policy of reusing an existing repository"""
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3049
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3050
    def __init__(self, repository, stack_on=None, stack_on_pwd=None,
3051
                 require_stacking=False):
3242.3.35 by Aaron Bentley
Cleanups and documentation
3052
        """Constructor.
3053
3054
        :param repository: The repository to use.
3055
        :param stack_on: A location to stack on
3056
        :param stack_on_pwd: If stack_on is relative, the location it is
3057
            relative to.
3058
        """
3242.3.40 by Aaron Bentley
Turn failing test into KnownFailure
3059
        RepositoryAcquisitionPolicy.__init__(self, stack_on, stack_on_pwd,
3060
                                             require_stacking)
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3061
        self._repository = repository
3062
3242.2.10 by Aaron Bentley
Rename RepositoryPolicy.apply to acquire_repository
3063
    def acquire_repository(self, make_working_trees=None, shared=False):
3242.2.14 by Aaron Bentley
Update from review comments
3064
        """Implementation of RepositoryAcquisitionPolicy.acquire_repository
3242.2.13 by Aaron Bentley
Update docs
3065
3066
        Returns an existing repository to use
3067
        """
3928.3.2 by John Arbash Meinel
Track down the other cause of us connecting multiple times.
3068
        self._add_fallback(self._repository,
3069
                       possible_transports=[self._repository.bzrdir.transport])
3242.2.1 by Aaron Bentley
Abstract policy decisions into determine_repository_policy
3070
        return self._repository
3071
3072
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3073
# Please register new formats after old formats so that formats
3074
# appear in chronological order and format descriptions can build
3075
# on previous ones.
2204.4.1 by Aaron Bentley
Add 'formats' help topic
3076
format_registry = BzrDirFormatRegistry()
2204.4.7 by Aaron Bentley
restore register_lazy, remove register_factory, other updates
3077
format_registry.register('weave', BzrDirFormat6,
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3078
    '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
3079
    ' support checkouts or shared repositories.',
3080
    deprecated=True)
2241.1.21 by Martin Pool
Change register_metadir to take fully-qualified repository class name.
3081
format_registry.register_metadir('metaweave',
3082
    'bzrlib.repofmt.weaverepo.RepositoryFormat7',
2230.3.30 by Aaron Bentley
Fix whitespace issues
3083
    'Transitional format in 0.8.  Slower than knit.',
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3084
    branch_format='bzrlib.branch.BzrBranchFormat5',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
3085
    tree_format='bzrlib.workingtree.WorkingTreeFormat3',
2204.4.4 by Aaron Bentley
Use BzrDirFormatInfo to distinguish native and deprecated formats
3086
    deprecated=True)
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3087
format_registry.register_metadir('knit',
3088
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3089
    'Format using knits.  Recommended for interoperation with bzr <= 0.14.',
3090
    branch_format='bzrlib.branch.BzrBranchFormat5',
3091
    tree_format='bzrlib.workingtree.WorkingTreeFormat3',
3092
    deprecated=True)
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3093
format_registry.register_metadir('dirstate',
3094
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3095
    help='New in 0.15: Fast local operations. Compatible with bzr 0.8 and '
3096
        'above when accessed over the network.',
3097
    branch_format='bzrlib.branch.BzrBranchFormat5',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
3098
    # this uses bzrlib.workingtree.WorkingTreeFormat4 because importing
3099
    # directly from workingtree_4 triggers a circular import.
3100
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3892.1.1 by Ian Clatworthy
improve help on storage formats
3101
    deprecated=True)
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
3102
format_registry.register_metadir('dirstate-tags',
3103
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
3104
    help='New in 0.15: Fast local operations and improved scaling for '
1551.13.2 by Aaron Bentley
Hide dirstate-with-subtree format
3105
        'network operations. Additionally adds support for tags.'
3106
        ' Incompatible with bzr < 0.15.',
1551.13.1 by Aaron Bentley
Introduce dirstate-tags format
3107
    branch_format='bzrlib.branch.BzrBranchFormat6',
3108
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3892.1.1 by Ian Clatworthy
improve help on storage formats
3109
    deprecated=True)
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
3110
format_registry.register_metadir('rich-root',
3111
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit4',
3112
    help='New in 1.0.  Better handling of tree roots.  Incompatible with'
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3113
        ' bzr < 1.0.',
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
3114
    branch_format='bzrlib.branch.BzrBranchFormat6',
3115
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3892.1.1 by Ian Clatworthy
improve help on storage formats
3116
    deprecated=True)
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3117
format_registry.register_metadir('dirstate-with-subtree',
3118
    'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
3119
    help='New in 0.15: Fast local operations and improved scaling for '
3120
        'network operations. Additionally adds support for versioning nested '
3121
        'bzr branches. Incompatible with bzr < 0.15.',
3122
    branch_format='bzrlib.branch.BzrBranchFormat6',
2255.2.209 by Robert Collins
Remove circular imports in bzrdir format definitions.
3123
    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.
3124
    experimental=True,
3170.4.4 by Adeodato Simó
Keep the hidden flag for subtree formats after review from Aaron.
3125
    hidden=True,
2255.12.1 by Robert Collins
Implement upgrade for working trees.
3126
    )
3010.3.2 by Martin Pool
Rename pack0.92 to pack-0.92
3127
format_registry.register_metadir('pack-0.92',
2592.3.224 by Martin Pool
Rename GraphKnitRepository etc to KnitPackRepository
3128
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack1',
2939.2.1 by Ian Clatworthy
use 'knitpack' naming instead of 'experimental' for pack formats
3129
    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
3130
        'dirstate-tags format repositories. Interoperates with '
3131
        '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)
3132
        'Previously called knitpack-experimental.  '
3133
        'For more information, see '
3134
        'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
2592.3.22 by Robert Collins
Add new experimental repository formats.
3135
    branch_format='bzrlib.branch.BzrBranchFormat6',
3136
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3137
    )
3010.3.2 by Martin Pool
Rename pack0.92 to pack-0.92
3138
format_registry.register_metadir('pack-0.92-subtree',
2592.3.224 by Martin Pool
Rename GraphKnitRepository etc to KnitPackRepository
3139
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack3',
2939.2.1 by Ian Clatworthy
use 'knitpack' naming instead of 'experimental' for pack formats
3140
    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
3141
        'dirstate-with-subtree format repositories. Interoperates with '
3142
        '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)
3143
        'Previously called knitpack-experimental.  '
3144
        'For more information, see '
3145
        'http://doc.bazaar-vcs.org/latest/developers/packrepo.html.',
2592.3.22 by Robert Collins
Add new experimental repository formats.
3146
    branch_format='bzrlib.branch.BzrBranchFormat6',
3147
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3190.1.2 by Aaron Bentley
Undo spurious change
3148
    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.
3149
    experimental=True,
2592.3.22 by Robert Collins
Add new experimental repository formats.
3150
    )
2996.2.11 by Aaron Bentley
Implement rich-root-pack format ( #164639)
3151
format_registry.register_metadir('rich-root-pack',
3152
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack4',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3153
    help='New in 1.0: A variant of pack-0.92 that supports rich-root data '
3154
         '(needed for bzr-svn).',
2996.2.11 by Aaron Bentley
Implement rich-root-pack format ( #164639)
3155
    branch_format='bzrlib.branch.BzrBranchFormat6',
3156
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3157
    )
3575.2.1 by Martin Pool
Rename stacked format to 1.6
3158
format_registry.register_metadir('1.6',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3159
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5',
3892.1.6 by Ian Clatworthy
include feedback from poolie
3160
    help='A format that allows a branch to indicate that there is another '
3161
         '(stacked) repository that should be used to access data that is '
3162
         'not present locally.',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3163
    branch_format='bzrlib.branch.BzrBranchFormat7',
3164
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3165
    )
3606.10.2 by John Arbash Meinel
Name the new format 1.6.1-rich-root, and NEWS for fixing bug #262333
3166
format_registry.register_metadir('1.6.1-rich-root',
3549.1.6 by Martin Pool
Change stacked-subtree to stacked-rich-root
3167
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack5RichRoot',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3168
    help='A variant of 1.6 that supports rich-root data '
3169
         '(needed for bzr-svn).',
3549.1.5 by Martin Pool
Add stable format names for stacked branches
3170
    branch_format='bzrlib.branch.BzrBranchFormat7',
3171
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3172
    )
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3173
format_registry.register_metadir('1.9',
3174
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3892.1.6 by Ian Clatworthy
include feedback from poolie
3175
    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
3176
         'are smaller in size, have smarter caching and provide faster '
3177
         'performance for most operations.',
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3178
    branch_format='bzrlib.branch.BzrBranchFormat7',
3179
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3180
    )
3181
format_registry.register_metadir('1.9-rich-root',
3182
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
3892.1.2 by Ian Clatworthy
split formats topic into multiple topics
3183
    help='A variant of 1.9 that supports rich-root data '
3184
         '(needed for bzr-svn).',
3805.3.1 by John Arbash Meinel
Add repository 1.9 format, and update the documentation.
3185
    branch_format='bzrlib.branch.BzrBranchFormat7',
3186
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3187
    )
3986.2.1 by Ian Clatworthy
rename 1.12-preview formats as development-wt5 formats
3188
format_registry.register_metadir('development-wt5',
3907.2.1 by Ian Clatworthy
WorkingTreeFormat5 supporting content filtering and views
3189
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6',
3190
    help='A working-tree format that supports views and content filtering.',
3191
    branch_format='bzrlib.branch.BzrBranchFormat7',
3995.7.1 by John Arbash Meinel
Fix bug #328135.
3192
    tree_format='bzrlib.workingtree.WorkingTreeFormat5',
3907.2.1 by Ian Clatworthy
WorkingTreeFormat5 supporting content filtering and views
3193
    experimental=True,
3194
    )
3986.2.1 by Ian Clatworthy
rename 1.12-preview formats as development-wt5 formats
3195
format_registry.register_metadir('development-wt5-rich-root',
3907.2.1 by Ian Clatworthy
WorkingTreeFormat5 supporting content filtering and views
3196
    'bzrlib.repofmt.pack_repo.RepositoryFormatKnitPack6RichRoot',
3986.2.1 by Ian Clatworthy
rename 1.12-preview formats as development-wt5 formats
3197
    help='A variant of development-wt5 that supports rich-root data '
3907.2.1 by Ian Clatworthy
WorkingTreeFormat5 supporting content filtering and views
3198
         '(needed for bzr-svn).',
3199
    branch_format='bzrlib.branch.BzrBranchFormat7',
3995.7.1 by John Arbash Meinel
Fix bug #328135.
3200
    tree_format='bzrlib.workingtree.WorkingTreeFormat5',
3907.2.1 by Ian Clatworthy
WorkingTreeFormat5 supporting content filtering and views
3201
    experimental=True,
3202
    )
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3203
# 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
3204
format_registry.register_metadir('development',
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
3205
    'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3206
    help='Current development format. Can convert data to and from pack-0.92 '
3207
        '(and anything compatible with pack-0.92) format repositories. '
3221.11.2 by Robert Collins
Create basic stackable branch facility.
3208
        '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
3209
        'Please read '
3210
        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3211
        'before use.',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
3212
    branch_format='bzrlib.branch.BzrBranchFormat7',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3213
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3214
    experimental=True,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3215
    alias=True,
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3216
    )
3217
format_registry.register_metadir('development-subtree',
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
3218
    'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3219
    help='Current development format, subtree variant. Can convert data to and '
3221.11.7 by Robert Collins
Merge in real stacked repository work.
3220
        'from pack-0.92-subtree (and anything compatible with '
3221
        'pack-0.92-subtree) format repositories. Repositories and branches in '
3222
        '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
3223
        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3224
        'before use.',
3221.11.2 by Robert Collins
Create basic stackable branch facility.
3225
    branch_format='bzrlib.branch.BzrBranchFormat7',
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3226
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3227
    experimental=True,
3152.2.2 by Robert Collins
The bzrdir format registry now accepts an ``alias`` keyword to
3228
    alias=True,
3152.2.1 by Robert Collins
* A new repository format 'development' has been added. This format will
3229
    )
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
3230
# And the development formats above will have aliased one of the following:
3231
format_registry.register_metadir('development2',
3232
    'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2',
3735.1.2 by Robert Collins
Remove 1.5 series dev formats and document development2 a little better.
3233
    help='1.6.1 with B+Tree based index. '
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
3234
        'Please read '
3235
        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3236
        'before use.',
3237
    branch_format='bzrlib.branch.BzrBranchFormat7',
3238
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3239
    hidden=True,
3240
    experimental=True,
3241
    )
3242
format_registry.register_metadir('development2-subtree',
3243
    'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment2Subtree',
3735.1.2 by Robert Collins
Remove 1.5 series dev formats and document development2 a little better.
3244
    help='1.6.1-subtree with B+Tree based index. '
3735.1.1 by Robert Collins
Add development2 formats using BTree indices.
3245
        'Please read '
3246
        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
3247
        'before use.',
3248
    branch_format='bzrlib.branch.BzrBranchFormat7',
3249
    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
3250
    hidden=True,
3251
    experimental=True,
3252
    )
3221.11.2 by Robert Collins
Create basic stackable branch facility.
3253
# The current format that is made on 'bzr init'.
3044.1.3 by Martin Pool
Set the default format to pack-0.92
3254
format_registry.set_default('pack-0.92')