/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
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
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
17
"""Deprecated weave-based repository formats.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
18
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
19
Weave based formats scaled linearly with history size and could not represent
20
ghosts.
21
"""
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
22
23
from StringIO import StringIO
24
25
from bzrlib import (
26
    bzrdir,
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
27
    debug,
28
    errors,
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
29
    lockable_files,
30
    lockdir,
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
31
    osutils,
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
32
    revision as _mod_revision,
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
33
    weave,
34
    weavefile,
2241.1.8 by Martin Pool
Set the repository's serializer in the places it's needed, not in the base class
35
    xml5,
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
36
    )
37
from bzrlib.decorators import needs_read_lock, needs_write_lock
38
from bzrlib.repository import (
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
39
    CommitBuilder,
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
40
    MetaDirRepository,
41
    MetaDirRepositoryFormat,
42
    Repository,
43
    RepositoryFormat,
44
    )
45
from bzrlib.store.text import TextStore
46
from bzrlib.trace import mutter
47
48
49
class AllInOneRepository(Repository):
50
    """Legacy support - the repository behaviour for all-in-one branches."""
51
2241.1.8 by Martin Pool
Set the repository's serializer in the places it's needed, not in the base class
52
    _serializer = xml5.serializer_v5
53
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
54
    def __init__(self, _format, a_bzrdir, _revision_store, control_store, text_store):
55
        # we reuse one control files instance.
56
        dir_mode = a_bzrdir._control_files._dir_mode
57
        file_mode = a_bzrdir._control_files._file_mode
58
59
        def get_store(name, compressed=True, prefixed=False):
60
            # FIXME: This approach of assuming stores are all entirely compressed
61
            # or entirely uncompressed is tidy, but breaks upgrade from 
62
            # some existing branches where there's a mixture; we probably 
63
            # still want the option to look for both.
64
            relpath = a_bzrdir._control_files._escape(name)
65
            store = TextStore(a_bzrdir._control_files._transport.clone(relpath),
66
                              prefixed=prefixed, compressed=compressed,
67
                              dir_mode=dir_mode,
68
                              file_mode=file_mode)
69
            return store
70
71
        # not broken out yet because the controlweaves|inventory_store
72
        # and text_store | weave_store bits are still different.
73
        if isinstance(_format, RepositoryFormat4):
74
            # cannot remove these - there is still no consistent api 
75
            # which allows access to this old info.
76
            self.inventory_store = get_store('inventory-store')
77
            text_store = get_store('text-store')
78
        super(AllInOneRepository, self).__init__(_format, a_bzrdir, a_bzrdir._control_files, _revision_store, control_store, text_store)
79
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
80
    @needs_read_lock
81
    def _all_possible_ids(self):
82
        """Return all the possible revisions that we could find."""
83
        if 'evil' in debug.debug_flags:
84
            mutter_callsite(3, "_all_possible_ids scales with size of history.")
85
        return self.get_inventory_weave().versions()
86
87
    @needs_read_lock
88
    def _all_revision_ids(self):
89
        """Returns a list of all the revision ids in the repository. 
90
91
        These are in as much topological order as the underlying store can 
92
        present: for weaves ghosts may lead to a lack of correctness until
93
        the reweave updates the parents list.
94
        """
95
        if self._revision_store.text_store.listable():
96
            return self._revision_store.all_revision_ids(self.get_transaction())
97
        result = self._all_possible_ids()
98
        # TODO: jam 20070210 Ensure that _all_possible_ids returns non-unicode
99
        #       ids. (It should, since _revision_store's API should change to
100
        #       return utf8 revision_ids)
101
        return self._eliminate_revisions_not_present(result)
102
103
    def _check_revision_parents(self, revision, inventory):
104
        """Private to Repository and Fetch.
105
        
106
        This checks the parentage of revision in an inventory weave for 
107
        consistency and is only applicable to inventory-weave-for-ancestry
108
        using repository formats & fetchers.
109
        """
110
        weave_parents = inventory.get_parents(revision.revision_id)
111
        weave_names = inventory.versions()
112
        for parent_id in revision.parent_ids:
