/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
17
from bzrlib import (
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
18
    bzrdir,
2490.2.21 by Aaron Bentley
Rename graph to deprecated_graph
19
    deprecated_graph,
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
20
    errors,
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
21
    knit,
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
22
    lockable_files,
23
    lockdir,
2249.5.16 by John Arbash Meinel
[merge] bzr.dev 2283
24
    osutils,
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
25
    transactions,
2241.1.8 by Martin Pool
Set the repository's serializer in the places it's needed, not in the base class
26
    xml5,
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
27
    xml7,
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
28
    )
29
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
30
from bzrlib.decorators import needs_read_lock, needs_write_lock
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
31
from bzrlib.repository import (
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
32
    MetaDirRepository,
33
    MetaDirRepositoryFormat,
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
34
    RepositoryFormat,
35
    RootCommitBuilder,
36
    )
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
37
import bzrlib.revision as _mod_revision
38
from bzrlib.store.versioned import VersionedFileStore
39
from bzrlib.trace import mutter, note, warning
2670.3.5 by Andrew Bennetts
Remove get_stream_as_bytes from KnitVersionedFile's API, make it a function in knitrepo.py instead.
40
from bzrlib.util import bencode
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
41
42
2490.2.13 by Aaron Bentley
Update distinct -> lowest, refactor, add ParentsProvider concept
43
class _KnitParentsProvider(object):
44
45
    def __init__(self, knit):
46
        self._knit = knit
47
2490.2.28 by Aaron Bentley
Fix handling of null revision
48
    def __repr__(self):
49
        return 'KnitParentsProvider(%r)' % self._knit
50
2490.2.13 by Aaron Bentley
Update distinct -> lowest, refactor, add ParentsProvider concept
51
    def get_parents(self, revision_ids):
52
        parents_list = []
53
        for revision_id in revision_ids:
54
            if revision_id == _mod_revision.NULL_REVISION:
55
                parents = []
56
            else:
57
                try:
58
                    parents = self._knit.get_parents_with_ghosts(revision_id)
59
                except errors.RevisionNotPresent:
60
                    parents = None
61
                else:
62
                    if len(parents) == 0:
63
                        parents = [_mod_revision.NULL_REVISION]
64
            parents_list.append(parents)
65
        return parents_list
66
67
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
68
class KnitRepository(MetaDirRepository):
69
    """Knit format repository."""
70
2241.1.8 by Martin Pool
Set the repository's serializer in the places it's needed, not in the base class
71
    _serializer = xml5.serializer_v5
72
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
73
    def _warn_if_deprecated(self):
74
        # This class isn't deprecated
75
        pass
76
77
    def _inventory_add_lines(self, inv_vf, revid, parents, lines):
78
        inv_vf.add_lines_with_ghosts(revid, parents, lines)
79
80
    @needs_read_lock
81
    def _all_revision_ids(self):
82
        """See Repository.all_revision_ids()."""
83
        # Knits get the revision graph from the index of the revision knit, so
84
        # it's always possible even if they're on an unlistable transport.
85
        return self._revision_store.all_revision_ids(self.get_transaction())
86
87
    def fileid_involved_between_revs(self, from_revid, to_revid):
88
        """Find file_id(s) which are involved in the changes between revisions.
89
90
        This determines the set of revisions which are involved, and then
91
        finds all file ids affected by those revisions.
92
        """
2249.5.16 by John Arbash Meinel
[merge] bzr.dev 2283
93
        from_revid = osutils.safe_revision_id(from_revid)
94
        to_revid = osutils.safe_revision_id(to_revid)
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
95
        vf = self._get_revision_vf()
96
        from_set = set(vf.get_ancestry(from_revid))
97
        to_set = set(vf.get_ancestry(to_revid))
98
        changed = to_set.difference(from_set)
99
        return self._fileid_involved_by_set(changed)
100
101
    def fileid_involved(self, last_revid=None):
102
        """Find all file_ids modified in the ancestry of last_revid.
103
104
        :param last_revid: If None, last_revision() will be used.
105
        """
106
        if not last_revid:
107
            changed = set(self.all_revision_ids())
108
        else:
109
            changed = set(self.get_ancestry(last_revid))
110
        if None in changed:
111
            changed.remove(None)
112
        return self._fileid_involved_by_set(changed)
113
114
    @needs_read_lock
