# HG changeset patch # User Kevin Bullock # Date 2013-02-10 23:01:12 # Node ID 8eb3408bf0051615106ca21d33519ad0131b8f60 # Parent 882681bc3166ccaa3c429a208dd72634b7605cb6 import: don't rollback on failed import --exact (issue3616) The checkexact() helper function was calling repo.rollback() from inside an open transaction. In addition to being insane, this is unnecessary because import will release the transaction on an exception. It turns out that this has been broken since the feature was first introduced, first released in v1.0: changeset: 4263:47ba52121433 user: Brendan Cully date: Thu Mar 22 10:44:59 2007 -0700 files: mercurial/commands.py mercurial/patch.py description: Add import --exact. When this option is set, import will apply the patch (which must be generated by export) to the parents specified in the patch, and check that the node produced by the patch matches the node ID in the patch. diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -3812,7 +3812,6 @@ def import_(ui, repo, patch1=None, *patc def checkexact(repo, n, nodeid): if opts.get('exact') and hex(n) != nodeid: - repo.rollback() raise util.Abort(_('patch is damaged or loses information')) def tryone(ui, hunk, parents): diff --git a/tests/test-import-merge.t b/tests/test-import-merge.t --- a/tests/test-import-merge.t +++ b/tests/test-import-merge.t @@ -113,3 +113,41 @@ Test with --bypass and --exact $ hg strip --no-backup tip $ cd .. + +Test that --exact on a bad header doesn't corrupt the repo (issue3616) + + $ hg init repo3 + $ cd repo3 + $ echo a>a + $ hg ci -Aqm0 + $ echo a>>a + $ hg ci -m1 + $ echo a>>a + $ hg ci -m2 + $ echo a>a + $ echo b>>a + $ echo a>>a + $ hg ci -m3 + $ hg export 2 | head -7 > ../a.patch + $ hg export tip | tail -n +8 >> ../a.patch + + $ cd .. + $ hg clone -qr0 repo3 repo3-clone + $ cd repo3-clone + $ hg pull -qr1 ../repo3 + + $ hg import --exact ../a.patch + applying ../a.patch + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + patching file a + Hunk #1 succeeded at 1 with fuzz 1 (offset -1 lines). + transaction abort! + rollback completed + abort: patch is damaged or loses information + [255] + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + 1 files, 2 changesets, 2 total revisions