diff -r d7e233df48e6 -r 0bea9db7543b mercurial/bundle2.py --- a/mercurial/bundle2.py Sun Apr 13 16:36:51 2014 -0400 +++ b/mercurial/bundle2.py Fri Apr 11 06:43:01 2014 -0700 @@ -657,3 +657,17 @@ 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()