2530.1.1 by Aaron Bentley
Make topological sorting optional for get_ancestry
115
    def get_ancestry(self, revision_id, topo_sorted=True):
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
116
        """Return a list of revision-ids integrated by a revision.
117
        
2490.2.32 by Aaron Bentley
Merge of not-sorting-ancestry branch
118
        This is topologically sorted, unless 'topo_sorted' is specified as
119
        False.
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
120
        """
2598.5.1 by Aaron Bentley
Start eliminating the use of None to indicate null revision
121
        if _mod_revision.is_null(revision_id):
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
122
            return [None]
2249.5.16 by John Arbash Meinel
[merge] bzr.dev 2283
123
        revision_id = osutils.safe_revision_id(revision_id)
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
124
        vf = self._get_revision_vf()
125
        try:
2530.1.1 by Aaron Bentley
Make topological sorting optional for get_ancestry
126
            return [None] + vf.get_ancestry(revision_id, topo_sorted)
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
127
        except errors.RevisionNotPresent:
128
            raise errors.NoSuchRevision(self, revision_id)
129
130
    @needs_read_lock
131
    def get_revision(self, revision_id):
132
        """Return the Revision object for a named revision"""
2249.5.16 by John Arbash Meinel
[merge] bzr.dev 2283
133
        revision_id = osutils.safe_revision_id(revision_id)
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
134
        return self.get_revision_reconcile(revision_id)
135
136
    @needs_read_lock
137
    def get_revision_graph(self, revision_id=None):
138
        """Return a dictionary containing the revision graph.
139
140
        :param revision_id: The revision_id to get a graph from. If None, then
141
        the entire revision graph is returned. This is a deprecated mode of
142
        operation and will be removed in the future.
143
        :return: a dictionary of revision_id->revision_parents_list.
144
        """
145
        # special case NULL_REVISION
146
        if revision_id == _mod_revision.NULL_REVISION:
147
            return {}
2249.5.16 by John Arbash Meinel
[merge] bzr.dev 2283
148
        revision_id = osutils.safe_revision_id(revision_id)
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
149
        a_weave = self._get_revision_vf()
150
        if revision_id is None:
151
            return a_weave.get_graph()
152
        elif revision_id not in a_weave:
153
            raise errors.NoSuchRevision(self, revision_id)
154
        else:
155
            # add what can be reached from revision_id
2652.1.1 by John Arbash Meinel
Avoid set.difference_update(other) because it is slow when other is big.
156
            return a_weave.get_graph([revision_id])
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
157
158
    @needs_read_lock
159
    def get_revision_graph_with_ghosts(self, revision_ids=None):
160
        """Return a graph of the revisions with ghosts marked as applicable.
161
162
        :param revision_ids: an iterable of revisions to graph or None for all.
163
        :return: a Graph object with the graph reachable from revision_ids.
164
        """
2490.2.21 by Aaron Bentley
Rename graph to deprecated_graph
165
        result = deprecated_graph.Graph()
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
166
        vf = self._get_revision_vf()
167
        versions = set(vf.versions())
168
        if not revision_ids:
169
            pending = set(self.all_revision_ids())
170
            required = set([])
171
        else:
2249.5.16 by John Arbash Meinel
[merge] bzr.dev 2283
172
            pending = set(osutils.safe_revision_id(r) for r in revision_ids)
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
173
            # special case NULL_REVISION
174
            if _mod_revision.NULL_REVISION in pending:
175
                pending.remove(_mod_revision.NULL_REVISION)
176
            required = set(pending)
177
        done = set([])
178
        while len(pending):
179
            revision_id = pending.pop()
180
            if not revision_id in versions:
181
                if revision_id in required:
182
                    raise errors.NoSuchRevision(self, revision_id)
183
                # a ghost
184
                result.add_ghost(revision_id)
185
                # mark it as done so we don't try for it again.
186
                done.add(revision_id)
187
                continue
188
            parent_ids = vf.get_parents_with_ghosts(revision_id)
189
            for parent_id in parent_ids:
190
                # is this queued or done ?
191
                if (parent_id not in pending and
192
                    parent_id not in done):
193
                    # no, queue it.
194
                    pending.add(parent_id)
195
            result.add_node(revision_id, parent_ids)
196
            done.add(revision_id)
197
        return result
198
199
    def _get_revision_vf(self):
200
        """:return: a versioned file containing the revisions."""
