fix pull racing with push/commit (
issue1320)
changegroup() has a problem when nodes which does not descend from a node
in <bases> are added to remote after the discovery phase.
If that happens, changegroup() won't send the correct set of nodes, ie.
some nodes will be missing.
To correct it we have to find the set of nodes that both remote and self
have (called <common>), and send all the nodes not in <common>.
This fix has some overhead, in the worst case it will re-send a whole branch.
A proper fix to avoid this overhead might be to change the protocol so that
the <common> nodes are sent (instead of the <bases> of the missing nodes).
# creating 'remote'
# repo not found error
remote: abort: There is no Mercurial repository here (.hg not found)!
abort: no suitable response from remote hg!
# clone remote via stream
streaming all changes
XXX files to transfer, XXX bytes of data
transferred XXX bytes in XXX seconds (XXX XB/sec)
updating working directory
XXX files updated, XXX files merged, XXX files removed, XXX files unresolved
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
2 files, 1 changesets, 2 total revisions
# clone remote via pull
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
# verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
2 files, 1 changesets, 2 total revisions
# empty default pull
default = ssh://user@dummy/remote
pulling from ssh://user@dummy/remote
searching for changes
no changes found
# local change
# updating rc
# find outgoing
comparing with ssh://user@dummy/remote
searching for changes
changeset: 1:572896fe480d
tag: tip
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: add
# find incoming on the remote side
comparing with ssh://user@dummy/local
searching for changes
changeset: 1:572896fe480d
tag: tip
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: add
# push
pushing to ssh://user@dummy/remote
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
# check remote tip
changeset: 1:572896fe480d
tag: tip
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: add
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
2 files, 2 changesets, 3 total revisions
bleah
created new head
# push should succeed even though it has an unexpected response
pushing to ssh://user@dummy/remote
searching for changes
note: unsynced remote changes!
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
remote: KABOOM
changeset: 3:ac7448082955
tag: tip
parent: 1:572896fe480d
user: test
date: Mon Jan 12 13:46:42 1970 +0000
summary: z
changeset: 2:187c6caa0d1e
parent: 0:e34318c26897
user: test
date: Mon Jan 12 13:46:41 1970 +0000
summary: z
Got arguments 1:user@dummy 2:hg -R nonexistent serve --stdio
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
Got arguments 1:user@dummy 2:hg -R local serve --stdio
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
changegroup-in-remote hook: HG_NODE=572896fe480d7581849806ee402175c49cb20037 HG_SOURCE=serve HG_URL=remote:ssh:127.0.0.1
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
changegroup-in-remote hook: HG_NODE=ac7448082955a0b2ff5cb4512c1e061c779bbc79 HG_SOURCE=serve HG_URL=remote:ssh:127.0.0.1