validate: check for spurious incoming filelog entries
Accepting those will lead to "mild corruption", correctly reported as
an error by hg verify, but often not a problem in practice.
Enabled when server.validate is switched on.
--- a/mercurial/localrepo.py Thu Jan 17 01:06:00 2013 +0100
+++ b/mercurial/localrepo.py Tue Dec 11 20:13:21 2012 +0100
@@ -2311,6 +2311,9 @@
n = fl.node(new)
if n in needs:
needs.remove(n)
+ else:
+ raise util.Abort(
+ _("received spurious file revlog entry"))
if not needs:
del needfiles[f]
self.ui.progress(_('files'), None)
--- a/tests/test-push-validation.t Thu Jan 17 01:06:00 2013 +0100
+++ b/tests/test-push-validation.t Tue Dec 11 20:13:21 2012 +0100
@@ -18,7 +18,48 @@
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+Test spurious filelog entries:
+
$ cd test-clone
+ $ echo blah >> beta
+ $ cp .hg/store/data/beta.i tmp1
+ $ hg ci -m 2
+ $ cp .hg/store/data/beta.i tmp2
+ $ hg -q rollback
+ $ mv tmp2 .hg/store/data/beta.i
+ $ echo blah >> beta
+ $ hg ci -m '2 (corrupt)'
+
+Expected to fail:
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ beta@1: dddc47b3ba30 not in manifests
+ 2 files, 2 changesets, 4 total revisions
+ 1 integrity errors encountered!
+ (first damaged changeset appears to be 1)
+ [1]
+
+ $ hg push
+ pushing to $TESTTMP/test
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ transaction abort!
+ rollback completed
+ abort: received spurious file revlog entry
+ [255]
+
+ $ hg -q rollback
+ $ mv tmp1 .hg/store/data/beta.i
+ $ echo beta > beta
+
+Test missing filelog entries:
+
$ cp .hg/store/data/beta.i tmp
$ echo blah >> beta
$ hg ci -m '2 (corrupt)'
@@ -37,8 +78,6 @@
(first damaged changeset appears to be 1)
[1]
-Expected to fail:
-
$ hg push
pushing to $TESTTMP/test (glob)
searching for changes