[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