113
            if parent_id in weave_names:
114
                # this parent must not be a ghost.
115
                if not parent_id in weave_parents:
116
                    # but it is a ghost
117
                    raise errors.CorruptRepository(self)
118
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
119
    def get_commit_builder(self, branch, parents, config, timestamp=None,
120
                           timezone=None, committer=None, revprops=None,
121
                           revision_id=None):
122
        self._check_ascii_revisionid(revision_id, self.get_commit_builder)
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
123
        revision_id = osutils.safe_revision_id(revision_id)
124
        result = WeaveCommitBuilder(self, parents, config, timestamp, timezone,
125
                              committer, revprops, revision_id)
126
        self.start_write_group()
127
        return result
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
128
129
    @needs_read_lock
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
130
    def get_revisions(self, revision_ids):
131
        revs = self._get_revisions(revision_ids)
132
        # weave corruption can lead to absent revision markers that should be
133
        # present.
134
        # the following test is reasonably cheap (it needs a single weave read)
135
        # and the weave is cached in read transactions. In write transactions
136
        # it is not cached but typically we only read a small number of
137
        # revisions. For knits when they are introduced we will probably want
138
        # to ensure that caching write transactions are in use.
139
        inv = self.get_inventory_weave()
140
        for rev in revs:
141
            self._check_revision_parents(rev, inv)
142
        return revs
143
144
    @needs_read_lock
145
    def get_revision_graph(self, revision_id=None):
146
        """Return a dictionary containing the revision graph.
147
        
148
        :param revision_id: The revision_id to get a graph from. If None, then
149
        the entire revision graph is returned. This is a deprecated mode of
150
        operation and will be removed in the future.
151
        :return: a dictionary of revision_id->revision_parents_list.
152
        """
153
        if 'evil' in debug.debug_flags:
154
            mutter_callsite(2,
155
                "get_revision_graph scales with size of history.")
156
        # special case NULL_REVISION
157
        if revision_id == _mod_revision.NULL_REVISION:
158
            return {}
159
        revision_id = osutils.safe_revision_id(revision_id)
160
        a_weave = self.get_inventory_weave()
161
        all_revisions = self._eliminate_revisions_not_present(
162
                                a_weave.versions())
163
        entire_graph = dict([(node, tuple(a_weave.get_parents(node))) for 
164
                             node in all_revisions])
165
        if revision_id is None:
166
            return entire_graph
167
        elif revision_id not in entire_graph:
168
            raise errors.NoSuchRevision(self, revision_id)
169
        else:
170
            # add what can be reached from revision_id
171
            result = {}
172
            pending = set([revision_id])
173
            while len(pending) > 0:
174
                node = pending.pop()
175
                result[node] = entire_graph[node]
176
                for revision_id in result[node]:
177
                    if revision_id not in result:
178
                        pending.add(revision_id)
179
            return result
180
181
    @needs_read_lock
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
182
    def is_shared(self):
183
        """AllInOne repositories cannot be shared."""
184
        return False
185
186
    @needs_write_lock
187
    def set_make_working_trees(self, new_value):
188
        """Set the policy flag for making working trees when creating branches.
189
190
        This only applies to branches that use this repository.
191
192
        The default is 'True'.
193
        :param new_value: True to restore the default, False to disable making
194
                          working trees.
195
        """
196
        raise NotImplementedError(self.set_make_working_trees)
197
    
198
    def make_working_trees(self):
199
        """Returns the policy for making working trees on new branches."""
200
        return True
201
202
203
class WeaveMetaDirRepository(MetaDirRepository):
204
    """A subclass of MetaDirRepository to set weave specific policy."""
205
2241.1.8 by Martin Pool
Set the repository's serializer in the places it's needed, not in the base class
206
    _serializer = xml5.serializer_v5
207
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
208
    @needs_read_lock
209
    def _all_possible_ids(self):
210
        """Return all the possible revisions that we could find."""
211
        if 'evil' in debug.debug_flags:
212
            mutter_callsite(3, "_all_possible_ids scales with size of history.")
213
        return self.get_inventory_weave().versions()
214
215
    @needs_read_lock
