[PATCH 2 of 3 STABLE] changegroup: call 'prechangegroup' hook before setting up write delay
Durham Goode
durham at fb.com
Mon Nov 9 13:13:54 CST 2015
On 11/6/15 10:07 AM, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at fb.com>
> # Date 1446832749 18000
> # Fri Nov 06 12:59:09 2015 -0500
> # Branch stable
> # Node ID b720bb662a3e17cdfac3cc5c90fdd895673ec864
> # Parent 03916de16fe8f511a48b860bf8b7956d79ea8ef9
> # Available At https://urldefense.proofpoint.com/v2/url?u=http-3A__hg.netv6.net_marmoute-2Dwip_mercurial_&d=CwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=nuarHzhP1wi1T9iURRCj1A&m=rnYZCBGjsYVaHYznTww8TS18sR-RU_3WQT5S-Y9gSzU&s=Od6nMDVqvebNfgQ5PgZF3Ns5ryRRfpZIGbSJOM3sQxU&e=
> # hg pull https://urldefense.proofpoint.com/v2/url?u=http-3A__hg.netv6.net_marmoute-2Dwip_mercurial_&d=CwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=nuarHzhP1wi1T9iURRCj1A&m=rnYZCBGjsYVaHYznTww8TS18sR-RU_3WQT5S-Y9gSzU&s=Od6nMDVqvebNfgQ5PgZF3Ns5ryRRfpZIGbSJOM3sQxU&e= -r b720bb662a3e
> changegroup: call 'prechangegroup' hook before setting up write delay
>
> The 'prechangegroup' interfere with 'delayupdate' logic because it trigger the
> one time call of 'changelog._writepending' (see issure4934). There is no reason
> not to call that hook before setting up 'delayupdate' so we move the call a bit
> earlier to avoid interference.
>
> diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
> --- a/mercurial/changegroup.py
> +++ b/mercurial/changegroup.py
> @@ -327,17 +327,17 @@ class cg1unpacker(object):
> # carries source information. In this case we use the top
> # level data. We overwrite the argument because we need to use
> # the top level value (if they exist) in this function.
> srctype = tr.hookargs.setdefault('source', srctype)
> url = tr.hookargs.setdefault('url', url)
> + repo.hook('prechangegroup', throw=True, **tr.hookargs)
>
> - # write changelog data to temp files so concurrent readers will not see
> - # inconsistent view
> + # write changelog data to temp files so concurrent readers will not
> + # see inconsistent view
> cl = repo.changelog
> cl.delayupdate(tr)
> oldheads = cl.heads()
> - repo.hook('prechangegroup', throw=True, **tr.hookargs)
>
I think relying on no hooks being called between delayupdate and the
actual changelog writes is subtle, brittle, and not a good fix for this.
If you want a better fix than what I had, I think we should break the
writepending subscription logic out of delayupdate and put it after the
changelog write.
More information about the Mercurial-devel
mailing list