201
        vf = self._revision_store.get_revision_file(self.get_transaction())
202
        return vf
203
2230.3.54 by Aaron Bentley
Move reverse history iteration to repository
204
    def _get_history_vf(self):
205
        """Get a versionedfile whose history graph reflects all revisions.
206
207
        For knit repositories, this is the revision knit.
208
        """
209
        return self._get_revision_vf()
210
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
211
    @needs_write_lock
212
    def reconcile(self, other=None, thorough=False):
213
        """Reconcile this repository."""
214
        from bzrlib.reconcile import KnitReconciler
215
        reconciler = KnitReconciler(self, thorough=thorough)
216
        reconciler.reconcile()
217
        return reconciler
218
    
219
    def revision_parents(self, revision_id):
2249.5.16 by John Arbash Meinel
[merge] bzr.dev 2283
220
        revision_id = osutils.safe_revision_id(revision_id)
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
221
        return self._get_revision_vf().get_parents(revision_id)
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
222
2490.2.13 by Aaron Bentley
Update distinct -> lowest, refactor, add ParentsProvider concept
223
    def _make_parents_provider(self):
224
        return _KnitParentsProvider(self._get_revision_vf())
225
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
226
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
227
class KnitRepository3(KnitRepository):
228
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
229
    def __init__(self, _format, a_bzrdir, control_files, _revision_store,
230
                 control_store, text_store):
231
        KnitRepository.__init__(self, _format, a_bzrdir, control_files,
232
                              _revision_store, control_store, text_store)
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
233
        self._serializer = xml7.serializer_v7
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
234
235
    def deserialise_inventory(self, revision_id, xml):
236
        """Transform the xml into an inventory object. 
237
238
        :param revision_id: The expected revision id of the inventory.
239
        :param xml: A serialised inventory.
240
        """
241
        result = self._serializer.read_inventory_from_string(xml)
242
        assert result.root.revision is not None
243
        return result
244
245
    def serialise_inventory(self, inv):
246
        """Transform the inventory object into XML text.
247
248
        :param revision_id: The expected revision id of the inventory.
249
        :param xml: A serialised inventory.
250
        """
251
        assert inv.revision_id is not None
252
        assert inv.root.revision is not None
253
        return KnitRepository.serialise_inventory(self, inv)
254
255
    def get_commit_builder(self, branch, parents, config, timestamp=None,
256
                           timezone=None, committer=None, revprops=None,
257
                           revision_id=None):
258
        """Obtain a CommitBuilder for this repository.
259
        
260
        :param branch: Branch to commit to.
261
        :param parents: Revision ids of the parents of the new revision.
262
        :param config: Configuration to use.
263
        :param timestamp: Optional timestamp recorded for commit.
264
        :param timezone: Optional timezone for timestamp.
265
        :param committer: Optional committer to set for commit.
266
        :param revprops: Optional dictionary of revision properties.
267
        :param revision_id: Optional revision id.
268
        """
2249.5.16 by John Arbash Meinel
[merge] bzr.dev 2283
269
        revision_id = osutils.safe_revision_id(revision_id)
2617.6.2 by Robert Collins
Add abort_write_group and wire write_groups into fetch and commit.
270
        result = RootCommitBuilder(self, parents, config, timestamp, timezone,
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
271
                                 committer, revprops, revision_id)
2617.6.2 by Robert Collins
Add abort_write_group and wire write_groups into fetch and commit.
272
        self.start_write_group()
273
        return result
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
274
275
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
276
class RepositoryFormatKnit(MetaDirRepositoryFormat):
277
    """Bzr repository knit format (generalized). 
278
279
    This repository format has:
280
     - knits for file texts and inventory
281
     - hash subdirectory based stores.
282
     - knits for revisions and signatures
283
     - TextStores for revisions and signatures.
284
     - a format marker of its own
285
     - an optional 'shared-storage' flag
286
     - an optional 'no-working-trees' flag
287
     - a LockDir lock
288
    """
289
290
    def _get_control_store(self, repo_transport, control_files):
291
        """Return the control store for this repository."""
292
        return VersionedFileStore(
293
            repo_transport,
294
            prefixed=False,
295
            file_mode=control_files._file_mode,
296
            versionedfile_class=knit.KnitVersionedFile,
297
            versionedfile_kwargs={'factory':knit.KnitPlainFactory()},
298
            )
