~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/check.py

Added more docs

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 by Canonical Ltd
 
1
# Copyright (C) 2004, 2005 by Martin Pool
 
2
# Copyright (C) 2005 by Canonical Ltd
2
3
 
3
4
# This program is free software; you can redistribute it and/or modify
4
5
# it under the terms of the GNU General Public License as published by
27
28
# TODO: Get every revision in the revision-store even if they're not
28
29
# referenced by history and make sure they're all valid.
29
30
 
30
 
# TODO: Perhaps have a way to record errors other than by raising exceptions;
31
 
# would perhaps be enough to accumulate exception objects in a list without
32
 
# raising them.  If there's more than one exception it'd be good to see them
33
 
# all.
34
 
 
35
31
import bzrlib.ui
36
32
from bzrlib.trace import note, warning
37
33
from bzrlib.osutils import rename, sha_string, fingerprint_file
43
39
class Check(object):
44
40
    """Check a branch"""
45
41
 
46
 
    # The Check object interacts with InventoryEntry.check, etc.
47
 
 
48
42
    def __init__(self, branch):
49
43
        self.branch = branch
50
44
        self.repository = branch.repository
55
49
        self.missing_parent_links = {}
56
50
        self.missing_inventory_sha_cnt = 0
57
51
        self.missing_revision_cnt = 0
58
 
        # maps (file-id, version) -> sha1; used by InventoryFile._check
 
52
        # maps (file-id, version) -> sha1
59
53
        self.checked_texts = {}
60
54
        self.checked_weaves = {}
61
55
 
62
56
    def check(self):
63
57
        self.branch.lock_read()
64
 
        self.progress = bzrlib.ui.ui_factory.nested_progress_bar()
 
58
        self.progress = bzrlib.ui.ui_factory.progress_bar()
65
59
        try:
66
60
            self.progress.update('retrieving inventory', 0, 0)
67
61
            # do not put in init, as it should be done with progess,
81
75
                revno += 1
82
76
                self.check_one_rev(rev_id)
83
77
        finally:
84
 
            self.progress.finished()
 
78
            self.progress.clear()
85
79
            self.branch.unlock()
86
80
 
87
81
    def plan_revisions(self):
88
82
        repository = self.branch.repository
89
 
        self.planned_revisions = set(repository.all_revision_ids())
90
 
        self.progress.clear()
91
 
        inventoried = set(self.inventory_weave.versions())
 
83
        if not repository.revision_store.listable():
 
84
            self.planned_revisions = repository.get_ancestry(self.history[-1])
 
85
            self.planned_revisions.remove(None)
 
86
            # FIXME progress bars should support this more nicely.
 
87
            self.progress.clear()
 
88
            print ("Checking reachable history -"
 
89
                   " for a complete check use a local branch.")
 
90
            return
 
91
        
 
92
        self.planned_revisions = set(repository.revision_store)
 
93
        inventoried = set(self.inventory_weave.names())
92
94
        awol = self.planned_revisions - inventoried
93
95
        if len(awol) > 0:
94
96
            raise BzrCheckError('Stored revisions missing from inventory'
98
100
    def report_results(self, verbose):
99
101
        note('checked branch %s format %s',
100
102
             self.branch.base, 
101
 
             self.branch._format)
 
103
             self.branch._branch_format)
102
104
 
103
105
        note('%6d revisions', self.checked_rev_cnt)
104
106
        note('%6d unique file texts', self.checked_text_cnt)
167
169
                    self.missing_parent_links[parent] = missing_links
168
170
                    # list based so somewhat slow,
169
171
                    # TODO have a planned_revisions list and set.
170
 
                    if self.branch.repository.has_revision(parent):
 
172
                    if self.branch.has_revision(parent):
171
173
                        missing_ancestry = self.repository.get_ancestry(parent)
172
174
                        for missing in missing_ancestry:
173
175
                            if (missing is not None