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