# HG changeset patch # User Patrick Mezard # Date 1343749172 -7200 # Node ID a189d4470a341df1f2dd5749eaeb9e94460cf281 # Parent 7ac5800dbc8fb00964c585805f4d5bce1f97c140 transplant: handle non-empty patches doing nothing (issue2806) If patch.patch() reports patched files when applying a changeset and the following commit says nothing changed, transplant used to abort with a RuntimeError, assuming something went wrong with patching. The mismatch is patch.patch() reports patched files, not changed ones. It could be modified to report changed files but it means duplicating work from status, may be expensive in the case of binary files, and is probably not that useful at API level. For instance, if two patches are applied on the working directory, the outcome may be nothing changed while each call would have returned modified files. The caller would have to call status() itself again. This patch fixes the issue by trusting patching code: if the patch succeeded and commit reports nothing changed, then nothing changed, patch() did not "dropped changes on the floor". diff -r 7ac5800dbc8f -r a189d4470a34 hgext/transplant.py --- a/hgext/transplant.py Sun Jul 29 23:16:20 2012 +0200 +++ b/hgext/transplant.py Tue Jul 31 17:39:32 2012 +0200 @@ -263,9 +263,6 @@ files = set() patch.patch(self.ui, repo, patchfile, files=files, eolmode=None) files = list(files) - if not files: - self.ui.warn(_('%s: empty changeset') % revlog.hex(node)) - return None except Exception, inst: seriespath = os.path.join(self.path, 'series') if os.path.exists(seriespath): @@ -288,14 +285,8 @@ n = repo.commit(message, user, date, extra=extra, match=m, editor=self.editor) if not n: - # Crash here to prevent an unclear crash later, in - # transplants.write(). This can happen if patch.patch() - # does nothing but claims success or if repo.status() fails - # to report changes done by patch.patch(). These both - # appear to be bugs in other parts of Mercurial, but dying - # here, as soon as we can detect the problem, is preferable - # to silently dropping changesets on the floor. - raise RuntimeError('nothing committed after transplant') + self.ui.warn(_('%s: empty changeset') % revlog.hex(node)) + return None if not merge: self.transplants.set(n, node) diff -r 7ac5800dbc8f -r a189d4470a34 tests/test-transplant.t --- a/tests/test-transplant.t Sun Jul 29 23:16:20 2012 +0200 +++ b/tests/test-transplant.t Tue Jul 31 17:39:32 2012 +0200 @@ -603,3 +603,32 @@ applying be9f9b39483f be9f9b39483f transplanted to 9959e51f94d1 $ cd .. + +test transplanting a patch turning into a no-op + + $ hg init binarysource + $ cd binarysource + $ echo a > a + $ hg ci -Am adda a + >>> file('b', 'wb').write('\0b1') + $ hg ci -Am addb b + >>> file('b', 'wb').write('\0b2') + $ hg ci -m changeb b + $ cd .. + + $ hg clone -r0 binarysource binarydest + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd binarydest + $ cp ../binarysource/b b + $ hg ci -Am addb2 b + $ hg transplant -s ../binarysource 2 + searching for changes + applying 7a7d57e15850 + 7a7d57e158501e51588f5fd3288b491cac77e0d8: empty changeset (no-eol) + $ cd .. +