[PATCH 4 of 4] changegroup: store source and url in the `hookargs` dict
Augie Fackler
raf at durin42.com
Wed Oct 15 19:39:11 UTC 2014
On Tue, Oct 14, 2014 at 03:58:03PM -0700, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at fb.com>
> # Date 1413270406 25200
> # Tue Oct 14 00:06:46 2014 -0700
> # Node ID d870ea046efb83f55200213e373e3f0a57789b82
> # Parent 56653edfa2e80c7e57617b9ee16a412e89bcb7c4
> changegroup: store source and url in the `hookargs` dict
queued these, thanks
>
> We store the source and url of the current data into `transaction.hookargs` this
> let us inherit it from upper layers that may have created a much wider
> transaction. We have to modify bundle2 at the same time to register the source
> and url in the transaction. We have to do it in the same patch otherwise, the
> `addchangegroup` call would fill these values and the hook calling will crash
> because of the duplicated 'source' and 'url' arguments passed to the hook call.
>
> diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
> --- a/mercurial/changegroup.py
> +++ b/mercurial/changegroup.py
> @@ -600,13 +600,18 @@ def addchangegroup(repo, source, srctype
> cl = repo.changelog
> cl.delayupdate()
> oldheads = cl.heads()
>
> tr = repo.transaction("\n".join([srctype, util.hidepassword(url)]))
> + # The transaction could have been created before and already carry 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)
> try:
> - repo.hook('prechangegroup', throw=True, source=srctype, url=url,
> - **tr.hookargs)
> + repo.hook('prechangegroup', throw=True, **tr.hookargs)
>
> trp = weakref.proxy(tr)
> # pull off the changeset group
> repo.ui.status(_("adding changesets\n"))
> clstart = len(cl)
> @@ -686,12 +691,12 @@ def addchangegroup(repo, source, srctype
>
> if changesets > 0:
> p = lambda: cl.writepending() and repo.root or ""
> if 'node' not in tr.hookargs:
> tr.hookargs['node'] = hex(cl.node(clstart))
> - repo.hook('pretxnchangegroup', throw=True, source=srctype,
> - url=url, pending=p, **tr.hookargs)
> + repo.hook('pretxnchangegroup', throw=True, pending=p,
> + **tr.hookargs)
>
> added = [cl.node(r) for r in xrange(clstart, clend)]
> publishing = repo.ui.configbool('phases', 'publish', True)
> if srctype in ('push', 'serve'):
> # Old servers can not push the boundary themselves.
> @@ -732,17 +737,16 @@ def addchangegroup(repo, source, srctype
> if clstart >= len(repo):
> return
>
> # forcefully update the on-disk branch cache
> repo.ui.debug("updating the branch cache\n")
> - repo.hook("changegroup", source=srctype, url=url,
> - **tr.hookargs)
> + repo.hook("changegroup", **tr.hookargs)
>
> for n in added:
> hookargs = tr.hookargs.copy()
> hookargs['node'] = hex(n)
> - repo.hook("incoming", source=srctype, url=url, **hookargs)
> + repo.hook("incoming", **hookargs)
>
> newheads = [h for h in repo.heads() if h not in oldheads]
> repo.ui.log("incoming",
> "%s incoming changes - new heads: %s\n",
> len(added),
> diff --git a/mercurial/exchange.py b/mercurial/exchange.py
> --- a/mercurial/exchange.py
> +++ b/mercurial/exchange.py
> @@ -1219,19 +1219,20 @@ def unbundle(repo, cg, heads, source, ur
> check_heads(repo, heads, 'uploading changes')
> # push can proceed
> if util.safehasattr(cg, 'params'):
> try:
> tr = repo.transaction('unbundle')
> + tr.hookargs['source'] = source
> + tr.hookargs['url'] = url
> tr.hookargs['bundle2-exp'] = '1'
> r = bundle2.processbundle(repo, cg, lambda: tr).reply
> cl = repo.unfiltered().changelog
> p = cl.writepending() and repo.root or ""
> - repo.hook('b2x-pretransactionclose', throw=True, source=source,
> - url=url, pending=p, **tr.hookargs)
> + repo.hook('b2x-pretransactionclose', throw=True, pending=p,
> + **tr.hookargs)
> tr.close()
> - repo.hook('b2x-transactionclose', source=source, url=url,
> - **tr.hookargs)
> + repo.hook('b2x-transactionclose', **tr.hookargs)
> except Exception, exc:
> exc.duringunbundle2 = True
> raise
> else:
> r = changegroup.addchangegroup(repo, cg, source, url)
> diff --git a/tests/test-bundle2-exchange.t b/tests/test-bundle2-exchange.t
> --- a/tests/test-bundle2-exchange.t
> +++ b/tests/test-bundle2-exchange.t
> @@ -157,11 +157,11 @@ add extra data to test their exchange du
> push
> $ hg -R main push other --rev eea13746799a --bookmark book_eea1
> pushing to other
> searching for changes
> b2x-transactionclose hook: HG_BOOKMARK_MOVED=1 HG_BUNDLE2-EXP=1 HG_NEW_OBSMARKERS=1 HG_PHASES_MOVED=1 HG_SOURCE=push HG_URL=push
> - changegroup hook: HG_BOOKMARK_MOVED=1 HG_BUNDLE2-EXP=1 HG_NEW_OBSMARKERS=1 HG_PHASES_MOVED=1 HG_SOURCE=bundle2 HG_URL=bundle2
> + changegroup hook: HG_BOOKMARK_MOVED=1 HG_BUNDLE2-EXP=1 HG_NEW_OBSMARKERS=1 HG_PHASES_MOVED=1 HG_SOURCE=push HG_URL=push
> remote: adding changesets
> remote: adding manifests
> remote: adding file changes
> remote: added 1 changesets with 0 changes to 0 files (-1 heads)
> remote: 1 new obsolescence markers
> @@ -233,11 +233,11 @@ push over ssh
> remote: adding file changes
> remote: added 1 changesets with 1 changes to 1 files
> remote: 1 new obsolescence markers
> updating bookmark book_5fdd
> remote: b2x-transactionclose hook: HG_BOOKMARK_MOVED=1 HG_BUNDLE2-EXP=1 HG_NEW_OBSMARKERS=1 HG_SOURCE=serve HG_URL=remote:ssh:127.0.0.1
> - remote: changegroup hook: HG_BOOKMARK_MOVED=1 HG_BUNDLE2-EXP=1 HG_NEW_OBSMARKERS=1 HG_SOURCE=bundle2 HG_URL=bundle2
> + remote: changegroup hook: HG_BOOKMARK_MOVED=1 HG_BUNDLE2-EXP=1 HG_NEW_OBSMARKERS=1 HG_SOURCE=serve HG_URL=remote:ssh:127.0.0.1
> $ hg -R other log -G
> o 6:5fddd98957c8 draft Nicolas Dumazet <nicdumz.commits at gmail.com> book_5fdd C
> |
> o 5:42ccdea3bb16 draft Nicolas Dumazet <nicdumz.commits at gmail.com> book_42cc B
> |
> @@ -460,21 +460,21 @@ Doing the actual push: hook abort
> $ hg -R main push other -r e7ec4e813ba6
> pushing to other
> searching for changes
> transaction abort!
> rollback completed
> - changegroup hook: HG_BUNDLE2-EXP=1 HG_NEW_OBSMARKERS=0 HG_SOURCE=bundle2 HG_URL=bundle2
> + changegroup hook: HG_BUNDLE2-EXP=1 HG_NEW_OBSMARKERS=0 HG_SOURCE=push HG_URL=push
> abort: b2x-pretransactionclose.failpush hook exited with status 1
> [255]
>
> $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
> pushing to ssh://user@dummy/other
> searching for changes
> abort: b2x-pretransactionclose.failpush hook exited with status 1
> remote: transaction abort!
> remote: rollback completed
> - remote: changegroup hook: HG_BUNDLE2-EXP=1 HG_NEW_OBSMARKERS=0 HG_SOURCE=bundle2 HG_URL=bundle2
> + remote: changegroup hook: HG_BUNDLE2-EXP=1 HG_NEW_OBSMARKERS=0 HG_SOURCE=serve HG_URL=remote:ssh:127.0.0.1
> [255]
>
> $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
> pushing to http://localhost:$HGPORT2/
> searching for changes
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list