~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/check.py

  • Committer: Aaron Bentley
  • Date: 2005-10-04 04:32:32 UTC
  • mfrom: (1185.12.6)
  • mto: (1185.12.13)
  • mto: This revision was merged to the branch mainline in revision 1419.
  • Revision ID: aaron.bentley@utoronto.ca-20051004043231-40302a149769263b
merged my own changes

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
# TODO: Check revision, inventory and entry objects have all 
26
26
# required fields.
27
27
 
28
 
# TODO: Get every revision in the revision-store even if they're not
29
 
# referenced by history and make sure they're all valid.
30
28
 
31
29
import bzrlib.ui
32
30
from bzrlib.trace import note, warning
39
37
 
40
38
class Check(object):
41
39
    """Check a branch"""
42
 
 
43
40
    def __init__(self, branch):
44
41
        self.branch = branch
 
42
        branch.lock_read()
 
43
        try:
 
44
            branch.weave_store.enable_cache = True
 
45
            branch.control_weaves.enable_cache = True
 
46
            self.run()
 
47
        finally:
 
48
            branch.unlock()
 
49
            branch.weave_store.enable_cache = False
 
50
            branch.control_weaves.enable_cache = False
 
51
 
 
52
 
 
53
    def run(self):
 
54
        branch = self.branch
 
55
 
 
56
 
45
57
        self.checked_text_cnt = 0
46
58
        self.checked_rev_cnt = 0
47
 
        self.ghosts = []
48
59
        self.repeated_text_cnt = 0
49
 
        self.missing_parent_links = {}
50
60
        self.missing_inventory_sha_cnt = 0
51
61
        self.missing_revision_cnt = 0
52
62
        # maps (file-id, version) -> sha1
53
63
        self.checked_texts = {}
54
64
 
55
 
    def check(self):
56
 
        self.branch.lock_read()
57
 
        try:
58
 
            self.history = self.branch.revision_history()
59
 
            if not len(self.history):
60
 
                # nothing to see here
61
 
                return
62
 
            self.planned_revisions = self.branch.get_ancestry(self.history[-1])
63
 
            self.planned_revisions.remove(None)
64
 
            revno = 0
65
 
    
66
 
            self.progress = bzrlib.ui.ui_factory.progress_bar()
67
 
            while revno < len(self.planned_revisions):
68
 
                rev_id = self.planned_revisions[revno]
69
 
                self.progress.update('checking revision', revno,
70
 
                                     len(self.planned_revisions))
71
 
                revno += 1
72
 
                self.check_one_rev(rev_id)
73
 
            self.progress.clear()
74
 
        finally:
75
 
            self.branch.unlock()
76
 
 
77
 
    def report_results(self, verbose):
 
65
        history = branch.revision_history()
 
66
        revno = 0
 
67
        revcount = len(history)
 
68
 
 
69
        last_rev_id = None
 
70
        self.progress = bzrlib.ui.ui_factory.progress_bar()
 
71
        for rev_id in history:
 
72
            self.progress.update('checking revision', revno, revcount)
 
73
            revno += 1
 
74
            self.check_one_rev(rev_id, last_rev_id)
 
75
            last_rev_id = rev_id
 
76
        self.progress.clear()
 
77
        self.report_results()
 
78
 
 
79
 
 
80
    def report_results(self):
78
81
        note('checked branch %s format %d',
79
82
             self.branch.base, 
80
83
             self.branch._branch_format)
83
86
        note('%6d unique file texts', self.checked_text_cnt)
84
87
        note('%6d repeated file texts', self.repeated_text_cnt)
85
88
        if self.missing_inventory_sha_cnt:
