Mercurial > hg
changeset 34323:6c7aaf59b21e
pull: remove inadequate use of operations records to update stepdone
The 'stepdone' set is design to be a client side mechanism. If the client used
some advanced capabilities to request necessary information (changeset,
obsmarkers, phases, etc). It marks the steps as done to avoid having a less
advanced mechanism issue a duplicated request.
So, the "stepdone.add('phases')" should be the result of a client choice,
because only the client can know it has requested all it needed to request. In
4a08cf1a2cfe this principle was broken because any phase-heads part sent by
the server to the client would declare the phases retrieval complete.
Now that there is an official phases related capability and code associated to
it. We do not need the change in 4a08cf1a2cfe anymore and we can back it out.
This brings back 'stepdone' management for 'phases' in line with the rest of
the code (including other phases handing).
Here is an example of potential misbehavior that 4a08cf1a2cfe introduced:
Imagine a server that pre-computes bundles. The bundles contains a changegroup
part and an (advisory) 'phase-heads' part. When a pull occurs, precomputed
bundled are reused if available. As the phase part is advisory it can be sent
to all clients. However they could be relevant changesets without phase
information. Either because they are already common or because they had no
precomputed bundle for them yet.
If receiving any 'phase-heads' parts disable subsequent phases re-trivial
parts, the client will not request phase data for all relevant changesets. For
example common changesets will not turn public.
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Tue, 26 Sep 2017 15:55:01 +0200 |
parents | 10e162bb9bf5 |
children | e473f482b9b3 |
files | mercurial/bundle2.py mercurial/exchange.py |
diffstat | 2 files changed, 0 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/bundle2.py Sun Sep 24 21:27:18 2017 +0200 +++ b/mercurial/bundle2.py Tue Sep 26 15:55:01 2017 +0200 @@ -1844,7 +1844,6 @@ """apply phases from bundle part to repo""" headsbyphase = phases.binarydecode(inpart) phases.updatephases(op.repo.unfiltered(), op.gettransaction, headsbyphase) - op.records.add('phase-heads', {}) @parthandler('reply:pushkey', ('return', 'in-reply-to')) def handlepushkeyreply(op, inpart):
--- a/mercurial/exchange.py Sun Sep 24 21:27:18 2017 +0200 +++ b/mercurial/exchange.py Tue Sep 26 15:55:01 2017 +0200 @@ -1400,10 +1400,6 @@ if pullop.fetch: pullop.cgresult = bundle2.combinechangegroupresults(op) - # If the bundle had a phase-heads part, then phase exchange is already done - if op.records['phase-heads']: - pullop.stepsdone.add('phases') - # processing phases change for namespace, value in op.records['listkeys']: if namespace == 'phases':