# HG changeset patch # User Pierre-Yves David # Date 2014-04-11 13:43:01 # Node ID 0bea9db7543bb15f08275b700d7e5e478cc73e54 # Parent d7e233df48e62d19c1487b2f7c0e38ac4912dcaa bundle2: add a "check:heads" handler This part is intended to hold the same role as the `heads` argument of the unbundle function. The client fill it with the known heads at bundle time and the server will abort if its heads changed. diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py --- a/mercurial/bundle2.py +++ b/mercurial/bundle2.py @@ -657,3 +657,17 @@ def handlechangegroup(op, inpart): ret = int(p['return']) op.records.add('changegroup', {'return': ret}, int(p['in-reply-to'])) +@parthandler('check:heads') +def handlechangegroup(op, inpart): + """check that head of the repo did not change + + This is used to detect a push race when using unbundle. + This replaces the "heads" argument of unbundle.""" + h = inpart.read(20) + heads = [] + while len(h) == 20: + heads.append(h) + h = inpart.read(20) + assert not h + if heads != op.repo.heads(): + raise exchange.PushRaced()