86
 
            note('%6d revisions are missing inventory_sha1',
 
89
            note('%d revisions are missing inventory_sha1',
87
90
                 self.missing_inventory_sha_cnt)
88
91
        if self.missing_revision_cnt:
89
 
            note('%6d revisions are mentioned but not present',
 
92
            note('%d revisions are mentioned but not present',
90
93
                 self.missing_revision_cnt)
91
 
        if len(self.ghosts):
92
 
            note('%6d ghost revisions', len(self.ghosts))
93
 
            if verbose:
94
 
                for ghost in self.ghosts:
95
 
                    note('      %s', ghost)
96
 
        if len(self.missing_parent_links):
97
 
            note('%6d revisions missing parents in ancestry', 
98
 
                 len(self.missing_parent_links))
99
 
            if verbose:
100
 
                for link, linkers in self.missing_parent_links.items():
101
 
                    note('      %s should be in the ancestry for:', link)
102
 
                    for linker in linkers:
103
 
                        note('       * %s', linker)
104
 
 
105
 
    def check_one_rev(self, rev_id):
 
94
 
 
95
 
 
96
    def check_one_rev(self, rev_id, last_rev_id):
106
97
        """Check one revision.
107
98
 
108
99
        rev_id - the one to check
112
103
 
113
104
        # mutter('    revision {%s}' % rev_id)
114
105
        branch = self.branch
115
 
        try:
116
 
            rev_history_position = self.history.index(rev_id)
117
 
        except ValueError:
118
 
            rev_history_position = None
119
 
        last_rev_id = None
120
 
        if rev_history_position:
121
 
            rev = branch.get_revision(rev_id)
122
 
            if rev_history_position > 0:
123
 
                last_rev_id = self.history[rev_history_position - 1]
124
 
        else:
125
 
            rev = branch.get_revision(rev_id)
126
 
                
 
106
        rev = branch.get_revision(rev_id)
127
107
        if rev.revision_id != rev_id:
128
108
            raise BzrCheckError('wrong internal revision id in revision {%s}'
129
109
                                % rev_id)
130
110
 
131
111
        # check the previous history entry is a parent of this entry
132
112
        if rev.parent_ids:
133
 
            if last_rev_id is not None:
134
 
                for parent_id in rev.parent_ids:
135
 
                    if parent_id == last_rev_id:
136
 
                        break
137
 
                else:
138
 
                    raise BzrCheckError("previous revision {%s} not listed among "
139
 
                                        "parents of {%s}"
140
 
                                        % (last_rev_id, rev_id))
141
 
            for parent in rev.parent_ids:
142
 
                if not parent in self.planned_revisions:
143
 
                    missing_links = self.missing_parent_links.get(parent, [])
144
 
                    missing_links.append(rev_id)
145
 
                    self.missing_parent_links[parent] = missing_links
146
 
                    # list based so slow, TODO have a planned_revisions list and set.
147
 
                    if self.branch.has_revision(parent):
148
 
                        missing_ancestry = self.branch.get_ancestry(parent)
149
 
                        for missing in missing_ancestry:
150
 
                            if (missing is not None 
151
 
                                and missing not in self.planned_revisions):
152
 
                                self.planned_revisions.append(missing)
153
 
                    else:
154
 
                        self.ghosts.append(rev_id)
 
113
            if last_rev_id is None:
 
114
                raise BzrCheckError("revision {%s} has %d parents, but is the "
 
115
                                    "start of the branch"
 
116
                                    % (rev_id, len(rev.parent_ids)))
 
117
            for parent_id in rev.parent_ids:
 
118
                if parent_id == last_rev_id:
 
119
                    break
 
120
            else:
 
121
                raise BzrCheckError("previous revision {%s} not listed among "
 
122
                                    "parents of {%s}"
 
123
                                    % (last_rev_id, rev_id))
155
124
        elif last_rev_id:
156
125
            raise BzrCheckError("revision {%s} has no parents listed "
157
126
                                "but preceded by {%s}"
190
159
            seen_names[path] = True
191
160
 
192
161
 
193
 
def check(branch, verbose):
 
162
def check(branch):
194
163
    """Run consistency checks on a branch."""
195
 
    checker = Check(branch)
196
 
    checker.check()
197
 
    checker.report_results(verbose)
 
164
    Check(branch)