/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
1
# Copyright (C) 2005, 2006, 2007 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
2592.3.24 by Robert Collins
Knit1 disk layout specified.
17
from bzrlib.lazy_import import lazy_import
18
lazy_import(globals(), """
19
from bzrlib import (
2592.3.112 by Robert Collins
Various fixups found dogfooding.
20
    debug,
2857.2.1 by Robert Collins
(robertc) Knit repo format tidyups from the packs branch. (Robert Collins)
21
    )
2592.3.26 by Robert Collins
Start of proper bunch-of-index based repository logic. Can branch bzr.dev with it... if you are patient.
22
from bzrlib.store import revision
2857.2.1 by Robert Collins
(robertc) Knit repo format tidyups from the packs branch. (Robert Collins)
23
from bzrlib.store.revision.knit import KnitRevisionStore
2592.3.24 by Robert Collins
Knit1 disk layout specified.
24
""")
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
25
from bzrlib import (
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
26
    bzrdir,
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
27
    errors,
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
28
    knit,
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
29
    lockable_files,
30
    lockdir,
2249.5.16 by John Arbash Meinel
[merge] bzr.dev 2283
31
    osutils,
3099.3.3 by John Arbash Meinel
Deprecate get_parents() in favor of get_parent_map()
32
    symbol_versioning,
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
33
    transactions,
2241.1.8 by Martin Pool
Set the repository's serializer in the places it's needed, not in the base class
34
    xml5,
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
35
    xml6,
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
36
    xml7,
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
37
    )
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
38
from bzrlib.decorators import needs_read_lock, needs_write_lock
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.
39
from bzrlib.knit import KnitVersionedFiles, _KndxIndex, _KnitKeyAccess
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
40
from bzrlib.repository import (
2889.1.1 by Robert Collins
* The class ``bzrlib.repofmt.knitrepo.KnitRepository3`` has been folded into
41
    CommitBuilder,
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
42
    MetaDirRepository,
43
    MetaDirRepositoryFormat,
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
44
    RepositoryFormat,
45
    RootCommitBuilder,
46
    )
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
47
import bzrlib.revision as _mod_revision
48
from bzrlib.store.versioned import VersionedFileStore
2857.2.1 by Robert Collins
(robertc) Knit repo format tidyups from the packs branch. (Robert Collins)
49
from bzrlib.trace import mutter, mutter_callsite
2535.3.53 by Andrew Bennetts
Remove get_stream_as_bytes from KnitVersionedFile's API, make it a function in knitrepo.py instead.
50
from bzrlib.util import bencode
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.
51
from bzrlib.versionedfile import ConstantMapper, HashEscapedPrefixMapper
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
52
53
2490.2.13 by Aaron Bentley
Update distinct -> lowest, refactor, add ParentsProvider concept
54
class _KnitParentsProvider(object):
55
56
    def __init__(self, knit):
57
        self._knit = knit
58
2490.2.28 by Aaron Bentley
Fix handling of null revision
59
    def __repr__(self):
60
        return 'KnitParentsProvider(%r)' % self._knit
61
3099.3.3 by John Arbash Meinel
Deprecate get_parents() in favor of get_parent_map()
62
    @symbol_versioning.deprecated_method(symbol_versioning.one_one)
2490.2.13 by Aaron Bentley
Update distinct -> lowest, refactor, add ParentsProvider concept
63
    def get_parents(self, revision_ids):
3099.3.1 by John Arbash Meinel
Implement get_parent_map for ParentProviders
64
        """See graph._StackedParentsProvider.get_parents"""
65
        parent_map = self.get_parent_map(revision_ids)
66
        return [parent_map.get(r, None) for r in revision_ids]
67
68
    def get_parent_map(self, keys):
69
        """See graph._StackedParentsProvider.get_parent_map"""
70
        parent_map = {}
71
        for revision_id in keys:
3373.5.2 by John Arbash Meinel
Add repository_implementation tests for get_parent_map
72
            if revision_id is None:
73
                raise ValueError('get_parent_map(None) is not valid')
2490.2.13 by Aaron Bentley
Update distinct -> lowest, refactor, add ParentsProvider concept
74
            if revision_id == _mod_revision.NULL_REVISION:
3146.1.2 by Aaron Bentley
ParentsProviders now provide tuples of parents, never lists
75
                parent_map[revision_id] = ()
