96
96
# yes, this is not suitable for adding with ghosts.
97
97
self.add_inventory(rev_id, inv, rev.parent_ids)
100
bzrlib.xml5.serializer_v5.write_revision(rev, rev_tmp)
102
self.revision_store.add(rev_tmp, rev_id)
103
mutter('added revision_id {%s}', rev_id)
98
self._revision_store.add_revision(rev, self.get_transaction())
106
101
def _all_possible_ids(self):
115
110
present: for weaves ghosts may lead to a lack of correctness until
116
111
the reweave updates the parents list.
118
if self.revision_store.listable():
119
# yes this is slow, but its complete.
121
for rev_id in self.revision_store:
122
rev = self.get_revision(rev_id)
123
result_graph[rev_id] = rev.parent_ids
125
for rev_id, parents in result_graph.items():
126
for parent in parents:
127
if not parent in result_graph:
128
del parents[parents.index(parent)]
129
return topo_sort(result_graph.items())
113
if self._revision_store.text_store.listable():
114
return self._revision_store.all_revision_ids(self.get_transaction())
130
115
result = self._all_possible_ids()
131
116
return self._eliminate_revisions_not_present(result)
147
132
"""Construct the current default format repository in a_bzrdir."""
148
133
return RepositoryFormat.get_default_format().initialize(a_bzrdir)
150
def __init__(self, _format, a_bzrdir, control_files, revision_store, control_store, text_store):
135
def __init__(self, _format, a_bzrdir, control_files, _revision_store, control_store, text_store):
151
136
"""instantiate a Repository.
153
138
:param _format: The format of the repository on disk.
163
148
self.bzrdir = a_bzrdir
164
149
self.control_files = control_files
165
150
# backwards compatible until we fully transition
166
self.revision_store = revision_store.text_store
167
self._revision_store = revision_store
151
self.revision_store = _revision_store.text_store
152
self._revision_store = _revision_store
168
153
self.text_store = text_store
169
154
# backwards compatability
170
155
self.weave_store = text_store
246
231
self.get_transaction())
249
def get_revision_xml_file(self, revision_id):
250
"""Return XML file object for revision object."""
251
if not revision_id or not isinstance(revision_id, basestring):
252
raise InvalidRevisionId(revision_id=revision_id, branch=self)
254
return self.revision_store.get(revision_id)
255
except (IndexError, KeyError):
256
raise bzrlib.errors.NoSuchRevision(self, revision_id)
259
def get_revision_xml(self, revision_id):
260
return self.get_revision_xml_file(revision_id).read()
263
234
def get_revision_reconcile(self, revision_id):
264
235
"""'reconcile' helper routine that allows access to a revision always.
274
245
self.get_transaction())
248
def get_revision_xml(self, revision_id):
249
rev = self.get_revision(revision_id)
251
# the current serializer..
252
self._revision_store._serializer.write_revision(rev, rev_tmp)
254
return rev_tmp.getvalue()
277
257
def get_revision(self, revision_id):
278
258
"""Return the Revision object for a named revision"""
279
259
r = self.get_revision_reconcile(revision_id)
307
287
@needs_write_lock
308
288
def store_revision_signature(self, gpg_strategy, plaintext, revision_id):
309
self.revision_store.add(StringIO(gpg_strategy.sign(plaintext)),
289
signature = gpg_strategy.sign(plaintext)
290
self._revision_store.add_revision_signature_text(revision_id,
292
self.get_transaction())
312
294
def fileid_involved_between_revs(self, from_revid, to_revid):
313
295
"""Find file_id(s) which are involved in the changes between revisions.
569
551
plaintext = Testament.from_revision(self, revision_id).as_short_text()
570
552
self.store_revision_signature(gpg_strategy, plaintext, revision_id)
555
def has_signature_for_revision_id(self, revision_id):
556
"""Query for a revision signature for revision_id in the repository."""
557
return self._revision_store.has_signature(revision_id,
558
self.get_transaction())
573
561
class AllInOneRepository(Repository):
574
562
"""Legacy support - the repository behaviour for all-in-one branches."""
576
def __init__(self, _format, a_bzrdir, revision_store, control_store, text_store):
564
def __init__(self, _format, a_bzrdir, _revision_store, control_store, text_store):
577
565
# we reuse one control files instance.
578
566
dir_mode = a_bzrdir._control_files._dir_mode
579
567
file_mode = a_bzrdir._control_files._file_mode
615
603
# which allows access to this old info.
616
604
self.inventory_store = get_store('inventory-store')
617
605
text_store = get_store('text-store')
618
super(AllInOneRepository, self).__init__(_format, a_bzrdir, a_bzrdir._control_files, revision_store, control_store, text_store)
606
super(AllInOneRepository, self).__init__(_format, a_bzrdir, a_bzrdir._control_files, _revision_store, control_store, text_store)
621
609
class MetaDirRepository(Repository):
622
610
"""Repositories in the new meta-dir layout."""
624
def __init__(self, _format, a_bzrdir, control_files, revision_store, control_store, text_store):
612
def __init__(self, _format, a_bzrdir, control_files, _revision_store, control_store, text_store):
625
613
super(MetaDirRepository, self).__init__(_format,
638
class KnitRepository(MetaDirRepository):
639
"""Knit format repository."""
642
def all_revision_ids(self):
643
"""See Repository.all_revision_ids()."""
644
return self._revision_store.all_revision_ids(self.get_transaction())
650
647
class RepositoryFormat(object):
651
648
"""A repository format.
730
727
compressed=compressed,
731
728
dir_mode=dir_mode,
732
729
file_mode=file_mode)
733
revision_store = TextRevisionStore(text_store, serializer)
734
return revision_store
730
_revision_store = TextRevisionStore(text_store, serializer)
731
return _revision_store
736
733
def _get_versioned_file_store(self,
851
848
control_files = a_bzrdir._control_files
852
849
text_store = self._get_text_store(repo_transport, control_files)
853
850
control_store = self._get_control_store(repo_transport, control_files)
854
revision_store = self._get_revision_store(repo_transport, control_files)
851
_revision_store = self._get_revision_store(repo_transport, control_files)
855
852
return AllInOneRepository(_format=self,
856
853
a_bzrdir=a_bzrdir,
857
revision_store=revision_store,
854
_revision_store=_revision_store,
858
855
control_store=control_store,
859
856
text_store=text_store)
1009
1006
control_files = LockableFiles(repo_transport, 'lock')
1010
1007
text_store = self._get_text_store(repo_transport, control_files)
1011
1008
control_store = self._get_control_store(repo_transport, control_files)
1012
revision_store = self._get_revision_store(repo_transport, control_files)
1009
_revision_store = self._get_revision_store(repo_transport, control_files)
1013
1010
return MetaDirRepository(_format=self,
1014
1011
a_bzrdir=a_bzrdir,
1015
1012
control_files=control_files,
1016
revision_store=revision_store,
1013
_revision_store=_revision_store,
1017
1014
control_store=control_store,
1018
1015
text_store=text_store)
1079
1076
self._upload_blank_content(a_bzrdir, dirs, files, utf8_files, shared)
1080
1077
return self.open(a_bzrdir=a_bzrdir, _found=True)
1079
def open(self, a_bzrdir, _found=False, _override_transport=None):
1080
"""See RepositoryFormat.open().
1082
:param _override_transport: INTERNAL USE ONLY. Allows opening the
1083
repository at a slightly different url
1084
than normal. I.e. during 'upgrade'.
1087
format = RepositoryFormat.find_format(a_bzrdir)
1088
assert format.__class__ == self.__class__
1089
if _override_transport is not None:
1090
repo_transport = _override_transport
1092
repo_transport = a_bzrdir.get_repository_transport(None)
1093
control_files = LockableFiles(repo_transport, 'lock')
1094
text_store = self._get_text_store(repo_transport, control_files)
1095
control_store = self._get_control_store(repo_transport, control_files)
1096
_revision_store = self._get_revision_store(repo_transport, control_files)
1097
return KnitRepository(_format=self,
1099
control_files=control_files,
1100
_revision_store=_revision_store,
1101
control_store=control_store,
1102
text_store=text_store)
1083
1105
class RepositoryFormatKnit1(MetaDirRepositoryFormat):
1084
1106
"""Bzr repository knit format 1.