13
13
# You should have received a copy of the GNU General Public License
14
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
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
"""Deprecated weave-based repository formats.
67
69
def _serializer(self):
68
70
return xml5.serializer_v5
72
def _escape(self, file_or_path):
73
if not isinstance(file_or_path, basestring):
74
file_or_path = '/'.join(file_or_path)
75
if file_or_path == '':
77
return urlutils.escape(osutils.safe_unicode(file_or_path))
70
79
def __init__(self, _format, a_bzrdir):
71
80
# we reuse one control files instance.
72
81
dir_mode = a_bzrdir._get_dir_mode()
75
84
def get_store(name, compressed=True, prefixed=False):
76
85
# FIXME: This approach of assuming stores are all entirely compressed
77
# or entirely uncompressed is tidy, but breaks upgrade from
78
# some existing branches where there's a mixture; we probably
86
# or entirely uncompressed is tidy, but breaks upgrade from
87
# some existing branches where there's a mixture; we probably
79
88
# still want the option to look for both.
80
relpath = a_bzrdir._control_files._escape(name)
89
relpath = self._escape(name)
81
90
store = TextStore(a_bzrdir.transport.clone(relpath),
82
91
prefixed=prefixed, compressed=compressed,
87
96
# not broken out yet because the controlweaves|inventory_store
88
97
# and texts bits are still different.
89
98
if isinstance(_format, RepositoryFormat4):
90
# cannot remove these - there is still no consistent api
99
# cannot remove these - there is still no consistent api
91
100
# which allows access to this old info.
92
101
self.inventory_store = get_store('inventory-store')
93
102
self._text_store = get_store('text-store')
94
103
super(AllInOneRepository, self).__init__(_format, a_bzrdir, a_bzrdir._control_files)
95
self._fetch_order = 'topological'
96
self._fetch_reconcile = True
99
106
def _all_possible_ids(self):
106
113
def _all_revision_ids(self):
107
"""Returns a list of all the revision ids in the repository.
114
"""Returns a list of all the revision ids in the repository.
109
These are in as much topological order as the underlying store can
116
These are in as much topological order as the underlying store can
110
117
present: for weaves ghosts may lead to a lack of correctness until
111
118
the reweave updates the parents list.
184
191
class WeaveMetaDirRepository(MetaDirVersionedFileRepository):
185
192
"""A subclass of MetaDirRepository to set weave specific policy."""
188
def _serializer(self):
189
return xml5.serializer_v5
191
194
def __init__(self, _format, a_bzrdir, control_files):
192
195
super(WeaveMetaDirRepository, self).__init__(_format, a_bzrdir, control_files)
193
self._fetch_order = 'topological'
194
self._fetch_reconcile = True
196
self._serializer = _format._serializer
197
199
def _all_possible_ids(self):
204
206
def _all_revision_ids(self):
205
"""Returns a list of all the revision ids in the repository.
207
"""Returns a list of all the revision ids in the repository.
207
These are in as much topological order as the underlying store can
209
These are in as much topological order as the underlying store can
208
210
present: for weaves ghosts may lead to a lack of correctness until
209
211
the reweave updates the parents list.
265
267
supports_tree_reference = False
266
268
supports_ghosts = False
267
269
supports_external_lookups = False
270
supports_chks = False
271
_fetch_order = 'topological'
272
_fetch_reconcile = True
269
275
def initialize(self, a_bzrdir, shared=False, _internal=False):
270
276
"""Create a weave repository."""
274
280
if not _internal:
275
281
# always initialized when the bzrdir is.
276
282
return self.open(a_bzrdir, _found=True)
278
284
# Create an empty weave
280
286
weavefile.write_weave_v5(weave.Weave(), sio)
281
287
empty_weave = sio.getvalue()
283
289
mutter('creating repository in %s.', a_bzrdir.transport.base)
285
291
# FIXME: RBC 20060125 don't peek under the covers
286
292
# NB: no need to escape relative paths that are url safe.
287
293
control_files = lockable_files.LockableFiles(a_bzrdir.transport,
293
299
transport.mkdir_multi(['revision-store', 'weaves'],
294
300
mode=a_bzrdir._get_dir_mode())
295
transport.put_bytes_non_atomic('inventory.weave', empty_weave)
301
transport.put_bytes_non_atomic('inventory.weave', empty_weave,
302
mode=a_bzrdir._get_file_mode())
297
304
control_files.unlock()
298
305
return self.open(a_bzrdir, _found=True)
310
317
result.signatures = self._get_signatures(repo_transport, result)
311
318
result.inventories = self._get_inventories(repo_transport, result)
312
319
result.texts = self._get_texts(repo_transport, result)
320
result.chk_bytes = None
315
def check_conversion_target(self, target_format):
319
324
class RepositoryFormat4(PreSplitOutRepositoryFormat):
320
325
"""Bzr repository format 4.
331
336
_matchingbzrdir = bzrdir.BzrDirFormat4()
334
super(RepositoryFormat4, self).__init__()
335
self._fetch_order = 'topological'
336
self._fetch_reconcile = True
338
338
def get_format_description(self):
339
339
"""See RepositoryFormat.get_format_description()."""
340
340
return "Repository format 4"
347
347
"""Format 4 is not supported.
349
349
It is not supported because the model changed from 4 to 5 and the
350
conversion logic is expensive - so doing it on the fly was not
350
conversion logic is expensive - so doing it on the fly was not
383
383
_versionedfile_class = weave.WeaveFile
384
384
_matchingbzrdir = bzrdir.BzrDirFormat5()
387
super(RepositoryFormat5, self).__init__()
388
self._fetch_order = 'topological'
389
self._fetch_reconcile = True
386
def _serializer(self):
387
return xml5.serializer_v5
391
389
def get_format_description(self):
392
390
"""See RepositoryFormat.get_format_description()."""
393
391
return "Weave repository format 5"
393
def network_name(self):
394
"""The network name for this format is the control dirs disk label."""
395
return self._matchingbzrdir.get_format_string()
395
397
def _get_inventories(self, repo_transport, repo, name='inventory'):
396
398
mapper = versionedfile.ConstantMapper(name)
397
399
return versionedfile.ThunkedVersionedFiles(repo_transport,
398
400
weave.WeaveFile, mapper, repo.is_locked)
400
402
def _get_revisions(self, repo_transport, repo):
401
from bzrlib.xml5 import serializer_v5
402
403
return RevisionTextStore(repo_transport.clone('revision-store'),
403
serializer_v5, False, versionedfile.PrefixMapper(),
404
xml5.serializer_v5, False, versionedfile.PrefixMapper(),
404
405
repo.is_locked, repo.is_write_locked)
406
407
def _get_signatures(self, repo_transport, repo):
427
428
_versionedfile_class = weave.WeaveFile
428
429
_matchingbzrdir = bzrdir.BzrDirFormat6()
431
super(RepositoryFormat6, self).__init__()
432
self._fetch_order = 'topological'
433
self._fetch_reconcile = True
431
def _serializer(self):
432
return xml5.serializer_v5
435
434
def get_format_description(self):
436
435
"""See RepositoryFormat.get_format_description()."""
437
436
return "Weave repository format 6"
438
def network_name(self):
439
"""The network name for this format is the control dirs disk label."""
440
return self._matchingbzrdir.get_format_string()
439
442
def _get_inventories(self, repo_transport, repo, name='inventory'):
440
443
mapper = versionedfile.ConstantMapper(name)
441
444
return versionedfile.ThunkedVersionedFiles(repo_transport,
442
445
weave.WeaveFile, mapper, repo.is_locked)
444
447
def _get_revisions(self, repo_transport, repo):
445
from bzrlib.xml5 import serializer_v5
446
448
return RevisionTextStore(repo_transport.clone('revision-store'),
447
serializer_v5, False, versionedfile.HashPrefixMapper(),
449
xml5.serializer_v5, False, versionedfile.HashPrefixMapper(),
448
450
repo.is_locked, repo.is_write_locked)
450
452
def _get_signatures(self, repo_transport, repo):
474
476
_versionedfile_class = weave.WeaveFile
475
477
supports_ghosts = False
478
supports_chks = False
480
_fetch_order = 'topological'
481
_fetch_reconcile = True
484
def _serializer(self):
485
return xml5.serializer_v5
477
487
def get_format_string(self):
478
488
"""See RepositoryFormat.get_format_string()."""
482
492
"""See RepositoryFormat.get_format_description()."""
483
493
return "Weave repository format 7"
485
def check_conversion_target(self, target_format):
488
495
def _get_inventories(self, repo_transport, repo, name='inventory'):
489
496
mapper = versionedfile.ConstantMapper(name)
490
497
return versionedfile.ThunkedVersionedFiles(repo_transport,
491
498
weave.WeaveFile, mapper, repo.is_locked)
493
500
def _get_revisions(self, repo_transport, repo):
494
from bzrlib.xml5 import serializer_v5
495
501
return RevisionTextStore(repo_transport.clone('revision-store'),
496
serializer_v5, True, versionedfile.HashPrefixMapper(),
502
xml5.serializer_v5, True, versionedfile.HashPrefixMapper(),
497
503
repo.is_locked, repo.is_write_locked)
499
505
def _get_signatures(self, repo_transport, repo):
521
527
mutter('creating repository in %s.', a_bzrdir.transport.base)
522
528
dirs = ['revision-store', 'weaves']
523
files = [('inventory.weave', StringIO(empty_weave)),
529
files = [('inventory.weave', StringIO(empty_weave)),
525
531
utf8_files = [('format', self.get_format_string())]
527
533
self._upload_blank_content(a_bzrdir, dirs, files, utf8_files, shared)
528
534
return self.open(a_bzrdir=a_bzrdir, _found=True)
530
536
def open(self, a_bzrdir, _found=False, _override_transport=None):
531
537
"""See RepositoryFormat.open().
533
539
:param _override_transport: INTERNAL USE ONLY. Allows opening the
534
540
repository at a slightly different url
535
541
than normal. I.e. during 'upgrade'.
548
554
result.signatures = self._get_signatures(repo_transport, result)
549
555
result.inventories = self._get_inventories(repo_transport, result)
550
556
result.texts = self._get_texts(repo_transport, result)
557
result.chk_bytes = None
551
558
result._transport = repo_transport
657
664
result[key] = parents
667
def get_known_graph_ancestry(self, keys):
668
"""Get a KnownGraph instance with the ancestry of keys."""
670
parent_map = self.get_parent_map(keys)
671
kg = _mod_graph.KnownGraph(parent_map)
660
674
def get_record_stream(self, keys, sort_order, include_delta_closure):
662
676
text, parents = self._load_text_parents(key)
674
688
path, ext = os.path.splitext(relpath)
677
if '.sig' not in relpath:
691
if not relpath.endswith('.sig'):
678
692
relpaths.add(relpath)
679
693
paths = list(relpaths)
680
694
return set([self._mapper.unmap(path) for path in paths])