2490.2.13 by Aaron Bentley
Update distinct -> lowest, refactor, add ParentsProvider concept
76
            else:
77
                try:
3146.1.2 by Aaron Bentley
ParentsProviders now provide tuples of parents, never lists
78
                    parents = tuple(
79
                        self._knit.get_parents_with_ghosts(revision_id))
2490.2.13 by Aaron Bentley
Update distinct -> lowest, refactor, add ParentsProvider concept
80
                except errors.RevisionNotPresent:
3146.1.1 by Aaron Bentley
Fix bad ghost handling in KnitParentsProvider
81
                    continue
2490.2.13 by Aaron Bentley
Update distinct -> lowest, refactor, add ParentsProvider concept
82
                else:
83
                    if len(parents) == 0:
3146.1.2 by Aaron Bentley
ParentsProviders now provide tuples of parents, never lists
84
                        parents = (_mod_revision.NULL_REVISION,)
3099.3.1 by John Arbash Meinel
Implement get_parent_map for ParentProviders
85
                parent_map[revision_id] = parents
86
        return parent_map
2490.2.13 by Aaron Bentley
Update distinct -> lowest, refactor, add ParentsProvider concept
87
88
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.
89
class _KnitsParentsProvider(object):
90
91
    def __init__(self, knit, prefix=()):
92
        """Create a parent provider for string keys mapped to tuple keys."""
93
        self._knit = knit
94
        self._prefix = prefix
95
96
    def __repr__(self):
97
        return 'KnitsParentsProvider(%r)' % self._knit
98
99
    def get_parent_map(self, keys):
100
        """See graph._StackedParentsProvider.get_parent_map"""
101
        parent_map = self._knit.get_parent_map(
102
            [self._prefix + (key,) for key in keys])
103
        result = {}
104
        for key, parents in parent_map.items():
105
            revid = key[-1]
106
            if len(parents) == 0:
107
                parents = (_mod_revision.NULL_REVISION,)
108
            else:
109
                parents = tuple(parent[-1] for parent in parents)
110
            result[revid] = parents
111
        for revision_id in keys:
112
            if revision_id == _mod_revision.NULL_REVISION:
113
                result[revision_id] = ()
114
        return result
115
116
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
117
class KnitRepository(MetaDirRepository):
118
    """Knit format repository."""
119
2889.1.2 by Robert Collins
Review feedback.
120
    # These attributes are inherited from the Repository base class. Setting
121
    # them to None ensures that if the constructor is changed to not initialize
122
    # them, or a subclass fails to call the constructor, that an error will
123
    # occur rather than the system working but generating incorrect data.
2889.1.1 by Robert Collins
* The class ``bzrlib.repofmt.knitrepo.KnitRepository3`` has been folded into
124
    _commit_builder_class = None
125
    _serializer = None
126
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.
127
    def __init__(self, _format, a_bzrdir, control_files, _commit_builder_class,
128
        _serializer):
129
        MetaDirRepository.__init__(self, _format, a_bzrdir, control_files)
2889.1.1 by Robert Collins
* The class ``bzrlib.repofmt.knitrepo.KnitRepository3`` has been folded into
130
        self._commit_builder_class = _commit_builder_class
131
        self._serializer = _serializer
2745.6.16 by Aaron Bentley
Update from review
132
        self._reconcile_fixes_text_parents = True
2241.1.8 by Martin Pool
Set the repository's serializer in the places it's needed, not in the base class
133
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
134
    def _warn_if_deprecated(self):
135
        # This class isn't deprecated
136
        pass
137
138
    @needs_read_lock
139
    def _all_revision_ids(self):
140
        """See Repository.all_revision_ids()."""
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.
141
        return [key[0] for key in self.revisions.keys()]
142
143
    def _activate_new_inventory(self):
144
        """Put a replacement inventory.new into use as inventories."""
145
        # Copy the content across
146
        t = self._transport
147
        t.copy('inventory.new.kndx', 'inventory.kndx')
148
        try:
149
            t.copy('inventory.new.knit', 'inventory.knit')
150
        except errors.NoSuchFile:
151
            # empty inventories knit
152
            t.delete('inventory.knit')
153
        # delete the temp inventory
154
        t.delete('inventory.new.kndx')
155
        try:
156
            t.delete('inventory.new.knit')
