~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/check.py

  • Committer: Aaron Bentley
  • Date: 2005-07-26 14:06:11 UTC
  • mto: (1092.1.41) (1185.3.4) (974.1.47)
  • mto: This revision was merged to the branch mainline in revision 982.
  • Revision ID: abentley@panoramicfeedback.com-20050726140611-403e366f3c79c1f1
Fixed python invocation

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
20
18
 
21
19
def _update_store_entry(obj, obj_id, branch, store_name, store):
22
20
    """This is just a meta-function, which handles both revision entries
72
70
    :param inv_id:  The inventory id for this inventory
73
71
    :param branch:  The Branch where this entry will be stored.
74
72
    """
75
 
    raise NotImplementedError("can't update existing inventory entry")
76
 
 
 
73
    _update_store_entry(inv, inv_id, branch,
 
74
            'inventory-store', branch.inventory_store)
77
75
 
78
76
def check(branch):
79
77
    """Run consistency checks on a branch.
83
81
    TODO: Check for extra files in the control directory.
84
82
    """
85
83
    from bzrlib.trace import mutter
86
 
    from bzrlib.errors import BzrCheckError, NoSuchRevision
 
84
    from bzrlib.errors import BzrCheckError
87
85
    from bzrlib.osutils import fingerprint_file
 
86
    from bzrlib.progress import ProgressBar
88
87
    from bzrlib.inventory import ROOT_ID
89
88
    from bzrlib.branch import gen_root_id
90
89
 
91
90
    branch.lock_read()
92
91
 
93
92
    try:
 
93
        pb = ProgressBar(show_spinner=True)
94
94
        last_rev_id = None
95
95
 
96
96
        missing_inventory_sha_cnt = 0
97
97
        missing_revision_sha_cnt = 0
98
 
        missing_revision_cnt = 0
99
98
 
100
99
        history = branch.revision_history()
101
100
        revno = 0
105
104
        # for all texts checked, text_id -> sha1
106
105
        checked_texts = {}
107
106
 
108
 
        progress = bzrlib.ui.ui_factory.progress_bar()
109
 
 
110
107
        for rev_id in history:
111
108
            revno += 1
112
 
            progress.update('checking revision', revno, revcount)
113
 
            # mutter('    revision {%s}' % rev_id)
 
109
            pb.update('checking revision', revno, revcount)
 
110
            mutter('    revision {%s}' % rev_id)
114
111
            rev = branch.get_revision(rev_id)
115
112
            if rev.revision_id != rev_id:
116
113
                raise BzrCheckError('wrong internal revision id in revision {%s}'
135
132
                        missing_revision_sha_cnt += 1
136
133
                        continue
137
134
                    prid = prr.revision_id
138
 
                    
139
 
                    try:
140
 
                        actual_sha = branch.get_revision_sha1(prid)
141
 
                    except NoSuchRevision:
142
 
                        missing_revision_cnt += 1
143
 
                        mutter("parent {%s} of {%s} not present in store",
144
 
                               prid, rev_id)
145
 
                        continue
146
 
                        
 
135
                    actual_sha = branch.get_revision_sha1(prid)
147
136
                    if prr.revision_sha1 != actual_sha:
148
137
                        raise BzrCheckError("mismatched revision sha1 for "
149
138
                                            "parent {%s} of {%s}: %s vs %s"
154
143
                                    "by {%s}"
155
144
                                    % (rev_id, last_rev_id))
156
145
 
157
 
            if hasattr(rev, 'inventory_id') and rev.inventory_id != rev_id:
 
146
            if rev.inventory_id != rev_id:
158
147
                mismatch_inv_id.append(rev_id)
159
148
 
160
149
            ## TODO: Check all the required fields are present on the revision.
161
150
 
162
151
            if rev.inventory_sha1:
163
 
                inv_sha1 = branch.get_inventory_sha1(rev_id)
 
152
                inv_sha1 = branch.get_inventory_sha1(rev.inventory_id)
164
153
                if inv_sha1 != rev.inventory_sha1:
165
154
                    raise BzrCheckError('Inventory sha1 hash doesn\'t match'
166
155
                        ' value in revision {%s}' % rev_id)
168
157
                missing_inventory_sha_cnt += 1
169
158
                mutter("no inventory_sha1 on revision {%s}" % rev_id)
170
159
 
171
 
            inv = branch.get_inventory(rev_id)
 
160
            inv = branch.get_inventory(rev.inventory_id)
172
161
            seen_ids = {}
173
162
            seen_names = {}
174
163
 
184
173
            for file_id in inv:
185
174
                i += 1
186
175
                if i & 31 == 0:
187
 
                    progress.tick()
 
176
                    pb.tick()
188
177
 
189
178
                ie = inv[file_id]
190
179
 
213
202
                        raise BzrCheckError('directory {%s} has text in revision {%s}'
214
203
                                % (file_id, rev_id))
215
204
 
216
 
            progress.tick()
 
205
            pb.tick()
217
206
            for path, ie in inv.iter_entries():
218
207
                if path in seen_names:
219
208
                    raise BzrCheckError('duplicated path %s '
225
214
    finally:
226
215
        branch.unlock()
227
216
 
228
 
    progress.clear()
 
217
    pb.clear()
229
218
 
230
 
    note('checked %d revisions, %d file texts' % (revcount, len(checked_texts)))
 
219
    print 'checked %d revisions, %d file texts' % (revcount, len(checked_texts))
231
220
    
232
221
    if missing_inventory_sha_cnt:
233
 
        note('%d revisions are missing inventory_sha1' % missing_inventory_sha_cnt)
 
222
        print '%d revisions are missing inventory_sha1' % missing_inventory_sha_cnt
234
223
 
235
224
    if missing_revision_sha_cnt:
236
 
        note('%d parent links are missing revision_sha1' % missing_revision_sha_cnt)
237
 
 
238
 
    if missing_revision_cnt:
239
 
        note('%d revisions are mentioned but not present' % missing_revision_cnt)
240
 
 
241
 
    if missing_revision_cnt:
242
 
        print '%d revisions are mentioned but not present' % missing_revision_cnt
243
 
 
244
 
    # stub this out for now because the main bzr branch has references
245
 
    # to revisions that aren't present in the store -- mbp 20050804
246
 
#    if (missing_inventory_sha_cnt
247
 
#        or missing_revision_sha_cnt):
248
 
#        print '  (use "bzr upgrade" to fix them)'
 
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)'
249
230
 
250
231
    if mismatch_inv_id:
251
 
        warning('%d revisions have mismatched inventory ids:' % len(mismatch_inv_id))
 
232
        print '%d revisions have mismatched inventory ids:' % len(mismatch_inv_id)
252
233
        for rev_id in mismatch_inv_id:
253
 
            warning('  %s', rev_id)
 
234
            print '  ', rev_id