~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/check.py

  • Committer: Robert Collins
  • Date: 2005-10-08 00:39:04 UTC
  • mfrom: (1185.1.52)
  • Revision ID: robertc@robertcollins.net-20051008003904-aaffaea2778efe3e
merge in martins reweave, integrated to fetch, and a bugfix for commit and upgrade with executable files

Show diffs side-by-side

added added

removed removed

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