260
260
def versionable_kind(kind):
261
261
return (kind in ('file', 'directory', 'symlink', 'tree-reference'))
263
def check(self, checker, rev_id, inv, tree):
263
def check(self, checker, rev_id, inv):
264
264
"""Check this inventory entry is intact.
266
266
This is a template method, override _check for kind specific
272
272
:param rev_id: Revision id from which this InventoryEntry was loaded.
273
273
Not necessarily the last-changed revision for this file.
274
274
:param inv: Inventory from which the entry was loaded.
275
:param tree: RevisionTree for this entry.
277
276
if self.parent_id is not None:
278
277
if not inv.has_id(self.parent_id):
279
278
raise BzrCheckError('missing parent {%s} in inventory for revision {%s}'
280
279
% (self.parent_id, rev_id))
281
self._check(checker, rev_id, tree)
280
checker._add_entry_to_text_key_references(inv, self)
281
self._check(checker, rev_id)
283
def _check(self, checker, rev_id, tree):
283
def _check(self, checker, rev_id):
284
284
"""Check this inventory entry for kind specific errors."""
285
raise BzrCheckError('unknown entry kind %r in revision {%s}' %
285
checker._report_items.append(
286
'unknown entry kind %r in revision {%s}' % (self.kind, rev_id))
289
289
"""Clone this inventory entry."""
402
402
'text_id', 'parent_id', 'children', 'executable',
403
403
'revision', 'symlink_target', 'reference_revision']
405
def _check(self, checker, rev_id, tree):
405
def _check(self, checker, rev_id):
406
406
"""See InventoryEntry._check"""
408
408
def __init__(self, file_id):
431
431
'text_id', 'parent_id', 'children', 'executable',
432
432
'revision', 'symlink_target', 'reference_revision']
434
def _check(self, checker, rev_id, tree):
434
def _check(self, checker, rev_id):
435
435
"""See InventoryEntry._check"""
436
if self.text_sha1 is not None or self.text_size is not None or self.text_id is not None:
437
raise BzrCheckError('directory {%s} has text in revision {%s}'
436
if (self.text_sha1 is not None or self.text_size is not None or
437
self.text_id is not None):
438
checker._report_items.append('directory {%s} has text in revision {%s}'
438
439
% (self.file_id, rev_id))
440
# Directories are stored as ''.
441
checker.add_pending_item(rev_id,
442
('texts', self.file_id, self.revision), 'text',
443
'da39a3ee5e6b4b0d3255bfef95601890afd80709')
441
446
other = InventoryDirectory(self.file_id, self.name, self.parent_id)
474
479
'text_id', 'parent_id', 'children', 'executable',
475
480
'revision', 'symlink_target', 'reference_revision']
477
def _check(self, checker, tree_revision_id, tree):
482
def _check(self, checker, tree_revision_id):
478
483
"""See InventoryEntry._check"""
479
key = (self.file_id, self.revision)
480
if key in checker.checked_texts:
481
prev_sha = checker.checked_texts[key]
482
if prev_sha != self.text_sha1:
484
'mismatched sha1 on {%s} in {%s} (%s != %s) %r' %
485
(self.file_id, tree_revision_id, prev_sha, self.text_sha1,
488
checker.repeated_text_cnt += 1
491
checker.checked_text_cnt += 1
492
# We can't check the length, because Weave doesn't store that
493
# information, and the whole point of looking at the weave's
494
# sha1sum is that we don't have to extract the text.
495
if (self.text_sha1 != tree._repository.texts.get_sha1s([key])[key]):
496
raise BzrCheckError('text {%s} version {%s} wrong sha1' % key)
497
checker.checked_texts[key] = self.text_sha1
484
# TODO: check size too.
485
checker.add_pending_item(tree_revision_id,
486
('texts', self.file_id, self.revision), 'text',
488
if self.text_size is None:
489
checker._report_items.append(
490
'fileid {%s} in {%s} has None for text_size' % (self.file_id,
500
494
other = InventoryFile(self.file_id, self.name, self.parent_id)
598
592
'text_id', 'parent_id', 'children', 'executable',
599
593
'revision', 'symlink_target', 'reference_revision']
601
def _check(self, checker, rev_id, tree):
595
def _check(self, checker, tree_revision_id):
602
596
"""See InventoryEntry._check"""
603
597
if self.text_sha1 is not None or self.text_size is not None or self.text_id is not None:
604
raise BzrCheckError('symlink {%s} has text in revision {%s}'
605
% (self.file_id, rev_id))
598
checker._report_items.append(
599
'symlink {%s} has text in revision {%s}'
600
% (self.file_id, tree_revision_id))
606
601
if self.symlink_target is None:
607
raise BzrCheckError('symlink {%s} has no target in revision {%s}'
608
% (self.file_id, rev_id))
602
checker._report_items.append(
603
'symlink {%s} has no target in revision {%s}'
604
% (self.file_id, tree_revision_id))
605
# Symlinks are stored as ''
606
checker.add_pending_item(tree_revision_id,
607
('texts', self.file_id, self.revision), 'text',
608
'da39a3ee5e6b4b0d3255bfef95601890afd80709')
611
611
other = InventoryLink(self.file_id, self.name, self.parent_id)