299
300
    def _get_revision_store(self, repo_transport, control_files):
301
        """See RepositoryFormat._get_revision_store()."""
302
        from bzrlib.store.revision.knit import KnitRevisionStore
303
        versioned_file_store = VersionedFileStore(
304
            repo_transport,
305
            file_mode=control_files._file_mode,
306
            prefixed=False,
307
            precious=True,
308
            versionedfile_class=knit.KnitVersionedFile,
309
            versionedfile_kwargs={'delta':False,
310
                                  'factory':knit.KnitPlainFactory(),
311
                                 },
312
            escaped=True,
313
            )
314
        return KnitRevisionStore(versioned_file_store)
315
316
    def _get_text_store(self, transport, control_files):
317
        """See RepositoryFormat._get_text_store()."""
318
        return self._get_versioned_file_store('knits',
319
                                  transport,
320
                                  control_files,
321
                                  versionedfile_class=knit.KnitVersionedFile,
322
                                  versionedfile_kwargs={
323
                                      'create_parent_dir':True,
324
                                      'delay_create':True,
325
                                      'dir_mode':control_files._dir_mode,
326
                                  },
327
                                  escaped=True)
328
329
    def initialize(self, a_bzrdir, shared=False):
330
        """Create a knit format 1 repository.
331
332
        :param a_bzrdir: bzrdir to contain the new repository; must already
333
            be initialized.
334
        :param shared: If true the repository will be initialized as a shared
335
                       repository.
336
        """
337
        mutter('creating repository in %s.', a_bzrdir.transport.base)
338
        dirs = ['revision-store', 'knits']
339
        files = []
340
        utf8_files = [('format', self.get_format_string())]
341
        
342
        self._upload_blank_content(a_bzrdir, dirs, files, utf8_files, shared)
343
        repo_transport = a_bzrdir.get_repository_transport(None)
344
        control_files = lockable_files.LockableFiles(repo_transport,
345
                                'lock', lockdir.LockDir)
346
        control_store = self._get_control_store(repo_transport, control_files)
347
        transaction = transactions.WriteTransaction()
348
        # trigger a write of the inventory store.
349
        control_store.get_weave_or_empty('inventory', transaction)
350
        _revision_store = self._get_revision_store(repo_transport, control_files)
351
        # the revision id here is irrelevant: it will not be stored, and cannot
352
        # already exist.
353
        _revision_store.has_revision_id('A', transaction)
354
        _revision_store.get_signature_file(transaction)
355
        return self.open(a_bzrdir=a_bzrdir, _found=True)
356
357
    def open(self, a_bzrdir, _found=False, _override_transport=None):
358
        """See RepositoryFormat.open().
359
        
360
        :param _override_transport: INTERNAL USE ONLY. Allows opening the
361
                                    repository at a slightly different url
362
                                    than normal. I.e. during 'upgrade'.
363
        """
364
        if not _found:
365
            format = RepositoryFormat.find_format(a_bzrdir)
366
            assert format.__class__ ==  self.__class__
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)
373
        text_store = self._get_text_store(repo_transport, control_files)
374
        control_store = self._get_control_store(repo_transport, control_files)
375
        _revision_store = self._get_revision_store(repo_transport, control_files)
376
        return KnitRepository(_format=self,
377
                              a_bzrdir=a_bzrdir,
378
                              control_files=control_files,
379
                              _revision_store=_revision_store,
380
                              control_store=control_store,
381
                              text_store=text_store)
382
383
384
class RepositoryFormatKnit1(RepositoryFormatKnit):
385
    """Bzr repository knit format 1.
386
387
    This repository format has:
388
     - knits for file texts and inventory
389
     - hash subdirectory based stores.
390
     - knits for revisions and signatures
391
     - TextStores for revisions and signatures.
392
     - a format marker of its own
393
     - an optional 'shared-storage' flag
394
     - an optional 'no-working-trees' flag
395
     - a LockDir lock
396
397
    This format was introduced in bzr 0.8.
398
    """
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
399
2100.3.35 by Aaron Bentley
equality operations on bzrdir
400
    def __ne__(self, other):
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
401
        return self.__class__ is not other.__class__
402
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
403
    def get_format_string(self):
404
        """See RepositoryFormat.get_format_string()."""
405
        return "Bazaar-NG Knit Repository Format 1"