216
    def _all_revision_ids(self):
217
        """Returns a list of all the revision ids in the repository. 
218
219
        These are in as much topological order as the underlying store can 
220
        present: for weaves ghosts may lead to a lack of correctness until
221
        the reweave updates the parents list.
222
        """
223
        if self._revision_store.text_store.listable():
224
            return self._revision_store.all_revision_ids(self.get_transaction())
225
        result = self._all_possible_ids()
226
        # TODO: jam 20070210 Ensure that _all_possible_ids returns non-unicode
227
        #       ids. (It should, since _revision_store's API should change to
228
        #       return utf8 revision_ids)
229
        return self._eliminate_revisions_not_present(result)
230
231
    def _check_revision_parents(self, revision, inventory):
232
        """Private to Repository and Fetch.
233
        
234
        This checks the parentage of revision in an inventory weave for 
235
        consistency and is only applicable to inventory-weave-for-ancestry
236
        using repository formats & fetchers.
237
        """
238
        weave_parents = inventory.get_parents(revision.revision_id)
239
        weave_names = inventory.versions()
240
        for parent_id in revision.parent_ids:
241
            if parent_id in weave_names:
242
                # this parent must not be a ghost.
243
                if not parent_id in weave_parents:
244
                    # but it is a ghost
245
                    raise errors.CorruptRepository(self)
246
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
247
    def get_commit_builder(self, branch, parents, config, timestamp=None,
248
                           timezone=None, committer=None, revprops=None,
249
                           revision_id=None):
250
        self._check_ascii_revisionid(revision_id, self.get_commit_builder)
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
251
        revision_id = osutils.safe_revision_id(revision_id)
252
        result = WeaveCommitBuilder(self, parents, config, timestamp, timezone,
253
                              committer, revprops, revision_id)
254
        self.start_write_group()
255
        return result
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
256
2850.3.1 by Robert Collins
Move various weave specific code out of the base Repository class to weaverepo.py.
257
    @needs_read_lock
258
    def get_revision(self, revision_id):
259
        """Return the Revision object for a named revision"""
260
        # TODO: jam 20070210 get_revision_reconcile should do this for us
261
        revision_id = osutils.safe_revision_id(revision_id)
262
        r = self.get_revision_reconcile(revision_id)
263
        # weave corruption can lead to absent revision markers that should be
264
        # present.
265
        # the following test is reasonably cheap (it needs a single weave read)
266
        # and the weave is cached in read transactions. In write transactions
267
        # it is not cached but typically we only read a small number of
268
        # revisions. For knits when they are introduced we will probably want
269
        # to ensure that caching write transactions are in use.
270
        inv = self.get_inventory_weave()
271
        self._check_revision_parents(r, inv)
272
        return r
273
274
    @needs_read_lock
275
    def get_revision_graph(self, revision_id=None):
276
        """Return a dictionary containing the revision graph.
277
        
278
        :param revision_id: The revision_id to get a graph from. If None, then
279
        the entire revision graph is returned. This is a deprecated mode of
280
        operation and will be removed in the future.
281
        :return: a dictionary of revision_id->revision_parents_list.
282
        """
283
        if 'evil' in debug.debug_flags:
284
            mutter_callsite(3,
285
                "get_revision_graph scales with size of history.")
286
        # special case NULL_REVISION
287
        if revision_id == _mod_revision.NULL_REVISION:
288
            return {}
289
        revision_id = osutils.safe_revision_id(revision_id)
290
        a_weave = self.get_inventory_weave()
291
        all_revisions = self._eliminate_revisions_not_present(
292
                                a_weave.versions())
293
        entire_graph = dict([(node, tuple(a_weave.get_parents(node))) for 
294
                             node in all_revisions])
295
        if revision_id is None:
296
            return entire_graph
297
        elif revision_id not in entire_graph:
298
            raise errors.NoSuchRevision(self, revision_id)
299
        else:
300
            # add what can be reached from revision_id
301
            result = {}
302
            pending = set([revision_id])
303
            while len(pending) > 0:
304
                node = pending.pop()
305
                result[node] = entire_graph[node]