157
        except errors.NoSuchFile:
158
            # empty inventories knit
159
            pass
160
        # Force index reload (sanity check)
161
        self.inventories._index._reset_cache()
162
        self.inventories.keys()
163
164
    def _backup_inventory(self):
165
        t = self._transport
166
        t.copy('inventory.kndx', 'inventory.backup.kndx')
167
        t.copy('inventory.knit', 'inventory.backup.knit')
168
169
    def _move_file_id(self, from_id, to_id):
170
        t = self._transport.clone('knits')
171
        from_rel_url = self.texts._index._mapper.map((from_id, None))
172
        to_rel_url = self.texts._index._mapper.map((to_id, None))
173
        # We expect both files to always exist in this case.
174
        for suffix in ('.knit', '.kndx'):
175
            t.rename(from_rel_url + suffix, to_rel_url + suffix)
176
177
    def _remove_file_id(self, file_id):
178
        t = self._transport.clone('knits')
179
        rel_url = self.texts._index._mapper.map((file_id, None))
180
        for suffix in ('.kndx', '.knit'):
181
            try:
182
                t.delete(rel_url + suffix)
183
            except errors.NoSuchFile:
184
                pass
185
186
    def _temp_inventories(self):
187
        result = self._format._get_inventories(self._transport, self,
188
            'inventory.new')
189
        # Reconciling when the output has no revisions would result in no
190
        # writes - but we want to ensure there is an inventory for
191
        # compatibility with older clients that don't lazy-load.
192
        result.get_parent_map([('A',)])
193
        return result
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
194
195
    def fileid_involved_between_revs(self, from_revid, to_revid):
196
        """Find file_id(s) which are involved in the changes between revisions.
197
198
        This determines the set of revisions which are involved, and then
199
        finds all file ids affected by those revisions.
200
        """
201
        vf = self._get_revision_vf()
202
        from_set = set(vf.get_ancestry(from_revid))
203
        to_set = set(vf.get_ancestry(to_revid))
204
        changed = to_set.difference(from_set)
205
        return self._fileid_involved_by_set(changed)
206
207
    def fileid_involved(self, last_revid=None):
208
        """Find all file_ids modified in the ancestry of last_revid.
209
210
        :param last_revid: If None, last_revision() will be used.
211
        """
212
        if not last_revid:
213
            changed = set(self.all_revision_ids())
214
        else:
215
            changed = set(self.get_ancestry(last_revid))
216
        if None in changed:
217
            changed.remove(None)
218
        return self._fileid_involved_by_set(changed)
219
220
    @needs_read_lock
221
    def get_revision(self, revision_id):
222
        """Return the Revision object for a named revision"""
2249.5.16 by John Arbash Meinel
[merge] bzr.dev 2283
223
        revision_id = osutils.safe_revision_id(revision_id)
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
224
        return self.get_revision_reconcile(revision_id)
225
226
    @needs_write_lock
227
    def reconcile(self, other=None, thorough=False):
228
        """Reconcile this repository."""
229
        from bzrlib.reconcile import KnitReconciler
230
        reconciler = KnitReconciler(self, thorough=thorough)
231
        reconciler.reconcile()
232
        return reconciler
233
    
2490.2.13 by Aaron Bentley
Update distinct -> lowest, refactor, add ParentsProvider concept
234
    def _make_parents_provider(self):
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.
235
        return _KnitsParentsProvider(self.revisions)
2490.2.13 by Aaron Bentley
Update distinct -> lowest, refactor, add ParentsProvider concept
236
2819.2.1 by Andrew Bennetts
Implement KnitRepository._find_inconsistent_revision_parents.
237
    def _find_inconsistent_revision_parents(self):
238
        """Find revisions with different parent lists in the revision object
239
        and in the index graph.
2819.2.2 by Andrew Bennetts
Implement _check_for_inconsistent_revision_parents.
240
241
        :returns: an iterator yielding tuples of (revison-id, parents-in-index,
242
            parents-in-revision).
2819.2.1 by Andrew Bennetts
Implement KnitRepository._find_inconsistent_revision_parents.
243
        """
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
244
        if not self.is_locked():
245
            raise AssertionError()
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.
246
        vf = self.revisions
247
        for index_version in vf.keys():
248
            parent_map = vf.get_parent_map([index_version])
