~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/check.py

- merge improved merge base selection from aaron
aaron.bentley@utoronto.ca-20050912025534-43d7275dd948e4ad

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
17
 
 
18
import bzrlib.ui
 
19
from bzrlib.trace import note, warning
18
20
 
19
21
def _update_store_entry(obj, obj_id, branch, store_name, store):
20
22
    """This is just a meta-function, which handles both revision entries
73
75
    _update_store_entry(inv, inv_id, branch,
74
76
            'inventory-store', branch.inventory_store)
75
77
 
 
78
 
76
79
def check(branch):
77
80
    """Run consistency checks on a branch.
78
81
 
81
84
    TODO: Check for extra files in the control directory.
82
85
    """
83
86
    from bzrlib.trace import mutter
84
 
    from bzrlib.errors import BzrCheckError
 
87
    from bzrlib.errors import BzrCheckError, NoSuchRevision
85
88
    from bzrlib.osutils import fingerprint_file
86
 
    from bzrlib.progress import ProgressBar
87
89
    from bzrlib.inventory import ROOT_ID
88
90
    from bzrlib.branch import gen_root_id
89
91
 
90
92
    branch.lock_read()
91
93
 
92
94
    try:
93
 
        pb = ProgressBar(show_spinner=True)
94
95
        last_rev_id = None
95
96
 
96
97
        missing_inventory_sha_cnt = 0
97
98
        missing_revision_sha_cnt = 0
 
99
        missing_revision_cnt = 0
98
100
 
99
101
        history = branch.revision_history()
100
102
        revno = 0
104
106
        # for all texts checked, text_id -> sha1
105
107
        checked_texts = {}
106
108
 
 
109
        progress = bzrlib.ui.ui_factory.progress_bar()
 
110
 
107
111
        for rev_id in history:
108
112
            revno += 1
109
 
            pb.update('checking revision', revno, revcount)
110
 
            mutter('    revision {%s}' % rev_id)
 
113
            progress.update('checking revision', revno, revcount)
 
114
            # mutter('    revision {%s}' % rev_id)
111
115
            rev = branch.get_revision(rev_id)
112
116
            if rev.revision_id != rev_id:
113
117
                raise BzrCheckError('wrong internal revision id in revision {%s}'
132
136
                        missing_revision_sha_cnt += 1
133
137
                        continue
134
138
                    prid = prr.revision_id
135
 
                    actual_sha = branch.get_revision_sha1(prid)
 
139
                    
 
140
                    try:
 
141
                        actual_sha = branch.get_revision_sha1(prid)
 
142
                    except NoSuchRevision:
 
143
                        missing_revision_cnt += 1
 
144
                        mutter("parent {%s} of {%s} not present in store",
 
145
                               prid, rev_id)
 
146
                        continue
 
147
                        
136
148
                    if prr.revision_sha1 != actual_sha:
137
149
                        raise BzrCheckError("mismatched revision sha1 for "
138
150
                                            "parent {%s} of {%s}: %s vs %s"
173
185
            for file_id in inv:
174
186
                i += 1
175
187
                if i & 31 == 0:
176
 
                    pb.tick()
 
188
                    progress.tick()
177
189
 
178
190
                ie = inv[file_id]
179
191
 
202
214
                        raise BzrCheckError('directory {%s} has text in revision {%s}'
203
215
                                % (file_id, rev_id))
204
216
 
205
 
            pb.tick()
 
217
            progress.tick()
206
218
            for path, ie in inv.iter_entries():
207
219
                if path in seen_names:
208
220
                    raise BzrCheckError('duplicated path %s '
214
226
    finally:
215
227
        branch.unlock()
216
228
 
217
 
    pb.clear()
 
229
    progress.clear()
218
230
 
219
 
    print 'checked %d revisions, %d file texts' % (revcount, len(checked_texts))
 
231
    note('checked %d revisions, %d file texts' % (revcount, len(checked_texts)))
220
232
    
221
233
    if missing_inventory_sha_cnt:
222
 
        print '%d revisions are missing inventory_sha1' % missing_inventory_sha_cnt
 
234
        note('%d revisions are missing inventory_sha1' % missing_inventory_sha_cnt)
223
235
 
224
236
    if missing_revision_sha_cnt:
225
 
        print '%d parent links are missing revision_sha1' % missing_revision_sha_cnt
226
 
 
227
 
    if (missing_inventory_sha_cnt
228
 
        or missing_revision_sha_cnt):
229
 
        print '  (use "bzr upgrade" to fix them)'
 
237
        note('%d parent links are missing revision_sha1' % missing_revision_sha_cnt)
 
238
 
 
239
    if missing_revision_cnt:
 
240
        note('%d revisions are mentioned but not present' % missing_revision_cnt)
 
241
 
 
242
    if missing_revision_cnt:
 
243
        print '%d revisions are mentioned but not present' % missing_revision_cnt
 
244
 
 
245
    # stub this out for now because the main bzr branch has references
 
246
    # to revisions that aren't present in the store -- mbp 20050804
 
247
#    if (missing_inventory_sha_cnt
 
248
#        or missing_revision_sha_cnt):
 
249
#        print '  (use "bzr upgrade" to fix them)'
230
250
 
231
251
    if mismatch_inv_id:
232
 
        print '%d revisions have mismatched inventory ids:' % len(mismatch_inv_id)
 
252
        warning('%d revisions have mismatched inventory ids:' % len(mismatch_inv_id))
233
253
        for rev_id in mismatch_inv_id:
234
 
            print '  ', rev_id
 
254
            warning('  %s', rev_id)