Mercurial > public > mercurial-scm > hg
comparison mercurial/localrepo.py @ 1382:b113e7db06e9
hg verify: more consistency checking between changesets and manifests
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Wed, 05 Oct 2005 10:37:51 -0700 |
parents | f2b00be33e2c |
children | 3d6d45faf8b2 |
comparison
equal
deleted
inserted
replaced
1381:c29c36745c6e | 1382:b113e7db06e9 |
---|---|
1308 def verify(self): | 1308 def verify(self): |
1309 filelinkrevs = {} | 1309 filelinkrevs = {} |
1310 filenodes = {} | 1310 filenodes = {} |
1311 changesets = revisions = files = 0 | 1311 changesets = revisions = files = 0 |
1312 errors = 0 | 1312 errors = 0 |
1313 neededmanifests = {} | |
1313 | 1314 |
1314 seen = {} | 1315 seen = {} |
1315 self.ui.status("checking changesets\n") | 1316 self.ui.status("checking changesets\n") |
1316 for i in range(self.changelog.count()): | 1317 for i in range(self.changelog.count()): |
1317 changesets += 1 | 1318 changesets += 1 |
1318 n = self.changelog.node(i) | 1319 n = self.changelog.node(i) |
1320 l = self.changelog.linkrev(n) | |
1321 if l != i: | |
1322 self.ui.warn("incorrect linkrev (%d) for changeset revision %d" | |
1323 % (l, i)) | |
1319 if n in seen: | 1324 if n in seen: |
1320 self.ui.warn("duplicate changeset at revision %d\n" % i) | 1325 self.ui.warn("duplicate changeset at revision %d\n" % i) |
1321 errors += 1 | 1326 errors += 1 |
1322 seen[n] = 1 | 1327 seen[n] = 1 |
1323 | 1328 |
1330 changes = self.changelog.read(n) | 1335 changes = self.changelog.read(n) |
1331 except Exception, inst: | 1336 except Exception, inst: |
1332 self.ui.warn("unpacking changeset %s: %s\n" % (short(n), inst)) | 1337 self.ui.warn("unpacking changeset %s: %s\n" % (short(n), inst)) |
1333 errors += 1 | 1338 errors += 1 |
1334 | 1339 |
1340 neededmanifests[changes[0]] = n | |
1341 | |
1335 for f in changes[3]: | 1342 for f in changes[3]: |
1336 filelinkrevs.setdefault(f, []).append(i) | 1343 filelinkrevs.setdefault(f, []).append(i) |
1337 | 1344 |
1338 seen = {} | 1345 seen = {} |
1339 self.ui.status("checking manifests\n") | 1346 self.ui.status("checking manifests\n") |
1340 for i in range(self.manifest.count()): | 1347 for i in range(self.manifest.count()): |
1341 n = self.manifest.node(i) | 1348 n = self.manifest.node(i) |
1349 l = self.manifest.linkrev(n) | |
1350 | |
1351 if l < 0 or l >= self.changelog.count(): | |
1352 self.ui.warn("bad manifest link (%d) at revision %d\n" % | |
1353 (l, i)) | |
1354 errors += 1 | |
1355 | |
1356 if n in neededmanifests: | |
1357 del neededmanifests[n] | |
1358 | |
1342 if n in seen: | 1359 if n in seen: |
1343 self.ui.warn("duplicate manifest at revision %d\n" % i) | 1360 self.ui.warn("duplicate manifest at revision %d\n" % i) |
1344 errors += 1 | 1361 errors += 1 |
1345 seen[n] = 1 | 1362 seen[n] = 1 |
1346 | 1363 |
1363 ff = [ l.split('\0') for l in delta.splitlines() ] | 1380 ff = [ l.split('\0') for l in delta.splitlines() ] |
1364 for f, fn in ff: | 1381 for f, fn in ff: |
1365 filenodes.setdefault(f, {})[bin(fn[:40])] = 1 | 1382 filenodes.setdefault(f, {})[bin(fn[:40])] = 1 |
1366 | 1383 |
1367 self.ui.status("crosschecking files in changesets and manifests\n") | 1384 self.ui.status("crosschecking files in changesets and manifests\n") |
1385 | |
1386 for m,c in neededmanifests.items(): | |
1387 self.ui.warn("Changeset %s refers to unknown manifest %s\n" | |
1388 % (m, c)) | |
1389 errors += 1 | |
1390 del neededmanifests | |
1391 | |
1368 for f in filenodes: | 1392 for f in filenodes: |
1369 if f not in filelinkrevs: | 1393 if f not in filelinkrevs: |
1370 self.ui.warn("file %s in manifest but not in changesets\n" % f) | 1394 self.ui.warn("file %s in manifest but not in changesets\n" % f) |
1371 errors += 1 | 1395 errors += 1 |
1372 | 1396 |