249
            parents_according_to_index = tuple(parent[-1] for parent in
250
                parent_map[index_version])
251
            revision = self.get_revision(index_version[-1])
2592.3.214 by Robert Collins
Merge bzr.dev.
252
            parents_according_to_revision = tuple(revision.parent_ids)
2819.2.1 by Andrew Bennetts
Implement KnitRepository._find_inconsistent_revision_parents.
253
            if parents_according_to_index != parents_according_to_revision:
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.
254
                yield (index_version[-1], parents_according_to_index,
2819.2.1 by Andrew Bennetts
Implement KnitRepository._find_inconsistent_revision_parents.
255
                    parents_according_to_revision)
256
2819.2.2 by Andrew Bennetts
Implement _check_for_inconsistent_revision_parents.
257
    def _check_for_inconsistent_revision_parents(self):
258
        inconsistencies = list(self._find_inconsistent_revision_parents())
259
        if inconsistencies:
260
            raise errors.BzrCheckError(
261
                "Revision knit has inconsistent parents.")
262
2819.2.4 by Andrew Bennetts
Add a 'revision_graph_can_have_wrong_parents' method to repository.
263
    def revision_graph_can_have_wrong_parents(self):
264
        # The revision.kndx could potentially claim a revision has a different
265
        # parent to the revision text.
266
        return True
267
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
268
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
269
class RepositoryFormatKnit(MetaDirRepositoryFormat):
270
    """Bzr repository knit format (generalized). 
271
272
    This repository format has:
273
     - knits for file texts and inventory
274
     - hash subdirectory based stores.
275
     - knits for revisions and signatures
276
     - TextStores for revisions and signatures.
277
     - a format marker of its own
278
     - an optional 'shared-storage' flag
279
     - an optional 'no-working-trees' flag
280
     - a LockDir lock
281
    """
282
2857.2.2 by Robert Collins
Review feedback.
283
    # Set this attribute in derived classes to control the repository class
284
    # created by open and initialize.
285
    repository_class = None
2889.1.1 by Robert Collins
* The class ``bzrlib.repofmt.knitrepo.KnitRepository3`` has been folded into
286
    # Set this attribute in derived classes to control the
287
    # _commit_builder_class that the repository objects will have passed to
288
    # their constructor.
289
    _commit_builder_class = None
290
    # Set this attribute in derived clases to control the _serializer that the
291
    # repository objects will have passed to their constructor.
292
    _serializer = xml5.serializer_v5
2949.1.2 by Robert Collins
* Fetch with pack repositories will no longer read the entire history graph.
293
    # Knit based repositories handle ghosts reasonably well.
294
    supports_ghosts = True
3221.3.1 by Robert Collins
* Repository formats have a new supported-feature attribute
295
    # External lookups are not supported in this format.
296
    supports_external_lookups = False
2857.2.2 by Robert Collins
Review feedback.
297
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.
298
    def _get_inventories(self, repo_transport, repo, name='inventory'):
299
        mapper = ConstantMapper(name)
300
        index = _KndxIndex(repo_transport, mapper, repo.get_transaction,
301
            repo.is_write_locked, repo.is_locked)
302
        access = _KnitKeyAccess(repo_transport, mapper)
303
        return KnitVersionedFiles(index, access, annotated=False)
304
305
    def _get_revisions(self, repo_transport, repo):
306
        mapper = ConstantMapper('revisions')
307
        index = _KndxIndex(repo_transport, mapper, repo.get_transaction,
308
            repo.is_write_locked, repo.is_locked)
309
        access = _KnitKeyAccess(repo_transport, mapper)
310
        return KnitVersionedFiles(index, access, max_delta_chain=0,
311
            annotated=False)
312
313
    def _get_signatures(self, repo_transport, repo):
314
        mapper = ConstantMapper('signatures')
315
        index = _KndxIndex(repo_transport, mapper, repo.get_transaction,
316
            repo.is_write_locked, repo.is_locked)
317
        access = _KnitKeyAccess(repo_transport, mapper)
318
        return KnitVersionedFiles(index, access, max_delta_chain=0,
319
            annotated=False)
320
321
    def _get_texts(self, repo_transport, repo):
322
        mapper = HashEscapedPrefixMapper()
323
        base_transport = repo_transport.clone('knits')
324
        index = _KndxIndex(base_transport, mapper, repo.get_transaction,
325
            repo.is_write_locked, repo.is_locked)
