[PATCH STABLE] transplant: crash if repo.commit() finds nothing to commit

Greg Ward greg-hg at gerg.ca
Sun Jul 18 20:31:24 CDT 2010


# HG changeset patch
# User Greg Ward <greg-hg at gerg.ca>
# Date 1279502969 14400
# Branch stable
# Node ID c52ccb35e6cbb5414fae0d3857cdf7937ee8b5a1
# Parent  0e789549271d52581c1b37e55d63e5196ad29d7e
transplant: crash if repo.commit() finds nothing to commit
(makes issue2135, issue2264 more obvious, but does nothing to fix
either one)

This seems to happen in two distinct cases:
  * patch.patch() claims success but changes nothing (e.g.
    the transplanted changeset adds an empty file that already
    exists)
  * patch.patch() makes changes, but repo.status() fails to report them

Both of these seem like bugs in other parts of Mercurial, so arguably
it's not transplant's job to detect the failure to commit.  However:
  * detecting the problem as soon as possible is desirable
  * it prevents a more obscure crash later, in transplants.write()
  * there might be other lurking (or future) bugs that cause
    repo.commit() to do nothing

Also, in the case of issue2264 (source changesets silently dropped by
transplant), the only way to spot the problem currently is the crash
in transplants.write().  Failure to transplant a patch should abort
immediately, whether it's user error (patch does not apply) or a
Mercurial bug (e.g. repo.status() failing to report changes).

diff --git a/hgext/transplant.py b/hgext/transplant.py
--- a/hgext/transplant.py
+++ b/hgext/transplant.py
@@ -246,6 +246,15 @@
             m = match.exact(repo.root, '', files)
 
         n = repo.commit(message, user, date, extra=extra, match=m)
+        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')
         if not merge:
             self.transplants.set(n, node)
 


More information about the Mercurial-devel mailing list