changeset 18422:f009804e2a43

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.
author Sune Foldager <cryo@cyanite.org>
date Tue, 11 Dec 2012 20:13:21 +0100
parents e8982483f9dc
children 5d6ee2494f63
files mercurial/localrepo.py tests/test-push-validation.t
diffstat 2 files changed, 44 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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