326
        access = _KnitKeyAccess(base_transport, mapper)
327
        return KnitVersionedFiles(index, access, max_delta_chain=200,
328
            annotated=True)
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
329
330
    def initialize(self, a_bzrdir, shared=False):
331
        """Create a knit format 1 repository.
332
333
        :param a_bzrdir: bzrdir to contain the new repository; must already
334
            be initialized.
335
        :param shared: If true the repository will be initialized as a shared
336
                       repository.
337
        """
338
        mutter('creating repository in %s.', a_bzrdir.transport.base)
2592.3.60 by Robert Collins
Nuke per-fileid indices for a single unified index.
339
        dirs = ['knits']
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
340
        files = []
341
        utf8_files = [('format', self.get_format_string())]
342
        
343
        self._upload_blank_content(a_bzrdir, dirs, files, utf8_files, shared)
344
        repo_transport = a_bzrdir.get_repository_transport(None)
345
        control_files = lockable_files.LockableFiles(repo_transport,
346
                                'lock', lockdir.LockDir)
347
        transaction = transactions.WriteTransaction()
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.
348
        result = self.open(a_bzrdir=a_bzrdir, _found=True)
349
        result.lock_write()
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
350
        # the revision id here is irrelevant: it will not be stored, and cannot
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.
351
        # already exist, we do this to create files on disk for older clients.
352
        result.inventories.get_parent_map([('A',)])
353
        result.revisions.get_parent_map([('A',)])
354
        result.signatures.get_parent_map([('A',)])
355
        result.unlock()
356
        return result
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
357
358
    def open(self, a_bzrdir, _found=False, _override_transport=None):
359
        """See RepositoryFormat.open().
360
        
361
        :param _override_transport: INTERNAL USE ONLY. Allows opening the
362
                                    repository at a slightly different url
363
                                    than normal. I.e. during 'upgrade'.
364
        """
365
        if not _found:
366
            format = RepositoryFormat.find_format(a_bzrdir)
367
        if _override_transport is not None:
368
            repo_transport = _override_transport
369
        else:
370
            repo_transport = a_bzrdir.get_repository_transport(None)
371
        control_files = lockable_files.LockableFiles(repo_transport,
372
                                'lock', lockdir.LockDir)
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.
373
        repo = self.repository_class(_format=self,
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
374
                              a_bzrdir=a_bzrdir,
375
                              control_files=control_files,
2889.1.1 by Robert Collins
* The class ``bzrlib.repofmt.knitrepo.KnitRepository3`` has been folded into
376
                              _commit_builder_class=self._commit_builder_class,
377
                              _serializer=self._serializer)
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.
378
        repo.revisions = self._get_revisions(repo_transport, repo)
379
        repo.signatures = self._get_signatures(repo_transport, repo)
380
        repo.inventories = self._get_inventories(repo_transport, repo)
381
        repo.texts = self._get_texts(repo_transport, repo)
382
        repo._transport = repo_transport
383
        return repo
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
384
385
386
class RepositoryFormatKnit1(RepositoryFormatKnit):
387
    """Bzr repository knit format 1.
388
389
    This repository format has:
390
     - knits for file texts and inventory
391
     - hash subdirectory based stores.
392
     - knits for revisions and signatures
393
     - TextStores for revisions and signatures.
394
     - a format marker of its own
395
     - an optional 'shared-storage' flag
396
     - an optional 'no-working-trees' flag
397
     - a LockDir lock
398
399
    This format was introduced in bzr 0.8.
400
    """
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
401
2592.3.22 by Robert Collins
Add new experimental repository formats.
402
    repository_class = KnitRepository
2889.1.1 by Robert Collins
* The class ``bzrlib.repofmt.knitrepo.KnitRepository3`` has been folded into
403
    _commit_builder_class = CommitBuilder
404
    _serializer = xml5.serializer_v5
2592.3.22 by Robert Collins
Add new experimental repository formats.
405
2100.3.35 by Aaron Bentley
equality operations on bzrdir
406
    def __ne__(self, other):
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
407
        return self.__class__ is not other.__class__
408
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
409
    def get_format_string(self):
410
        """See RepositoryFormat.get_format_string()."""
411
        return "Bazaar-NG Knit Repository Format 1"
412
413
    def get_format_description(self):
