/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
1
# Copyright (C) 2006-2010 Canonical Ltd
2
#
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.
7
#
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.
12
#
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
17
"""Weave-era BzrDir formats."""
18
6379.6.3 by Jelmer Vernooij
Use absolute_import.
19
from __future__ import absolute_import
20
6670.4.1 by Jelmer Vernooij
Update imports.
21
from ...bzr.bzrdir import (
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
22
    BzrDir,
23
    BzrDirFormat,
24
    BzrDirMetaFormat1,
25
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
26
from ...controldir import (
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
27
    ControlDir,
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
28
    Converter,
6734.1.13 by Jelmer Vernooij
Move MustHaveWorkingTree.
29
    MustHaveWorkingTree,
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
30
    format_registry,
31
    )
6734.1.13 by Jelmer Vernooij
Move MustHaveWorkingTree.
32
from ... import (
33
    errors,
34
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
35
from ...lazy_import import lazy_import
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
36
lazy_import(globals(), """
37
import os
38
import warnings
39
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
40
from breezy import (
6734.1.11 by Jelmer Vernooij
Move UnstackableBranchFormat.
41
    branch as _mod_branch,,
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
42
    graph,
43
    lockable_files,
44
    lockdir,
45
    osutils,
46
    revision as _mod_revision,
47
    trace,
48
    ui,
49
    urlutils,
6670.4.1 by Jelmer Vernooij
Update imports.
50
    )
51
from breezy.bzr import (
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
52
    versionedfile,
53
    weave,
54
    xml5,
55
    )
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
56
from breezy.i18n import gettext
6686.2.1 by Jelmer Vernooij
Move breezy.store to breezy.plugins.weave_fmt, its only user.
57
from breezy.plugins.weave_fmt.store.versioned import VersionedFileStore
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
58
from breezy.transactions import WriteTransaction
59
from breezy.transport import (
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
60
    get_transport,
61
    local,
62
    )
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
63
from breezy.plugins.weave_fmt import xml4
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
64
""")
65
66
67
class BzrDirFormatAllInOne(BzrDirFormat):
68
    """Common class for formats before meta-dirs."""
69
70
    fixed_components = True
71
72
    def initialize_on_transport_ex(self, transport, use_existing_dir=False,
7143.15.2 by Jelmer Vernooij
Run autopep8.
73
                                   create_prefix=False, force_new_repo=False, stacked_on=None,
74
                                   stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
75
                                   shared_repo=False):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
76
        """See ControlDir.initialize_on_transport_ex."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
77
        require_stacking = (stacked_on is not None)
78
        # Format 5 cannot stack, but we've been asked to - actually init
79
        # a Meta1Dir
80
        if require_stacking:
81
            format = BzrDirMetaFormat1()
82
            return format.initialize_on_transport_ex(transport,
7143.15.2 by Jelmer Vernooij
Run autopep8.
83
                                                     use_existing_dir=use_existing_dir, create_prefix=create_prefix,
84
                                                     force_new_repo=force_new_repo, stacked_on=stacked_on,
85
                                                     stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
86
                                                     make_working_trees=make_working_trees, shared_repo=shared_repo)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
87
        return BzrDirFormat.initialize_on_transport_ex(self, transport,
7143.15.2 by Jelmer Vernooij
Run autopep8.
88
                                                       use_existing_dir=use_existing_dir, create_prefix=create_prefix,
89
                                                       force_new_repo=force_new_repo, stacked_on=stacked_on,
90
                                                       stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
91
                                                       make_working_trees=make_working_trees, shared_repo=shared_repo)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
92
6213.1.18 by Jelmer Vernooij
Fix some more tests.
93
    @classmethod
94
    def from_string(cls, format_string):
95
        if format_string != cls.get_format_string():
96
            raise AssertionError("unexpected format string %r" % format_string)
6213.1.19 by Jelmer Vernooij
Fix tests.
97
        return cls()
6213.1.18 by Jelmer Vernooij
Fix some more tests.
98
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
99
100
class BzrDirFormat5(BzrDirFormatAllInOne):
101
    """Bzr control format 5.
102
103
    This format is a combined format for working tree, branch and repository.
104
    It has:
105
     - Format 2 working trees [always]
106
     - Format 4 branches [always]
107
     - Format 5 repositories [always]
108
       Unhashed stores in the repository.
109
    """
110
111
    _lock_class = lockable_files.TransportLock
112
5712.4.7 by Jelmer Vernooij
More fixes.
113
    def __eq__(self, other):
6619.3.18 by Jelmer Vernooij
Run 2to3 idioms fixer.
114
        return isinstance(self, type(other))
5712.4.7 by Jelmer Vernooij
More fixes.
115
6213.1.16 by Jelmer Vernooij
Feature support in repository.
116
    @classmethod
117
    def get_format_string(cls):
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
118
        """See BzrDirFormat.get_format_string()."""
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
119
        return b"Bazaar-NG branch, format 5\n"
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
120
121
    def get_branch_format(self):
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
122
        from .branch import BzrBranchFormat4
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
123
        return BzrBranchFormat4()
124
125
    def get_format_description(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
126
        """See ControlDirFormat.get_format_description()."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
127
        return "All-in-one format 5"
128
129
    def get_converter(self, format=None):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
130
        """See ControlDirFormat.get_converter()."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
131
        # there is one and only one upgrade path here.
132
        return ConvertBzrDir5To6()
133
134
    def _initialize_for_clone(self, url):
135
        return self.initialize_on_transport(get_transport(url), _cloning=True)
136
137
    def initialize_on_transport(self, transport, _cloning=False):
138
        """Format 5 dirs always have working tree, branch and repository.
139
140
        Except when they are being cloned.
141
        """
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
142
        from .branch import BzrBranchFormat4
143
        from .repository import RepositoryFormat5
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
144
        result = (super(BzrDirFormat5, self).initialize_on_transport(transport))
145
        RepositoryFormat5().initialize(result, _internal=True)
146
        if not _cloning:
147
            branch = BzrBranchFormat4().initialize(result)
148
            result._init_workingtree()
149
        return result
150
151
    def network_name(self):
152
        return self.get_format_string()
153
154
    def _open(self, transport):
155
        """See BzrDirFormat._open."""
156
        return BzrDir5(transport, self)
157
158
    def __return_repository_format(self):
159
        """Circular import protection."""
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
160
        from .repository import RepositoryFormat5
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
161
        return RepositoryFormat5()
162
    repository_format = property(__return_repository_format)
163
164
165
class BzrDirFormat6(BzrDirFormatAllInOne):
166
    """Bzr control format 6.
167
168
    This format is a combined format for working tree, branch and repository.
169
    It has:
170
     - Format 2 working trees [always]
171
     - Format 4 branches [always]
172
     - Format 6 repositories [always]
173
    """
174
175
    _lock_class = lockable_files.TransportLock
176
5712.4.7 by Jelmer Vernooij
More fixes.
177
    def __eq__(self, other):
6619.3.18 by Jelmer Vernooij
Run 2to3 idioms fixer.
178
        return isinstance(self, type(other))
5712.4.7 by Jelmer Vernooij
More fixes.
179
6213.1.16 by Jelmer Vernooij
Feature support in repository.
180
    @classmethod
181
    def get_format_string(cls):
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
182
        """See BzrDirFormat.get_format_string()."""
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
183
        return b"Bazaar-NG branch, format 6\n"
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
184
185
    def get_format_description(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
186
        """See ControlDirFormat.get_format_description()."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
187
        return "All-in-one format 6"
188
189
    def get_branch_format(self):
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
190
        from .branch import BzrBranchFormat4
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
191
        return BzrBranchFormat4()
192
193
    def get_converter(self, format=None):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
194
        """See ControlDirFormat.get_converter()."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
195
        # there is one and only one upgrade path here.
196
        return ConvertBzrDir6ToMeta()
197
198
    def _initialize_for_clone(self, url):
199
        return self.initialize_on_transport(get_transport(url), _cloning=True)
200
201
    def initialize_on_transport(self, transport, _cloning=False):
202
        """Format 6 dirs always have working tree, branch and repository.
203
204
        Except when they are being cloned.
205
        """
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
206
        from .branch import BzrBranchFormat4
207
        from .repository import RepositoryFormat6
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
208
        result = super(BzrDirFormat6, self).initialize_on_transport(transport)
209
        RepositoryFormat6().initialize(result, _internal=True)
210
        if not _cloning:
211
            branch = BzrBranchFormat4().initialize(result)
212
            result._init_workingtree()
213
        return result
214
215
    def network_name(self):
216
        return self.get_format_string()
217
218
    def _open(self, transport):
219
        """See BzrDirFormat._open."""
220
        return BzrDir6(transport, self)
221
222
    def __return_repository_format(self):
223
        """Circular import protection."""
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
224
        from .repository import RepositoryFormat6
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
225
        return RepositoryFormat6()
226
    repository_format = property(__return_repository_format)
227
228
229
class ConvertBzrDir4To5(Converter):
230
    """Converts format 4 bzr dirs to format 5."""
231
232
    def __init__(self):
233
        super(ConvertBzrDir4To5, self).__init__()
234
        self.converted_revs = set()
235
        self.absent_revisions = set()
236
        self.text_count = 0
237
        self.revisions = {}
238
239
    def convert(self, to_convert, pb):
240
        """See Converter.convert()."""
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
241
        self.controldir = to_convert
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
242
        if pb is not None:
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
243
            warnings.warn(gettext("pb parameter to convert() is deprecated"))
6861.4.1 by Jelmer Vernooij
Make progress bars context managers.
244
        with ui.ui_factory.nested_progress_bar() as self.pb:
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
245
            ui.ui_factory.note(gettext('starting upgrade from format 4 to 5'))
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
246
            if isinstance(self.controldir.transport, local.LocalTransport):
7143.15.2 by Jelmer Vernooij
Run autopep8.
247
                self.controldir.get_workingtree_transport(
248
                    None).delete('stat-cache')
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
249
            self._convert_to_weaves()
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
250
            return ControlDir.open(self.controldir.user_url)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
251
252
    def _convert_to_weaves(self):
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
253
        ui.ui_factory.note(gettext(
7143.15.2 by Jelmer Vernooij
Run autopep8.
254
            'note: upgrade may be faster if all store files are ungzipped first'))
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
255
        try:
256
            # TODO permissions
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
257
            stat = self.controldir.transport.stat('weaves')
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
258
            if not S_ISDIR(stat.st_mode):
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
259
                self.controldir.transport.delete('weaves')
260
                self.controldir.transport.mkdir('weaves')
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
261
        except errors.NoSuchFile:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
262
            self.controldir.transport.mkdir('weaves')
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
263
        # deliberately not a WeaveFile as we want to build it up slowly.
264
        self.inv_weave = weave.Weave('inventory')
265
        # holds in-memory weaves for all files
266
        self.text_weaves = {}
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
267
        self.controldir.transport.delete('branch-format')
268
        self.branch = self.controldir.open_branch()
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
269
        self._convert_working_inv()
6165.4.25 by Jelmer Vernooij
Fix plugin use of revision_history.
270
        rev_history = self.branch._revision_history()
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
271
        # to_read is a stack holding the revisions we still need to process;
272
        # appending to it adds new highest-priority revisions
273
        self.known_revisions = set(rev_history)
274
        self.to_read = rev_history[-1:]
275
        while self.to_read:
276
            rev_id = self.to_read.pop()
7143.15.2 by Jelmer Vernooij
Run autopep8.
277
            if (rev_id not in self.revisions and
278
                    rev_id not in self.absent_revisions):
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
279
                self._load_one_rev(rev_id)
280
        self.pb.clear()
281
        to_import = self._make_order()
282
        for i, rev_id in enumerate(to_import):
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
283
            self.pb.update(gettext('converting revision'), i, len(to_import))
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
284
            self._convert_one_rev(rev_id)
285
        self.pb.clear()
286
        self._write_all_weaves()
287
        self._write_all_revs()
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
288
        ui.ui_factory.note(gettext('upgraded to weaves:'))
6150.3.10 by Jonathan Riddell
do not include space padding in gettext()
289
        ui.ui_factory.note('  ' + gettext('%6d revisions and inventories') %
7143.15.2 by Jelmer Vernooij
Run autopep8.
290
                           len(self.revisions))
6150.3.10 by Jonathan Riddell
do not include space padding in gettext()
291
        ui.ui_factory.note('  ' + gettext('%6d revisions not present') %
7143.15.2 by Jelmer Vernooij
Run autopep8.
292
                           len(self.absent_revisions))
6150.3.10 by Jonathan Riddell
do not include space padding in gettext()
293
        ui.ui_factory.note('  ' + gettext('%6d texts') % self.text_count)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
294
        self._cleanup_spare_files_after_format4()
295
        self.branch._transport.put_bytes(
296
            'branch-format',
297
            BzrDirFormat5().get_format_string(),
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
298
            mode=self.controldir._get_file_mode())
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
299
300
    def _cleanup_spare_files_after_format4(self):
301
        # FIXME working tree upgrade foo.
302
        for n in 'merged-patches', 'pending-merged-patches':
303
            try:
304
                ## assert os.path.getsize(p) == 0
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
305
                self.controldir.transport.delete(n)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
306
            except errors.NoSuchFile:
307
                pass
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
308
        self.controldir.transport.delete_tree('inventory-store')
309
        self.controldir.transport.delete_tree('text-store')
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
310
311
    def _convert_working_inv(self):
312
        inv = xml4.serializer_v4.read_inventory(
7143.15.2 by Jelmer Vernooij
Run autopep8.
313
            self.branch._transport.get('inventory'))
314
        new_inv_xml = xml5.serializer_v5.write_inventory_to_string(
315
            inv, working=True)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
316
        self.branch._transport.put_bytes('inventory', new_inv_xml,
7143.15.2 by Jelmer Vernooij
Run autopep8.
317
                                         mode=self.controldir._get_file_mode())
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
318
319
    def _write_all_weaves(self):
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
320
        controlweaves = VersionedFileStore(self.controldir.transport, prefixed=False,
7143.15.2 by Jelmer Vernooij
Run autopep8.
321
                                           versionedfile_class=weave.WeaveFile)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
322
        weave_transport = self.controldir.transport.clone('weaves')
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
323
        weaves = VersionedFileStore(weave_transport, prefixed=False,
7143.15.2 by Jelmer Vernooij
Run autopep8.
324
                                    versionedfile_class=weave.WeaveFile)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
325
        transaction = WriteTransaction()
326
327
        try:
328
            i = 0
329
            for file_id, file_weave in self.text_weaves.items():
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
330
                self.pb.update(gettext('writing weave'), i,
7143.15.2 by Jelmer Vernooij
Run autopep8.
331
                               len(self.text_weaves))
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
332
                weaves._put_weave(file_id, file_weave, transaction)
333
                i += 1
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
334
            self.pb.update(gettext('inventory'), 0, 1)
7045.4.10 by Jelmer Vernooij
Fix a couple more tests.
335
            controlweaves._put_weave(b'inventory', self.inv_weave, transaction)
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
336
            self.pb.update(gettext('inventory'), 1, 1)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
337
        finally:
338
            self.pb.clear()
339
340
    def _write_all_revs(self):
341
        """Write all revisions out in new form."""
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
342
        self.controldir.transport.delete_tree('revision-store')
343
        self.controldir.transport.mkdir('revision-store')
344
        revision_transport = self.controldir.transport.clone('revision-store')
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
345
        # TODO permissions
6670.4.12 by Jelmer Vernooij
Move inventorytree to breezy.bzr.
346
        from ...bzr.xml5 import serializer_v5
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
347
        from .repository import RevisionTextStore
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
348
        revision_store = RevisionTextStore(revision_transport,
7143.15.2 by Jelmer Vernooij
Run autopep8.
349
                                           serializer_v5, False, versionedfile.PrefixMapper(),
350
                                           lambda: True, lambda: True)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
351
        try:
352
            for i, rev_id in enumerate(self.converted_revs):
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
353
                self.pb.update(gettext('write revision'), i,
7143.15.2 by Jelmer Vernooij
Run autopep8.
354
                               len(self.converted_revs))
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
355
                text = serializer_v5.write_revision_to_string(
356
                    self.revisions[rev_id])
357
                key = (rev_id,)
358
                revision_store.add_lines(key, None, osutils.split_lines(text))
359
        finally:
360
            self.pb.clear()
361
362
    def _load_one_rev(self, rev_id):
363
        """Load a revision object into memory.
364
365
        Any parents not either loaded or abandoned get queued to be
366
        loaded."""
6150.3.11 by Jonathan Riddell
syntax fixes
367
        self.pb.update(gettext('loading revision'),
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
368
                       len(self.revisions),
369
                       len(self.known_revisions))
370
        if not self.branch.repository.has_revision(rev_id):
371
            self.pb.clear()
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
372
            ui.ui_factory.note(gettext('revision {%s} not present in branch; '
7143.15.2 by Jelmer Vernooij
Run autopep8.
373
                                       'will be converted as a ghost') %
374
                               rev_id)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
375
            self.absent_revisions.add(rev_id)
376
        else:
377
            rev = self.branch.repository.get_revision(rev_id)
378
            for parent_id in rev.parent_ids:
379
                self.known_revisions.add(parent_id)
380
                self.to_read.append(parent_id)
381
            self.revisions[rev_id] = rev
382
383
    def _load_old_inventory(self, rev_id):
7356.1.5 by Jelmer Vernooij
Use more ExitStacks.
384
        with self.branch.repository.inventory_store.get(rev_id) as f:
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
385
            old_inv_xml = f.read()
386
        inv = xml4.serializer_v4.read_inventory_from_string(old_inv_xml)
387
        inv.revision_id = rev_id
388
        rev = self.revisions[rev_id]
389
        return inv
390
391
    def _load_updated_inventory(self, rev_id):
392
        inv_xml = self.inv_weave.get_text(rev_id)
393
        inv = xml5.serializer_v5.read_inventory_from_string(inv_xml, rev_id)
394
        return inv
395
396
    def _convert_one_rev(self, rev_id):
397
        """Convert revision and all referenced objects to new format."""
398
        rev = self.revisions[rev_id]
399
        inv = self._load_old_inventory(rev_id)
400
        present_parents = [p for p in rev.parent_ids
401
                           if p not in self.absent_revisions]
402
        self._convert_revision_contents(rev, inv, present_parents)
403
        self._store_new_inv(rev, inv, present_parents)
404
        self.converted_revs.add(rev_id)
405
406
    def _store_new_inv(self, rev, inv, present_parents):
407
        new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv)
408
        new_inv_sha1 = osutils.sha_string(new_inv_xml)
409
        self.inv_weave.add_lines(rev.revision_id,
410
                                 present_parents,
411
                                 new_inv_xml.splitlines(True))
412
        rev.inventory_sha1 = new_inv_sha1
413
414
    def _convert_revision_contents(self, rev, inv, present_parents):
415
        """Convert all the files within a revision.
416
417
        Also upgrade the inventory to refer to the text revision ids."""
418
        rev_id = rev.revision_id
419
        trace.mutter('converting texts of revision {%s}', rev_id)
6631.3.1 by Martin
Run 2to3 map fixer and refactor after
420
        parent_invs = list(map(self._load_updated_inventory, present_parents))
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
421
        entries = inv.iter_entries()
6634.2.1 by Martin
Apply 2to3 next fixer and make compatible
422
        next(entries)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
423
        for path, ie in entries:
424
            self._convert_file_version(rev, ie, parent_invs)
425
426
    def _convert_file_version(self, rev, ie, parent_invs):
427
        """Convert one version of one file.
428
429
        The file needs to be added into the weave if it is a merge
430
        of >=2 parents or if it's changed from its parent.
431
        """
432
        file_id = ie.file_id
433
        rev_id = rev.revision_id
434
        w = self.text_weaves.get(file_id)
435
        if w is None:
436
            w = weave.Weave(file_id)
437
            self.text_weaves[file_id] = w
438
        text_changed = False
439
        parent_candiate_entries = ie.parent_candidates(parent_invs)
6656.1.1 by Martin
Apply 2to3 dict fixer and clean up resulting mess using view helpers
440
        heads = graph.Graph(self).heads(parent_candiate_entries)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
441
        # XXX: Note that this is unordered - and this is tolerable because
442
        # the previous code was also unordered.
7045.4.10 by Jelmer Vernooij
Fix a couple more tests.
443
        previous_entries = {head: parent_candiate_entries[head]
444
                            for head in heads}
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
445
        self.snapshot_ie(previous_entries, ie, w, rev_id)
446
447
    def get_parent_map(self, revision_ids):
448
        """See graph.StackedParentsProvider.get_parent_map"""
449
        return dict((revision_id, self.revisions[revision_id])
450
                    for revision_id in revision_ids
7143.15.2 by Jelmer Vernooij
Run autopep8.
451
                    if revision_id in self.revisions)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
452
453
    def snapshot_ie(self, previous_revisions, ie, w, rev_id):
454
        # TODO: convert this logic, which is ~= snapshot to
455
        # a call to:. This needs the path figured out. rather than a work_tree
456
        # a v4 revision_tree can be given, or something that looks enough like
457
        # one to give the file content to the entry if it needs it.
458
        # and we need something that looks like a weave store for snapshot to
459
        # save against.
460
        #ie.snapshot(rev, PATH, previous_revisions, REVISION_TREE, InMemoryWeaveStore(self.text_weaves))
461
        if len(previous_revisions) == 1:
6656.1.1 by Martin
Apply 2to3 dict fixer and clean up resulting mess using view helpers
462
            previous_ie = next(iter(previous_revisions.values()))
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
463
            if ie._unchanged(previous_ie):
464
                ie.revision = previous_ie.revision
465
                return
466
        if ie.has_text():
7356.1.5 by Jelmer Vernooij
Use more ExitStacks.
467
            with self.branch.repository._text_store.get(ie.text_id) as f:
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
468
                file_lines = f.readlines()
469
            w.add_lines(rev_id, previous_revisions, file_lines)
470
            self.text_count += 1
471
        else:
472
            w.add_lines(rev_id, previous_revisions, [])
473
        ie.revision = rev_id
474
475
    def _make_order(self):
476
        """Return a suitable order for importing revisions.
477
478
        The order must be such that an revision is imported after all
479
        its (present) parents.
480
        """
6656.1.1 by Martin
Apply 2to3 dict fixer and clean up resulting mess using view helpers
481
        todo = set(self.revisions)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
482
        done = self.absent_revisions.copy()
483
        order = []
484
        while todo:
485
            # scan through looking for a revision whose parents
486
            # are all done
487
            for rev_id in sorted(list(todo)):
488
                rev = self.revisions[rev_id]
489
                parent_ids = set(rev.parent_ids)
490
                if parent_ids.issubset(done):
491
                    # can take this one now
492
                    order.append(rev_id)
493
                    todo.remove(rev_id)
494
                    done.add(rev_id)
495
        return order
496
497
498
class ConvertBzrDir5To6(Converter):
499
    """Converts format 5 bzr dirs to format 6."""
500
501
    def convert(self, to_convert, pb):
502
        """See Converter.convert()."""
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
503
        self.controldir = to_convert
6861.4.1 by Jelmer Vernooij
Make progress bars context managers.
504
        with ui.ui_factory.nested_progress_bar() as pb:
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
505
            ui.ui_factory.note(gettext('starting upgrade from format 5 to 6'))
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
506
            self._convert_to_prefixed()
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
507
            return ControlDir.open(self.controldir.user_url)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
508
509
    def _convert_to_prefixed(self):
6686.2.1 by Jelmer Vernooij
Move breezy.store to breezy.plugins.weave_fmt, its only user.
510
        from .store import TransportStore
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
511
        self.controldir.transport.delete('branch-format')
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
512
        for store_name in ["weaves", "revision-store"]:
6150.3.6 by Jonathan Riddell
more gettext()ing
513
            ui.ui_factory.note(gettext("adding prefixes to %s") % store_name)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
514
            store_transport = self.controldir.transport.clone(store_name)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
515
            store = TransportStore(store_transport, prefixed=True)
516
            for urlfilename in store_transport.list_dir('.'):
517
                filename = urlutils.unescape(urlfilename)
7143.15.2 by Jelmer Vernooij
Run autopep8.
518
                if (filename.endswith(".weave")
519
                    or filename.endswith(".gz")
520
                        or filename.endswith(".sig")):
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
521
                    file_id, suffix = os.path.splitext(filename)
522
                else:
523
                    file_id = filename
524
                    suffix = ''
7143.15.2 by Jelmer Vernooij
Run autopep8.
525
                new_name = store._mapper.map(
526
                    (file_id.encode('utf-8'),)) + suffix
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
527
                # FIXME keep track of the dirs made RBC 20060121
528
                try:
529
                    store_transport.move(filename, new_name)
7143.15.2 by Jelmer Vernooij
Run autopep8.
530
                except errors.NoSuchFile:  # catches missing dirs strangely enough
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
531
                    store_transport.mkdir(osutils.dirname(new_name))
532
                    store_transport.move(filename, new_name)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
533
        self.controldir.transport.put_bytes(
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
534
            'branch-format',
535
            BzrDirFormat6().get_format_string(),
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
536
            mode=self.controldir._get_file_mode())
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
537
538
539
class ConvertBzrDir6ToMeta(Converter):
540
    """Converts format 6 bzr dirs to metadirs."""
541
542
    def convert(self, to_convert, pb):
543
        """See Converter.convert()."""
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
544
        from .repository import RepositoryFormat7
6670.4.1 by Jelmer Vernooij
Update imports.
545
        from ...bzr.fullhistory import BzrBranchFormat5
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
546
        self.controldir = to_convert
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
547
        self.pb = ui.ui_factory.nested_progress_bar()
548
        self.count = 0
7143.15.2 by Jelmer Vernooij
Run autopep8.
549
        self.total = 20  # the steps we know about
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
550
        self.garbage_inventories = []
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
551
        self.dir_mode = self.controldir._get_dir_mode()
552
        self.file_mode = self.controldir._get_file_mode()
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
553
7143.15.2 by Jelmer Vernooij
Run autopep8.
554
        ui.ui_factory.note(
555
            gettext('starting upgrade from format 6 to metadir'))
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
556
        self.controldir.transport.put_bytes(
7143.15.2 by Jelmer Vernooij
Run autopep8.
557
            'branch-format',
558
            b"Converting to format 6",
559
            mode=self.file_mode)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
560
        # its faster to move specific files around than to open and use the apis...
561
        # first off, nuke ancestry.weave, it was never used.
562
        try:
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
563
            self.step(gettext('Removing ancestry.weave'))
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
564
            self.controldir.transport.delete('ancestry.weave')
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
565
        except errors.NoSuchFile:
566
            pass
567
        # find out whats there
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
568
        self.step(gettext('Finding branch files'))
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
569
        last_revision = self.controldir.open_branch().last_revision()
570
        bzrcontents = self.controldir.transport.list_dir('.')
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
571
        for name in bzrcontents:
572
            if name.startswith('basis-inventory.'):
573
                self.garbage_inventories.append(name)
574
        # create new directories for repository, working tree and branch
575
        repository_names = [('inventory.weave', True),
576
                            ('revision-store', True),
577
                            ('weaves', True)]
6150.3.10 by Jonathan Riddell
do not include space padding in gettext()
578
        self.step(gettext('Upgrading repository') + '  ')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
579
        self.controldir.transport.mkdir('repository', mode=self.dir_mode)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
580
        self.make_lock('repository')
581
        # we hard code the formats here because we are converting into
582
        # the meta format. The meta format upgrader can take this to a
583
        # future format within each component.
584
        self.put_format('repository', RepositoryFormat7())
585
        for entry in repository_names:
586
            self.move_entry('repository', entry)
587
6150.3.10 by Jonathan Riddell
do not include space padding in gettext()
588
        self.step(gettext('Upgrading branch') + '      ')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
589
        self.controldir.transport.mkdir('branch', mode=self.dir_mode)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
590
        self.make_lock('branch')
591
        self.put_format('branch', BzrBranchFormat5())
592
        branch_files = [('revision-history', True),
593
                        ('branch-name', True),
594
                        ('parent', False)]
595
        for entry in branch_files:
596
            self.move_entry('branch', entry)
597
598
        checkout_files = [('pending-merges', True),
599
                          ('inventory', True),
600
                          ('stat-cache', False)]
601
        # If a mandatory checkout file is not present, the branch does not have
602
        # a functional checkout. Do not create a checkout in the converted
603
        # branch.
604
        for name, mandatory in checkout_files:
605
            if mandatory and name not in bzrcontents:
606
                has_checkout = False
607
                break
608
        else:
609
            has_checkout = True
610
        if not has_checkout:
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
611
            ui.ui_factory.note(gettext('No working tree.'))
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
612
            # If some checkout files are there, we may as well get rid of them.
613
            for name, mandatory in checkout_files:
614
                if name in bzrcontents:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
615
                    self.controldir.transport.delete(name)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
616
        else:
6670.4.1 by Jelmer Vernooij
Update imports.
617
            from ...bzr.workingtree_3 import WorkingTreeFormat3
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
618
            self.step(gettext('Upgrading working tree'))
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
619
            self.controldir.transport.mkdir('checkout', mode=self.dir_mode)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
620
            self.make_lock('checkout')
6926.1.1 by Jelmer Vernooij
Remove delete_multi.
621
            self.put_format('checkout', WorkingTreeFormat3())
622
            for path in self.garbage_inventories:
623
                self.controldir.transport.delete(path)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
624
            for entry in checkout_files:
625
                self.move_entry('checkout', entry)
626
            if last_revision is not None:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
627
                self.controldir.transport.put_bytes(
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
628
                    'checkout/last-revision', last_revision)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
629
        self.controldir.transport.put_bytes(
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
630
            'branch-format',
631
            BzrDirMetaFormat1().get_format_string(),
632
            mode=self.file_mode)
633
        self.pb.finished()
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
634
        return ControlDir.open(self.controldir.user_url)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
635
636
    def make_lock(self, name):
637
        """Make a lock for the new control dir name."""
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
638
        self.step(gettext('Make %s lock') % name)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
639
        ld = lockdir.LockDir(self.controldir.transport,
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
640
                             '%s/lock' % name,
641
                             file_modebits=self.file_mode,
642
                             dir_modebits=self.dir_mode)
643
        ld.create()
644
645
    def move_entry(self, new_dir, entry):
646
        """Move then entry name into new_dir."""
647
        name = entry[0]
648
        mandatory = entry[1]
6150.3.2 by Jonathan Riddell
gettext() on weave plugin
649
        self.step(gettext('Moving %s') % name)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
650
        try:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
651
            self.controldir.transport.move(name, '%s/%s' % (new_dir, name))
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
652
        except errors.NoSuchFile:
653
            if mandatory:
654
                raise
655
656
    def put_format(self, dirname, format):
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
657
        self.controldir.transport.put_bytes('%s/format' % dirname,
7143.15.2 by Jelmer Vernooij
Run autopep8.
658
                                            format.get_format_string(),
659
                                            self.file_mode)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
660
661
662
class BzrDirFormat4(BzrDirFormat):
663
    """Bzr dir format 4.
664
665
    This format is a combined format for working tree, branch and repository.
666
    It has:
667
     - Format 1 working trees [always]
668
     - Format 4 branches [always]
669
     - Format 4 repositories [always]
670
671
    This format is deprecated: it indexes texts using a text it which is
672
    removed in format 5; write support for this format has been removed.
673
    """
674
675
    _lock_class = lockable_files.TransportLock
676
5712.4.7 by Jelmer Vernooij
More fixes.
677
    def __eq__(self, other):
6619.3.18 by Jelmer Vernooij
Run 2to3 idioms fixer.
678
        return isinstance(self, type(other))
5712.4.7 by Jelmer Vernooij
More fixes.
679
6213.1.16 by Jelmer Vernooij
Feature support in repository.
680
    @classmethod
681
    def get_format_string(cls):
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
682
        """See BzrDirFormat.get_format_string()."""
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
683
        return b"Bazaar-NG branch, format 0.0.4\n"
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
684
685
    def get_format_description(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
686
        """See ControlDirFormat.get_format_description()."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
687
        return "All-in-one format 4"
688
689
    def get_converter(self, format=None):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
690
        """See ControlDirFormat.get_converter()."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
691
        # there is one and only one upgrade path here.
692
        return ConvertBzrDir4To5()
693
694
    def initialize_on_transport(self, transport):
695
        """Format 4 branches cannot be created."""
696
        raise errors.UninitializableFormat(self)
697
698
    def is_supported(self):
699
        """Format 4 is not supported.
700
701
        It is not supported because the model changed from 4 to 5 and the
702
        conversion logic is expensive - so doing it on the fly was not
703
        feasible.
704
        """
705
        return False
706
707
    def network_name(self):
708
        return self.get_format_string()
709
710
    def _open(self, transport):
711
        """See BzrDirFormat._open."""
712
        return BzrDir4(transport, self)
713
714
    def __return_repository_format(self):
715
        """Circular import protection."""
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
716
        from .repository import RepositoryFormat4
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
717
        return RepositoryFormat4()
718
    repository_format = property(__return_repository_format)
719
6213.1.19 by Jelmer Vernooij
Fix tests.
720
    @classmethod
721
    def from_string(cls, format_string):
722
        if format_string != cls.get_format_string():
723
            raise AssertionError("unexpected format string %r" % format_string)
724
        return cls()
725
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
726
727
class BzrDirPreSplitOut(BzrDir):
728
    """A common class for the all-in-one formats."""
729
730
    def __init__(self, _transport, _format):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
731
        """See ControlDir.__init__."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
732
        super(BzrDirPreSplitOut, self).__init__(_transport, _format)
733
        self._control_files = lockable_files.LockableFiles(
7143.15.2 by Jelmer Vernooij
Run autopep8.
734
            self.get_branch_transport(None),
735
            self._format._lock_file_name,
736
            self._format._lock_class)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
737
738
    def break_lock(self):
739
        """Pre-splitout bzrdirs do not suffer from stale locks."""
740
        raise NotImplementedError(self.break_lock)
741
742
    def cloning_metadir(self, require_stacking=False):
743
        """Produce a metadir suitable for cloning with."""
744
        if require_stacking:
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
745
            return format_registry.make_controldir('1.6')
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
746
        return self._format.__class__()
747
748
    def clone(self, url, revision_id=None, force_new_repo=False,
749
              preserve_stacking=False):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
750
        """See ControlDir.clone().
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
751
752
        force_new_repo has no effect, since this family of formats always
753
        require a new repository.
754
        preserve_stacking has no effect, since no source branch using this
755
        family of formats can be stacked, so there is no stacking to preserve.
756
        """
757
        self._make_tail(url)
758
        result = self._format._initialize_for_clone(url)
759
        self.open_repository().clone(result, revision_id=revision_id)
760
        from_branch = self.open_branch()
761
        from_branch.clone(result, revision_id=revision_id)
762
        try:
763
            tree = self.open_workingtree()
764
        except errors.NotLocalUrl:
765
            # make a new one, this format always has to have one.
766
            result._init_workingtree()
767
        else:
768
            tree.clone(result)
769
        return result
770
6123.9.12 by Jelmer Vernooij
Add append_revisions_only argument to BranchFormat.initialize.
771
    def create_branch(self, name=None, repository=None,
772
                      append_revisions_only=None):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
773
        """See ControlDir.create_branch."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
774
        if repository is not None:
775
            raise NotImplementedError(
776
                "create_branch(repository=<not None>) on %r" % (self,))
6123.9.12 by Jelmer Vernooij
Add append_revisions_only argument to BranchFormat.initialize.
777
        return self._format.get_branch_format().initialize(self, name=name,
7143.15.2 by Jelmer Vernooij
Run autopep8.
778
                                                           append_revisions_only=append_revisions_only)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
779
780
    def destroy_branch(self, name=None):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
781
        """See ControlDir.destroy_branch."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
782
        raise errors.UnsupportedOperation(self.destroy_branch, self)
783
784
    def create_repository(self, shared=False):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
785
        """See ControlDir.create_repository."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
786
        if shared:
787
            raise errors.IncompatibleFormat('shared repository', self._format)
788
        return self.open_repository()
789
790
    def destroy_repository(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
791
        """See ControlDir.destroy_repository."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
792
        raise errors.UnsupportedOperation(self.destroy_repository, self)
793
794
    def create_workingtree(self, revision_id=None, from_branch=None,
795
                           accelerator_tree=None, hardlink=False):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
796
        """See ControlDir.create_workingtree."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
797
        # The workingtree is sometimes created when the bzrdir is created,
798
        # but not when cloning.
799
800
        # this looks buggy but is not -really-
801
        # because this format creates the workingtree when the bzrdir is
802
        # created
803
        # clone and sprout will have set the revision_id
804
        # and that will have set it for us, its only
805
        # specific uses of create_workingtree in isolation
806
        # that can do wonky stuff here, and that only
807
        # happens for creating checkouts, which cannot be
808
        # done on this format anyway. So - acceptable wart.
809
        if hardlink:
810
            warning("can't support hardlinked working trees in %r"
7143.15.2 by Jelmer Vernooij
Run autopep8.
811
                    % (self,))
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
812
        try:
813
            result = self.open_workingtree(recommend_upgrade=False)
814
        except errors.NoSuchFile:
815
            result = self._init_workingtree()
816
        if revision_id is not None:
817
            if revision_id == _mod_revision.NULL_REVISION:
818
                result.set_parent_ids([])
819
            else:
820
                result.set_parent_ids([revision_id])
821
        return result
822
823
    def _init_workingtree(self):
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
824
        from .workingtree import WorkingTreeFormat2
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
825
        try:
826
            return WorkingTreeFormat2().initialize(self)
827
        except errors.NotLocalUrl:
828
            # Even though we can't access the working tree, we need to
829
            # create its control files.
830
            return WorkingTreeFormat2()._stub_initialize_on_transport(
831
                self.transport, self._control_files._file_mode)
832
833
    def destroy_workingtree(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
834
        """See ControlDir.destroy_workingtree."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
835
        raise errors.UnsupportedOperation(self.destroy_workingtree, self)
836
837
    def destroy_workingtree_metadata(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
838
        """See ControlDir.destroy_workingtree_metadata."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
839
        raise errors.UnsupportedOperation(self.destroy_workingtree_metadata,
840
                                          self)
841
842
    def get_branch_transport(self, branch_format, name=None):
843
        """See BzrDir.get_branch_transport()."""
844
        if name is not None:
845
            raise errors.NoColocatedBranchSupport(self)
846
        if branch_format is None:
847
            return self.transport
848
        try:
849
            branch_format.get_format_string()
850
        except NotImplementedError:
851
            return self.transport
852
        raise errors.IncompatibleFormat(branch_format, self._format)
853
854
    def get_repository_transport(self, repository_format):
855
        """See BzrDir.get_repository_transport()."""
856
        if repository_format is None:
857
            return self.transport
858
        try:
859
            repository_format.get_format_string()
860
        except NotImplementedError:
861
            return self.transport
862
        raise errors.IncompatibleFormat(repository_format, self._format)
863
864
    def get_workingtree_transport(self, workingtree_format):
865
        """See BzrDir.get_workingtree_transport()."""
866
        if workingtree_format is None:
867
            return self.transport
868
        try:
869
            workingtree_format.get_format_string()
870
        except NotImplementedError:
871
            return self.transport
872
        raise errors.IncompatibleFormat(workingtree_format, self._format)
873
6630.1.1 by Jelmer Vernooij
Remove deprecated functionality.
874
    def needs_format_conversion(self, format):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
875
        """See ControlDir.needs_format_conversion()."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
876
        # if the format is not the same as the system default,
877
        # an upgrade is needed.
878
        return not isinstance(self._format, format.__class__)
879
880
    def open_branch(self, name=None, unsupported=False,
6305.3.3 by Jelmer Vernooij
Fix use of possible_transports.
881
                    ignore_fallbacks=False, possible_transports=None):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
882
        """See ControlDir.open_branch."""
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
883
        from .branch import BzrBranchFormat4
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
884
        format = BzrBranchFormat4()
5717.1.10 by Jelmer Vernooij
Fix typo.
885
        format.check_support_status(unsupported)
6305.3.3 by Jelmer Vernooij
Fix use of possible_transports.
886
        return format.open(self, name, _found=True,
7143.15.2 by Jelmer Vernooij
Run autopep8.
887
                           possible_transports=possible_transports)
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
888
889
    def sprout(self, url, revision_id=None, force_new_repo=False,
890
               possible_transports=None, accelerator_tree=None,
891
               hardlink=False, stacked=False, create_tree_if_local=True,
892
               source_branch=None):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
893
        """See ControlDir.sprout()."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
894
        if source_branch is not None:
895
            my_branch = self.open_branch()
896
            if source_branch.base != my_branch.base:
897
                raise AssertionError(
898
                    "source branch %r is not within %r with branch %r" %
899
                    (source_branch, self, my_branch))
900
        if stacked:
6734.1.11 by Jelmer Vernooij
Move UnstackableBranchFormat.
901
            raise _mod_branch.UnstackableBranchFormat(
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
902
                self._format, self.root_transport.base)
903
        if not create_tree_if_local:
6734.1.13 by Jelmer Vernooij
Move MustHaveWorkingTree.
904
            raise MustHaveWorkingTree(
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
905
                self._format, self.root_transport.base)
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
906
        from .workingtree import WorkingTreeFormat2
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
907
        self._make_tail(url)
908
        result = self._format._initialize_for_clone(url)
909
        try:
910
            self.open_repository().clone(result, revision_id=revision_id)
911
        except errors.NoRepositoryPresent:
912
            pass
913
        try:
914
            self.open_branch().sprout(result, revision_id=revision_id)
915
        except errors.NotBranchError:
916
            pass
917
918
        # we always want a working tree
919
        WorkingTreeFormat2().initialize(result,
920
                                        accelerator_tree=accelerator_tree,
921
                                        hardlink=hardlink)
922
        return result
923
6437.7.1 by Jelmer Vernooij
Add ControlDir.set_branch_reference.
924
    def set_branch_reference(self, target_branch, name=None):
6670.4.1 by Jelmer Vernooij
Update imports.
925
        from ...bzr.branch import BranchReferenceFormat
6437.7.4 by Jelmer Vernooij
Fix test.
926
        if name is not None:
927
            raise errors.NoColocatedBranchSupport(self)
6437.7.1 by Jelmer Vernooij
Add ControlDir.set_branch_reference.
928
        raise errors.IncompatibleFormat(BranchReferenceFormat, self._format)
929
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
930
931
class BzrDir4(BzrDirPreSplitOut):
932
    """A .bzr version 4 control object.
933
934
    This is a deprecated format and may be removed after sept 2006.
935
    """
936
937
    def create_repository(self, shared=False):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
938
        """See ControlDir.create_repository."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
939
        return self._format.repository_format.initialize(self, shared)
940
6630.1.1 by Jelmer Vernooij
Remove deprecated functionality.
941
    def needs_format_conversion(self, format):
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
942
        """Format 4 dirs are always in need of conversion."""
943
        return True
944
945
    def open_repository(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
946
        """See ControlDir.open_repository."""
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
947
        from .repository import RepositoryFormat4
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
948
        return RepositoryFormat4().open(self, _found=True)
949
950
951
class BzrDir5(BzrDirPreSplitOut):
952
    """A .bzr version 5 control object.
953
954
    This is a deprecated format and may be removed after sept 2006.
955
    """
956
957
    def has_workingtree(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
958
        """See ControlDir.has_workingtree."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
959
        return True
7143.15.2 by Jelmer Vernooij
Run autopep8.
960
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
961
    def open_repository(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
962
        """See ControlDir.open_repository."""
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
963
        from .repository import RepositoryFormat5
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
964
        return RepositoryFormat5().open(self, _found=True)
965
6402.1.2 by Jelmer Vernooij
Fix tests.
966
    def open_workingtree(self, unsupported=False,
7143.15.2 by Jelmer Vernooij
Run autopep8.
967
                         recommend_upgrade=True):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
968
        """See ControlDir.create_workingtree."""
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
969
        from .workingtree import WorkingTreeFormat2
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
970
        wt_format = WorkingTreeFormat2()
971
        # we don't warn here about upgrades; that ought to be handled for the
972
        # bzrdir as a whole
973
        return wt_format.open(self, _found=True)
974
975
976
class BzrDir6(BzrDirPreSplitOut):
977
    """A .bzr version 6 control object.
978
979
    This is a deprecated format and may be removed after sept 2006.
980
    """
981
982
    def has_workingtree(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
983
        """See ControlDir.has_workingtree."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
984
        return True
985
986
    def open_repository(self):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
987
        """See ControlDir.open_repository."""
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
988
        from .repository import RepositoryFormat6
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
989
        return RepositoryFormat6().open(self, _found=True)
990
6402.1.2 by Jelmer Vernooij
Fix tests.
991
    def open_workingtree(self, unsupported=False, recommend_upgrade=True):
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
992
        """See ControlDir.create_workingtree."""
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
993
        # we don't warn here about upgrades; that ought to be handled for the
994
        # bzrdir as a whole
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
995
        from .workingtree import WorkingTreeFormat2
5712.4.1 by Jelmer Vernooij
Move weave-era BzrDir directories to a separate file.
996
        return WorkingTreeFormat2().open(self, _found=True)