118 havemf = len(mf) > 0 |
118 havemf = len(mf) > 0 |
119 |
119 |
120 ui.status(_("checking changesets\n")) |
120 ui.status(_("checking changesets\n")) |
121 seen = {} |
121 seen = {} |
122 checklog(cl, "changelog", 0) |
122 checklog(cl, "changelog", 0) |
|
123 total = len(repo) |
123 for i in repo: |
124 for i in repo: |
|
125 ui.progress('changelog', i, total=total) |
124 n = cl.node(i) |
126 n = cl.node(i) |
125 checkentry(cl, i, n, seen, [i], "changelog") |
127 checkentry(cl, i, n, seen, [i], "changelog") |
126 |
128 |
127 try: |
129 try: |
128 changes = cl.read(n) |
130 changes = cl.read(n) |
129 mflinkrevs.setdefault(changes[0], []).append(i) |
131 mflinkrevs.setdefault(changes[0], []).append(i) |
130 for f in changes[3]: |
132 for f in changes[3]: |
131 filelinkrevs.setdefault(f, []).append(i) |
133 filelinkrevs.setdefault(f, []).append(i) |
132 except Exception, inst: |
134 except Exception, inst: |
133 exc(i, _("unpacking changeset %s") % short(n), inst) |
135 exc(i, _("unpacking changeset %s") % short(n), inst) |
|
136 ui.progress('changelog', None) |
134 |
137 |
135 ui.status(_("checking manifests\n")) |
138 ui.status(_("checking manifests\n")) |
136 seen = {} |
139 seen = {} |
137 checklog(mf, "manifest", 0) |
140 checklog(mf, "manifest", 0) |
|
141 total = len(mf) |
138 for i in mf: |
142 for i in mf: |
|
143 ui.progress('manifests', i, total=total) |
139 n = mf.node(i) |
144 n = mf.node(i) |
140 lr = checkentry(mf, i, n, seen, mflinkrevs.get(n, []), "manifest") |
145 lr = checkentry(mf, i, n, seen, mflinkrevs.get(n, []), "manifest") |
141 if n in mflinkrevs: |
146 if n in mflinkrevs: |
142 del mflinkrevs[n] |
147 del mflinkrevs[n] |
143 else: |
148 else: |
149 err(lr, _("file without name in manifest")) |
154 err(lr, _("file without name in manifest")) |
150 elif f != "/dev/null": |
155 elif f != "/dev/null": |
151 filenodes.setdefault(f, {}).setdefault(fn, lr) |
156 filenodes.setdefault(f, {}).setdefault(fn, lr) |
152 except Exception, inst: |
157 except Exception, inst: |
153 exc(lr, _("reading manifest delta %s") % short(n), inst) |
158 exc(lr, _("reading manifest delta %s") % short(n), inst) |
|
159 ui.progress('manifests', None) |
154 |
160 |
155 ui.status(_("crosschecking files in changesets and manifests\n")) |
161 ui.status(_("crosschecking files in changesets and manifests\n")) |
156 |
162 |
|
163 total = len(mflinkrevs) + len(filelinkrevs) + len(filenodes) |
|
164 count = 0 |
157 if havemf: |
165 if havemf: |
158 for c, m in sorted([(c, m) for m in mflinkrevs |
166 for c, m in sorted([(c, m) for m in mflinkrevs |
159 for c in mflinkrevs[m]]): |
167 for c in mflinkrevs[m]]): |
|
168 count += 1 |
|
169 ui.progress('crosscheck', count, total=total) |
160 err(c, _("changeset refers to unknown manifest %s") % short(m)) |
170 err(c, _("changeset refers to unknown manifest %s") % short(m)) |
161 mflinkrevs = None # del is bad here due to scope issues |
171 mflinkrevs = None # del is bad here due to scope issues |
162 |
172 |
163 for f in sorted(filelinkrevs): |
173 for f in sorted(filelinkrevs): |
|
174 count += 1 |
|
175 ui.progress('crosscheck', count, total=total) |
164 if f not in filenodes: |
176 if f not in filenodes: |
165 lr = filelinkrevs[f][0] |
177 lr = filelinkrevs[f][0] |
166 err(lr, _("in changeset but not in manifest"), f) |
178 err(lr, _("in changeset but not in manifest"), f) |
167 |
179 |
168 if havecl: |
180 if havecl: |
169 for f in sorted(filenodes): |
181 for f in sorted(filenodes): |
|
182 count += 1 |
|
183 ui.progress('crosscheck', count, total=total) |
170 if f not in filelinkrevs: |
184 if f not in filelinkrevs: |
171 try: |
185 try: |
172 fl = repo.file(f) |
186 fl = repo.file(f) |
173 lr = min([fl.linkrev(fl.rev(n)) for n in filenodes[f]]) |
187 lr = min([fl.linkrev(fl.rev(n)) for n in filenodes[f]]) |
174 except: |
188 except: |
175 lr = None |
189 lr = None |
176 err(lr, _("in manifest but not in changeset"), f) |
190 err(lr, _("in manifest but not in changeset"), f) |
177 |
191 |
|
192 ui.progress('crosscheck', None) |
|
193 |
178 ui.status(_("checking files\n")) |
194 ui.status(_("checking files\n")) |
179 |
195 |
180 storefiles = set() |
196 storefiles = set() |
181 for f, f2, size in repo.store.datafiles(): |
197 for f, f2, size in repo.store.datafiles(): |
182 if not f: |
198 if not f: |
183 err(None, _("cannot decode filename '%s'") % f2) |
199 err(None, _("cannot decode filename '%s'") % f2) |
184 elif size > 0: |
200 elif size > 0: |
185 storefiles.add(f) |
201 storefiles.add(f) |
186 |
202 |
187 files = sorted(set(filenodes) | set(filelinkrevs)) |
203 files = sorted(set(filenodes) | set(filelinkrevs)) |
188 for f in files: |
204 total = len(files) |
|
205 for i, f in enumerate(files): |
|
206 ui.progress('files', i, item=f, total=total) |
189 try: |
207 try: |
190 linkrevs = filelinkrevs[f] |
208 linkrevs = filelinkrevs[f] |
191 except KeyError: |
209 except KeyError: |
192 # in manifest but not in changelog |
210 # in manifest but not in changelog |
193 linkrevs = [] |
211 linkrevs = [] |
261 # cross-check |
279 # cross-check |
262 if f in filenodes: |
280 if f in filenodes: |
263 fns = [(lr, n) for n, lr in filenodes[f].iteritems()] |
281 fns = [(lr, n) for n, lr in filenodes[f].iteritems()] |
264 for lr, node in sorted(fns): |
282 for lr, node in sorted(fns): |
265 err(lr, _("%s in manifests not found") % short(node), f) |
283 err(lr, _("%s in manifests not found") % short(node), f) |
|
284 ui.progress('files', None) |
266 |
285 |
267 for f in storefiles: |
286 for f in storefiles: |
268 warn(_("warning: orphan revlog '%s'") % f) |
287 warn(_("warning: orphan revlog '%s'") % f) |
269 |
288 |
270 ui.status(_("%d files, %d changesets, %d total revisions\n") % |
289 ui.status(_("%d files, %d changesets, %d total revisions\n") % |