414
        """See RepositoryFormat.get_format_description()."""
415
        return "Knit repository format 1"
416
417
    def check_conversion_target(self, target_format):
418
        pass
419
420
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
421
class RepositoryFormatKnit3(RepositoryFormatKnit):
2996.2.5 by Aaron Bentley
Correct docstring
422
    """Bzr repository knit format 3.
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
423
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
424
    This repository format has:
425
     - knits for file texts and inventory
426
     - hash subdirectory based stores.
427
     - knits for revisions and signatures
428
     - TextStores for revisions and signatures.
429
     - a format marker of its own
430
     - an optional 'shared-storage' flag
431
     - an optional 'no-working-trees' flag
432
     - a LockDir lock
433
     - support for recording full info about the tree root
434
     - support for recording tree-references
435
    """
436
2889.1.1 by Robert Collins
* The class ``bzrlib.repofmt.knitrepo.KnitRepository3`` has been folded into
437
    repository_class = KnitRepository
438
    _commit_builder_class = RootCommitBuilder
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
439
    rich_root_data = True
2323.5.16 by Martin Pool
rename support_tree_reference to supports_
440
    supports_tree_reference = True
2889.1.1 by Robert Collins
* The class ``bzrlib.repofmt.knitrepo.KnitRepository3`` has been folded into
441
    _serializer = xml7.serializer_v7
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
442
443
    def _get_matching_bzrdir(self):
2255.2.194 by Robert Collins
[BROKEN] Many updates to stop using experimental formats in tests.
444
        return bzrdir.format_registry.make_bzrdir('dirstate-with-subtree')
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
445
446
    def _ignore_setting_bzrdir(self, format):
447
        pass
448
449
    _matchingbzrdir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)
450
451
    def check_conversion_target(self, target_format):
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
452
        if not target_format.rich_root_data:
453
            raise errors.BadConversionTarget(
454
                'Does not support rich root data.', target_format)
2323.5.16 by Martin Pool
rename support_tree_reference to supports_
455
        if not getattr(target_format, 'supports_tree_reference', False):
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
456
            raise errors.BadConversionTarget(
457
                'Does not support nested trees', target_format)
458
            
459
    def get_format_string(self):
460
        """See RepositoryFormat.get_format_string()."""
2255.2.230 by Robert Collins
Update tree format signatures to mention introducing bzr version.
461
        return "Bazaar Knit Repository Format 3 (bzr 0.15)\n"
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
462
463
    def get_format_description(self):
464
        """See RepositoryFormat.get_format_description()."""
465
        return "Knit repository format 3"
466
2535.3.53 by Andrew Bennetts
Remove get_stream_as_bytes from KnitVersionedFile's API, make it a function in knitrepo.py instead.
467
2996.2.1 by Aaron Bentley
Add KnitRepositoryFormat4
468
class RepositoryFormatKnit4(RepositoryFormatKnit):
469
    """Bzr repository knit format 4.
470
471
    This repository format has everything in format 3, except for
472
    tree-references:
473
     - knits for file texts and inventory
474
     - hash subdirectory based stores.
475
     - knits for revisions and signatures
476
     - TextStores for revisions and signatures.
477
     - a format marker of its own
478
     - an optional 'shared-storage' flag
479
     - an optional 'no-working-trees' flag
480
     - a LockDir lock
481
     - support for recording full info about the tree root
482
    """
483
484
    repository_class = KnitRepository
485
    _commit_builder_class = RootCommitBuilder
486
    rich_root_data = True
487
    supports_tree_reference = False
488
    _serializer = xml6.serializer_v6
489
490
    def _get_matching_bzrdir(self):
491
        return bzrdir.format_registry.make_bzrdir('rich-root')
492
493
    def _ignore_setting_bzrdir(self, format):
494
        pass
495
496
    _matchingbzrdir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)
497
498
    def check_conversion_target(self, target_format):
499
        if not target_format.rich_root_data:
500
            raise errors.BadConversionTarget(
501
                'Does not support rich root data.', target_format)
502
503
    def get_format_string(self):
504
        """See RepositoryFormat.get_format_string()."""
505
        return 'Bazaar Knit Repository Format 4 (bzr 1.0)\n'
506
507
    def get_format_description(self):
508
        """See RepositoryFormat.get_format_description()."""
509
        return "Knit repository format 4"