[PATCH STABLE] transplant: crash if repo.commit() finds nothing to commit
Nicolas Dumazet
nicdumz at gmail.com
Thu Jul 22 01:21:16 CDT 2010
On Sun, 18 Jul 2010 21:31:24 -0400
Greg Ward <greg-hg at gerg.ca> wrote:
> # 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)
Looks good to me. Even if it does not correctly fix the issues for now
it prevents silent breakages.
Added a linebreak after the first line, and pushed as 79231258503b.
-Nicolas.
>
> 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)
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
--
Nicolas Dumazet — NicDumZ
More information about the Mercurial-devel
mailing list