~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-08-06 02:23:37 UTC
  • mfrom: (4332.3.36 check)
  • Revision ID: pqm@pqm.ubuntu.com-20090806022337-7c2oni07fsjq6gun
(robertc) Partial overhaul of check to do less duplicate work.
        (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
260
260
    def versionable_kind(kind):
261
261
        return (kind in ('file', 'directory', 'symlink', 'tree-reference'))
262
262
 
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.
265
265
 
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.
276
275
        """
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)
282
282
 
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}' %
286
 
                            (self.kind, rev_id))
 
285
        checker._report_items.append(
 
286
            'unknown entry kind %r in revision {%s}' % (self.kind, rev_id))
287
287
 
288
288
    def copy(self):
289
289
        """Clone this inventory entry."""
402
402
                 'text_id', 'parent_id', 'children', 'executable',
403
403
                 'revision', 'symlink_target', 'reference_revision']
404
404
 
405
 
    def _check(self, checker, rev_id, tree):
 
405
    def _check(self, checker, rev_id):
406
406
        """See InventoryEntry._check"""
407
407
 
408
408
    def __init__(self, file_id):
431
431
                 'text_id', 'parent_id', 'children', 'executable',
432
432
                 'revision', 'symlink_target', 'reference_revision']
433
433
 
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')
439
444
 
440
445
    def copy(self):
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']
476
481
 
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:
483
 
                raise BzrCheckError(
484
 
                    'mismatched sha1 on {%s} in {%s} (%s != %s) %r' %
485
 
                    (self.file_id, tree_revision_id, prev_sha, self.text_sha1,
486
 
                     t))
487
 
            else:
488
 
                checker.repeated_text_cnt += 1
489
 
                return
490
 
 
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',
 
487
             self.text_sha1)
 
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,
 
491
                tree_revision_id))
498
492
 
499
493
    def copy(self):
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']
600
594
 
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')
609
609
 
610
610
    def copy(self):
611
611
        other = InventoryLink(self.file_id, self.name, self.parent_id)