306
                for revision_id in result[node]:
307
                    if revision_id not in result:
308
                        pending.add(revision_id)
309
            return result
310
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
311
312
class PreSplitOutRepositoryFormat(RepositoryFormat):
313
    """Base class for the pre split out repository formats."""
314
315
    rich_root_data = False
2323.5.17 by Martin Pool
Add supports_tree_reference to all repo formats (robert)
316
    supports_tree_reference = False
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
317
318
    def initialize(self, a_bzrdir, shared=False, _internal=False):
319
        """Create a weave repository.
320
        
321
        TODO: when creating split out bzr branch formats, move this to a common
322
        base for Format5, Format6. or something like that.
323
        """
324
        if shared:
325
            raise errors.IncompatibleFormat(self, a_bzrdir._format)
326
327
        if not _internal:
328
            # always initialized when the bzrdir is.
329
            return self.open(a_bzrdir, _found=True)
330
        
331
        # Create an empty weave
332
        sio = StringIO()
333
        weavefile.write_weave_v5(weave.Weave(), sio)
334
        empty_weave = sio.getvalue()
335
336
        mutter('creating repository in %s.', a_bzrdir.transport.base)
337
        dirs = ['revision-store', 'weaves']
338
        files = [('inventory.weave', StringIO(empty_weave)),
339
                 ]
340
        
341
        # FIXME: RBC 20060125 don't peek under the covers
342
        # NB: no need to escape relative paths that are url safe.
343
        control_files = lockable_files.LockableFiles(a_bzrdir.transport,
344
                                'branch-lock', lockable_files.TransportLock)
345
        control_files.create_lock()
346
        control_files.lock_write()
347
        control_files._transport.mkdir_multi(dirs,
348
                mode=control_files._dir_mode)
349
        try:
350
            for file, content in files:
351
                control_files.put(file, content)
352
        finally:
353
            control_files.unlock()
354
        return self.open(a_bzrdir, _found=True)
355
356
    def _get_control_store(self, repo_transport, control_files):
357
        """Return the control store for this repository."""
358
        return self._get_versioned_file_store('',
359
                                              repo_transport,
360
                                              control_files,
361
                                              prefixed=False)
362
363
    def _get_text_store(self, transport, control_files):
364
        """Get a store for file texts for this format."""
365
        raise NotImplementedError(self._get_text_store)
366
367
    def open(self, a_bzrdir, _found=False):
368
        """See RepositoryFormat.open()."""
369
        if not _found:
370
            # we are being called directly and must probe.
371
            raise NotImplementedError
372
373
        repo_transport = a_bzrdir.get_repository_transport(None)
374
        control_files = a_bzrdir._control_files
375
        text_store = self._get_text_store(repo_transport, control_files)
376
        control_store = self._get_control_store(repo_transport, control_files)
377
        _revision_store = self._get_revision_store(repo_transport, control_files)
378
        return AllInOneRepository(_format=self,
379
                                  a_bzrdir=a_bzrdir,
380
                                  _revision_store=_revision_store,
381
                                  control_store=control_store,
382
                                  text_store=text_store)
383
384
    def check_conversion_target(self, target_format):
385
        pass
386
387
388
class RepositoryFormat4(PreSplitOutRepositoryFormat):
389
    """Bzr repository format 4.
390
391
    This repository format has:
392
     - flat stores
393
     - TextStores for texts, inventories,revisions.
394
395
    This format is deprecated: it indexes texts using a text id which is
396
    removed in format 5; initialization and write support for this format
397
    has been removed.
398
    """
399
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
400
    _matchingbzrdir = bzrdir.BzrDirFormat4()
401
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
402
    def __init__(self):
403
        super(RepositoryFormat4, self).__init__()
404
405
    def get_format_description(self):
406
        """See RepositoryFormat.get_format_description()."""
407
        return "Repository format 4"
408
409
    def initialize(self, url, shared=False, _internal=False):
410
        """Format 4 branches cannot be created."""
411
        raise errors.UninitializableFormat(self)
412
413
    def is_supported(self):