406
407
    def get_format_description(self):
408
        """See RepositoryFormat.get_format_description()."""
409
        return "Knit repository format 1"
410
411
    def check_conversion_target(self, target_format):
412
        pass
413
414
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
415
class RepositoryFormatKnit3(RepositoryFormatKnit):
416
    """Bzr repository knit format 2.
417
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
418
    This repository format has:
419
     - knits for file texts and inventory
420
     - hash subdirectory based stores.
421
     - knits for revisions and signatures
422
     - TextStores for revisions and signatures.
423
     - a format marker of its own
424
     - an optional 'shared-storage' flag
425
     - an optional 'no-working-trees' flag
426
     - a LockDir lock
427
     - support for recording full info about the tree root
428
     - support for recording tree-references
429
    """
430
431
    repository_class = KnitRepository3
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
432
    rich_root_data = True
2323.5.16 by Martin Pool
rename support_tree_reference to supports_
433
    supports_tree_reference = True
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
434
435
    def _get_matching_bzrdir(self):
2255.2.194 by Robert Collins
[BROKEN] Many updates to stop using experimental formats in tests.
436
        return bzrdir.format_registry.make_bzrdir('dirstate-with-subtree')
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
437
438
    def _ignore_setting_bzrdir(self, format):
439
        pass
440
441
    _matchingbzrdir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)
442
443
    def check_conversion_target(self, target_format):
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
444
        if not target_format.rich_root_data:
445
            raise errors.BadConversionTarget(
446
                'Does not support rich root data.', target_format)
2323.5.16 by Martin Pool
rename support_tree_reference to supports_
447
        if not getattr(target_format, 'supports_tree_reference', False):
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
448
            raise errors.BadConversionTarget(
449
                'Does not support nested trees', target_format)
450
            
451
    def get_format_string(self):
452
        """See RepositoryFormat.get_format_string()."""
2255.2.230 by Robert Collins
Update tree format signatures to mention introducing bzr version.
453
        return "Bazaar Knit Repository Format 3 (bzr 0.15)\n"
2100.3.31 by Aaron Bentley
Merged bzr.dev (17 tests failing)
454
455
    def get_format_description(self):
456
        """See RepositoryFormat.get_format_description()."""
457
        return "Knit repository format 3"
458
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
459
    def open(self, a_bzrdir, _found=False, _override_transport=None):
460
        """See RepositoryFormat.open().
461
        
462
        :param _override_transport: INTERNAL USE ONLY. Allows opening the
463
                                    repository at a slightly different url
464
                                    than normal. I.e. during 'upgrade'.
465
        """
466
        if not _found:
467
            format = RepositoryFormat.find_format(a_bzrdir)
468
            assert format.__class__ ==  self.__class__
469
        if _override_transport is not None:
470
            repo_transport = _override_transport
471
        else:
472
            repo_transport = a_bzrdir.get_repository_transport(None)
473
        control_files = lockable_files.LockableFiles(repo_transport, 'lock',
474
                                                     lockdir.LockDir)
475
        text_store = self._get_text_store(repo_transport, control_files)
476
        control_store = self._get_control_store(repo_transport, control_files)
477
        _revision_store = self._get_revision_store(repo_transport, control_files)
478
        return self.repository_class(_format=self,
479
                                     a_bzrdir=a_bzrdir,
480
                                     control_files=control_files,
481
                                     _revision_store=_revision_store,
482
                                     control_store=control_store,
483
                                     text_store=text_store)
2670.3.5 by Andrew Bennetts
Remove get_stream_as_bytes from KnitVersionedFile's API, make it a function in knitrepo.py instead.
484
485
486
def _get_stream_as_bytes(knit, required_versions):
487
    """Generate a serialised data stream.
488
489
    The format is a bencoding of a list.  The first element of the list is a
490
    string of the format signature, then each subsequent element is a list
491
    corresponding to a record.  Those lists contain:
492
493
      * a version id
494
      * a list of options
495
      * a list of parents
496
      * the bytes
497
498
    :returns: a bencoded list.
499
    """
500
    knit_stream = knit.get_data_stream(required_versions)
501
    format_signature, data_list, callable = knit_stream
502
    data = []
503
    data.append(format_signature)
504
    for version, options, length, parents in data_list:
505
        data.append([version, options, parents, callable(length)])
506
    return bencode.bencode(data)
507