diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -2311,6 +2311,9 @@ class localrepository(object): 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) diff --git a/tests/test-push-validation.t b/tests/test-push-validation.t --- a/tests/test-push-validation.t +++ b/tests/test-push-validation.t @@ -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 @@ Expected to fail: (first damaged changeset appears to be 1) [1] -Expected to fail: - $ hg push pushing to $TESTTMP/test (glob) searching for changes