414
        """Format 4 is not supported.
415
416
        It is not supported because the model changed from 4 to 5 and the
417
        conversion logic is expensive - so doing it on the fly was not 
418
        feasible.
419
        """
420
        return False
421
422
    def _get_control_store(self, repo_transport, control_files):
423
        """Format 4 repositories have no formal control store at this point.
424
        
425
        This will cause any control-file-needing apis to fail - this is desired.
426
        """
427
        return None
428
    
429
    def _get_revision_store(self, repo_transport, control_files):
430
        """See RepositoryFormat._get_revision_store()."""
431
        from bzrlib.xml4 import serializer_v4
432
        return self._get_text_rev_store(repo_transport,
433
                                        control_files,
434
                                        'revision-store',
435
                                        serializer=serializer_v4)
436
437
    def _get_text_store(self, transport, control_files):
438
        """See RepositoryFormat._get_text_store()."""
439
440
441
class RepositoryFormat5(PreSplitOutRepositoryFormat):
442
    """Bzr control format 5.
443
444
    This repository format has:
445
     - weaves for file texts and inventory
446
     - flat stores
447
     - TextStores for revisions and signatures.
448
    """
449
2241.1.10 by Martin Pool
Remove more references to weaves from the repository.py file
450
    _versionedfile_class = weave.WeaveFile
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
451
    _matchingbzrdir = bzrdir.BzrDirFormat5()
2241.1.10 by Martin Pool
Remove more references to weaves from the repository.py file
452
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
453
    def __init__(self):
454
        super(RepositoryFormat5, self).__init__()
455
456
    def get_format_description(self):
457
        """See RepositoryFormat.get_format_description()."""
458
        return "Weave repository format 5"
459
460
    def _get_revision_store(self, repo_transport, control_files):
461
        """See RepositoryFormat._get_revision_store()."""
462
        """Return the revision store object for this a_bzrdir."""
463
        return self._get_text_rev_store(repo_transport,
464
                                        control_files,
465
                                        'revision-store',
466
                                        compressed=False)
467
468
    def _get_text_store(self, transport, control_files):
469
        """See RepositoryFormat._get_text_store()."""
470
        return self._get_versioned_file_store('weaves', transport, control_files, prefixed=False)
471
472
473
class RepositoryFormat6(PreSplitOutRepositoryFormat):
474
    """Bzr control format 6.
475
476
    This repository format has:
477
     - weaves for file texts and inventory
478
     - hash subdirectory based stores.
479
     - TextStores for revisions and signatures.
480
    """
481
2241.1.10 by Martin Pool
Remove more references to weaves from the repository.py file
482
    _versionedfile_class = weave.WeaveFile
2241.1.11 by Martin Pool
Get rid of RepositoryFormat*_instance objects. Instead the format
483
    _matchingbzrdir = bzrdir.BzrDirFormat6()
2241.1.10 by Martin Pool
Remove more references to weaves from the repository.py file
484
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
485
    def __init__(self):
486
        super(RepositoryFormat6, self).__init__()
487
488
    def get_format_description(self):
489
        """See RepositoryFormat.get_format_description()."""
490
        return "Weave repository format 6"
491
492
    def _get_revision_store(self, repo_transport, control_files):
493
        """See RepositoryFormat._get_revision_store()."""
494
        return self._get_text_rev_store(repo_transport,
495
                                        control_files,
496
                                        'revision-store',
497
                                        compressed=False,
498
                                        prefixed=True)
499
500
    def _get_text_store(self, transport, control_files):
501
        """See RepositoryFormat._get_text_store()."""
502
        return self._get_versioned_file_store('weaves', transport, control_files)
503
504
505
class RepositoryFormat7(MetaDirRepositoryFormat):
506
    """Bzr repository 7.
507
508
    This repository format has:
509
     - weaves for file texts and inventory
510
     - hash subdirectory based stores.
511
     - TextStores for revisions and signatures.
512
     - a format marker of its own
513
     - an optional 'shared-storage' flag
514
     - an optional 'no-working-trees' flag
515
    """
516
2241.1.10 by Martin Pool
Remove more references to weaves from the repository.py file
517
    _versionedfile_class = weave.WeaveFile
