37
35
from bzrlib.decorators import needs_read_lock, needs_write_lock
38
36
from bzrlib.repository import (
39
InterSameDataRepository,
40
40
IsInWriteGroupError,
42
MetaDirRepositoryFormat,
43
from bzrlib.vf_repository import (
44
InterSameDataRepository,
45
MetaDirVersionedFileRepository,
46
MetaDirVersionedFileRepositoryFormat,
47
VersionedFileCommitBuilder,
48
VersionedFileRootCommitBuilder,
50
46
from bzrlib import symbol_versioning
120
116
def __init__(self, _format, a_bzrdir, control_files, _commit_builder_class,
122
super(KnitRepository, self).__init__(_format, a_bzrdir, control_files)
118
MetaDirRepository.__init__(self, _format, a_bzrdir, control_files)
123
119
self._commit_builder_class = _commit_builder_class
124
120
self._serializer = _serializer
125
121
self._reconcile_fixes_text_parents = True
181
177
result.get_parent_map([('A',)])
180
def fileid_involved_between_revs(self, from_revid, to_revid):
181
"""Find file_id(s) which are involved in the changes between revisions.
183
This determines the set of revisions which are involved, and then
184
finds all file ids affected by those revisions.
186
vf = self._get_revision_vf()
187
from_set = set(vf.get_ancestry(from_revid))
188
to_set = set(vf.get_ancestry(to_revid))
189
changed = to_set.difference(from_set)
190
return self._fileid_involved_by_set(changed)
192
def fileid_involved(self, last_revid=None):
193
"""Find all file_ids modified in the ancestry of last_revid.
195
:param last_revid: If None, last_revision() will be used.
198
changed = set(self.all_revision_ids())
200
changed = set(self.get_ancestry(last_revid))
203
return self._fileid_involved_by_set(changed)
185
206
def get_revision(self, revision_id):
186
207
"""Return the Revision object for a named revision"""
211
232
def _make_parents_provider(self):
212
233
return _KnitsParentsProvider(self.revisions)
215
class RepositoryFormatKnit(MetaDirVersionedFileRepositoryFormat):
235
def _find_inconsistent_revision_parents(self, revisions_iterator=None):
236
"""Find revisions with different parent lists in the revision object
237
and in the index graph.
239
:param revisions_iterator: None, or an iterator of (revid,
240
Revision-or-None). This iterator controls the revisions checked.
241
:returns: an iterator yielding tuples of (revison-id, parents-in-index,
242
parents-in-revision).
244
if not self.is_locked():
245
raise AssertionError()
247
if revisions_iterator is None:
248
revisions_iterator = self._iter_revisions(None)
249
for revid, revision in revisions_iterator:
252
parent_map = vf.get_parent_map([(revid,)])
253
parents_according_to_index = tuple(parent[-1] for parent in
254
parent_map[(revid,)])
255
parents_according_to_revision = tuple(revision.parent_ids)
256
if parents_according_to_index != parents_according_to_revision:
257
yield (revid, parents_according_to_index,
258
parents_according_to_revision)
260
def _check_for_inconsistent_revision_parents(self):
261
inconsistencies = list(self._find_inconsistent_revision_parents())
263
raise errors.BzrCheckError(
264
"Revision knit has inconsistent parents.")
267
class RepositoryFormatKnit(MetaDirRepositoryFormat):
216
268
"""Bzr repository knit format (generalized).
218
270
This repository format has:
248
300
_fetch_uses_deltas = True
249
301
fast_deltas = False
250
302
supports_funky_characters = True
303
supports_full_versioned_files = True
251
304
# The revision.kndx could potentially claim a revision has a different
252
305
# parent to the revision text.
253
306
revision_graph_can_have_wrong_parents = True
485
538
def search_missing_revision_ids(self,
486
539
revision_id=symbol_versioning.DEPRECATED_PARAMETER,
487
find_ghosts=True, revision_ids=None, if_present_ids=None,
540
find_ghosts=True, revision_ids=None, if_present_ids=None):
489
541
"""See InterRepository.search_missing_revision_ids()."""
490
542
if symbol_versioning.deprecated_passed(revision_id):
491
543
symbol_versioning.warn(
520
572
# that against the revision records.
521
573
result_set = set(
522
574
self.source._eliminate_revisions_not_present(required_revisions))
523
if limit is not None:
524
topo_ordered = self.source.get_graph().iter_topo_order(result_set)
525
result_set = set(itertools.islice(topo_ordered, limit))
526
575
return self.source.revision_ids_to_search_result(result_set)