[PATCH STABLE RFC] transplant: abort early if commit finds nothing to commit

Greg Ward greg-hg at gerg.ca
Thu Jul 1 12:33:37 CDT 2010


# HG changeset patch
# User Greg Ward <greg-hg at gerg.ca>
# Date 1278001885 14400
# Branch stable
# Node ID e71642ce17bd129e5a75d558a7f029aab136ddd8
# Parent  b2468fb58b2bbbe5711119437449f253fda68318
transplant: abort early if commit finds nothing to commit
(partially addresses issue2135)

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:
  * aborting as soon as the problem is detected feels right
  * 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, I have seen cases where transplant silently failed to transplant
a patch, and the only way I noticed it was 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,17 @@
             m = match.exact(repo.root, '', files)
 
         n = repo.commit(message, user, date, extra=extra, match=m)
+        if not n:
+            # Aborting here prevents 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, so perhaps
+            # Abort is the wrong exception to use.  But dying here, as
+            # soon as we can detect the problem, seems preferable to
+            # silently putting a bad tuple in the transplants object,
+            # causing it to crash in write().
+            raise util.Abort(_('nothing committed after transplant'))
         if not merge:
             self.transplants.set(n, node)
 


More information about the Mercurial-devel mailing list