14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
from __future__ import absolute_import
17
19
from bzrlib.lazy_import import lazy_import
18
20
lazy_import(globals(), """
19
23
from bzrlib import (
35
39
from bzrlib.decorators import needs_read_lock, needs_write_lock
36
40
from bzrlib.repository import (
43
RepositoryFormatMetaDir,
45
from bzrlib.vf_repository import (
39
46
InterSameDataRepository,
42
MetaDirRepositoryFormat,
47
MetaDirVersionedFileRepository,
48
MetaDirVersionedFileRepositoryFormat,
49
VersionedFileCommitBuilder,
50
VersionedFileRootCommitBuilder,
46
52
from bzrlib import symbol_versioning
116
122
def __init__(self, _format, a_bzrdir, control_files, _commit_builder_class,
118
MetaDirRepository.__init__(self, _format, a_bzrdir, control_files)
124
super(KnitRepository, self).__init__(_format, a_bzrdir, control_files)
119
125
self._commit_builder_class = _commit_builder_class
120
126
self._serializer = _serializer
121
127
self._reconcile_fixes_text_parents = True
177
183
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)
206
187
def get_revision(self, revision_id):
207
188
"""Return the Revision object for a named revision"""
232
213
def _make_parents_provider(self):
233
214
return _KnitsParentsProvider(self.revisions)
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.")
266
def revision_graph_can_have_wrong_parents(self):
267
# The revision.kndx could potentially claim a revision has a different
268
# parent to the revision text.
272
class RepositoryFormatKnit(MetaDirRepositoryFormat):
217
class RepositoryFormatKnit(MetaDirVersionedFileRepositoryFormat):
273
218
"""Bzr repository knit format (generalized).
275
220
This repository format has:
304
249
_fetch_order = 'topological'
305
250
_fetch_uses_deltas = True
306
251
fast_deltas = False
252
supports_funky_characters = True
253
# The revision.kndx could potentially claim a revision has a different
254
# parent to the revision text.
255
revision_graph_can_have_wrong_parents = True
308
257
def _get_inventories(self, repo_transport, repo, name='inventory'):
309
258
mapper = versionedfile.ConstantMapper(name)
374
323
than normal. I.e. during 'upgrade'.
377
format = RepositoryFormat.find_format(a_bzrdir)
326
format = RepositoryFormatMetaDir.find_format(a_bzrdir)
378
327
if _override_transport is not None:
379
328
repo_transport = _override_transport
420
369
def __ne__(self, other):
421
370
return self.__class__ is not other.__class__
423
def get_format_string(self):
373
def get_format_string(cls):
424
374
"""See RepositoryFormat.get_format_string()."""
425
375
return "Bazaar-NG Knit Repository Format 1"
463
413
_matchingbzrdir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)
465
def get_format_string(self):
416
def get_format_string(cls):
466
417
"""See RepositoryFormat.get_format_string()."""
467
418
return "Bazaar Knit Repository Format 3 (bzr 0.15)\n"
504
455
_matchingbzrdir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)
506
def get_format_string(self):
458
def get_format_string(cls):
507
459
"""See RepositoryFormat.get_format_string()."""
508
460
return 'Bazaar Knit Repository Format 4 (bzr 1.0)\n'
538
490
def search_missing_revision_ids(self,
539
491
revision_id=symbol_versioning.DEPRECATED_PARAMETER,
540
find_ghosts=True, revision_ids=None, if_present_ids=None):
492
find_ghosts=True, revision_ids=None, if_present_ids=None,
541
494
"""See InterRepository.search_missing_revision_ids()."""
542
495
if symbol_versioning.deprecated_passed(revision_id):
543
496
symbol_versioning.warn(
572
525
# that against the revision records.
573
526
result_set = set(
574
527
self.source._eliminate_revisions_not_present(required_revisions))
528
if limit is not None:
529
topo_ordered = self.source.get_graph().iter_topo_order(result_set)
530
result_set = set(itertools.islice(topo_ordered, limit))
575
531
return self.source.revision_ids_to_search_result(result_set)