518
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
519
    def _get_control_store(self, repo_transport, control_files):
520
        """Return the control store for this repository."""
521
        return self._get_versioned_file_store('',
522
                                              repo_transport,
523
                                              control_files,
524
                                              prefixed=False)
525
526
    def get_format_string(self):
527
        """See RepositoryFormat.get_format_string()."""
528
        return "Bazaar-NG Repository format 7"
529
530
    def get_format_description(self):
531
        """See RepositoryFormat.get_format_description()."""
532
        return "Weave repository format 7"
533
534
    def check_conversion_target(self, target_format):
535
        pass
536
537
    def _get_revision_store(self, repo_transport, control_files):
538
        """See RepositoryFormat._get_revision_store()."""
539
        return self._get_text_rev_store(repo_transport,
540
                                        control_files,
541
                                        'revision-store',
542
                                        compressed=False,
543
                                        prefixed=True,
544
                                        )
545
546
    def _get_text_store(self, transport, control_files):
547
        """See RepositoryFormat._get_text_store()."""
548
        return self._get_versioned_file_store('weaves',
549
                                              transport,
550
                                              control_files)
551
552
    def initialize(self, a_bzrdir, shared=False):
553
        """Create a weave repository.
554
555
        :param shared: If true the repository will be initialized as a shared
556
                       repository.
557
        """
558
        # Create an empty weave
559
        sio = StringIO()
560
        weavefile.write_weave_v5(weave.Weave(), sio)
561
        empty_weave = sio.getvalue()
562
563
        mutter('creating repository in %s.', a_bzrdir.transport.base)
564
        dirs = ['revision-store', 'weaves']
565
        files = [('inventory.weave', StringIO(empty_weave)), 
566
                 ]
567
        utf8_files = [('format', self.get_format_string())]
568
 
569
        self._upload_blank_content(a_bzrdir, dirs, files, utf8_files, shared)
570
        return self.open(a_bzrdir=a_bzrdir, _found=True)
571
572
    def open(self, a_bzrdir, _found=False, _override_transport=None):
573
        """See RepositoryFormat.open().
574
        
575
        :param _override_transport: INTERNAL USE ONLY. Allows opening the
576
                                    repository at a slightly different url
577
                                    than normal. I.e. during 'upgrade'.
578
        """
579
        if not _found:
580
            format = RepositoryFormat.find_format(a_bzrdir)
581
            assert format.__class__ ==  self.__class__
582
        if _override_transport is not None:
583
            repo_transport = _override_transport
584
        else:
585
            repo_transport = a_bzrdir.get_repository_transport(None)
586
        control_files = lockable_files.LockableFiles(repo_transport,
587
                                'lock', lockdir.LockDir)
588
        text_store = self._get_text_store(repo_transport, control_files)
589
        control_store = self._get_control_store(repo_transport, control_files)
590
        _revision_store = self._get_revision_store(repo_transport, control_files)
591
        return WeaveMetaDirRepository(_format=self,
592
            a_bzrdir=a_bzrdir,
593
            control_files=control_files,
594
            _revision_store=_revision_store,
595
            control_store=control_store,
596
            text_store=text_store)
597
598
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
599
class WeaveCommitBuilder(CommitBuilder):
600
    """A builder for weave based repos that don't support ghosts."""
601
2776.4.9 by Robert Collins
Unbreak weaves.
602
    def _add_text_to_weave(self, file_id, new_lines, parents, nostore_sha):
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
603
        versionedfile = self.repository.weave_store.get_weave_or_empty(
604
            file_id, self.repository.get_transaction())
605
        result = versionedfile.add_lines(
2776.4.9 by Robert Collins
Unbreak weaves.
606
            self._new_revision_id, parents, new_lines,
607
            nostore_sha=nostore_sha)[0:2]
2803.2.1 by Robert Collins
* CommitBuilder now advertises itself as requiring the root entry to be
608
        versionedfile.clear_cache()
609
        return result
610
611
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
612
_legacy_formats = [RepositoryFormat4(),
613
                   RepositoryFormat5(),
614
                   RepositoryFormat6()]