exchangev2: fetch and apply phases data
Now that the server supports emitting phases data, we can request it
and apply it on the client.
Because we may receive phases-only updates from the server, we no
longer conditionally perform the "changesetdata" command depending
on whether there are revisions to fetch. In the previous wire
protocol, this case would result in us falling back to performing
"listkeys" commands to look up phases, bookmarks, etc data. But
since "changesetdata" is smart enough to handle metadata only
fetches, we can keep things consistent.
It's worth noting that because of the unified approach to changeset
data retrieval, phase handling code in wire proto v2 exchange is
drastically simpler. Contrast with all the code in exchange.py
dealing with all the variations for obtaining phases data.
Differential Revision: https://phab.mercurial-scm.org/D4484
$ addcommit () {
> echo $1 > $1
> hg add $1
> hg commit -d "${2} 0" -m $1
> }
$ commit () {
> hg commit -d "${2} 0" -m $1
> }
$ hg init a
$ cd a
$ addcommit "A" 0
$ addcommit "B" 1
$ echo "C" >> A
$ commit "C" 2
$ hg update -C 0
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo "D" >> A
$ commit "D" 3
created new head
State before the merge
$ hg status
$ hg id
e45016d2b3d3 tip
$ hg summary
parent: 3:e45016d2b3d3 tip
D
branch: default
commit: (clean)
update: 2 new changesets, 2 branch heads (merge)
phases: 4 draft
Testing the abort functionality first in case of conflicts
$ hg merge --abort
abort: no merge in progress
[255]
$ hg merge
merging A
warning: conflicts while merging A! (edit, then use 'hg resolve --mark')
1 files updated, 0 files merged, 0 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
[1]
$ hg merge --abort e4501
abort: cannot specify a node with --abort
[255]
$ hg merge --abort --rev e4501
abort: cannot specify both --rev and --abort
[255]
$ hg merge --abort
aborting the merge, updating back to e45016d2b3d3
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
Checking that we got back in the same state
$ hg status
? A.orig
$ hg id
e45016d2b3d3 tip
$ hg summary
parent: 3:e45016d2b3d3 tip
D
branch: default
commit: 1 unknown (clean)
update: 2 new changesets, 2 branch heads (merge)
phases: 4 draft
Merging a conflict araises
$ hg merge
merging A
warning: conflicts while merging A! (edit, then use 'hg resolve --mark')
1 files updated, 0 files merged, 0 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
[1]
Correct the conflict without marking the file as resolved
$ echo "ABCD" > A
$ hg commit -m "Merged"
abort: unresolved merge conflicts (see 'hg help resolve')
[255]
Mark the conflict as resolved and commit
$ hg resolve -m A
(no more unresolved files)
$ hg commit -m "Merged"
Test that if a file is removed but not marked resolved, the commit still fails
(issue4972)
$ hg up ".^"
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg merge 2
merging A
warning: conflicts while merging A! (edit, then use 'hg resolve --mark')
1 files updated, 0 files merged, 0 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
[1]
$ hg rm --force A
$ hg commit -m merged
abort: unresolved merge conflicts (see 'hg help resolve')
[255]
$ hg resolve -ma
(no more unresolved files)
$ hg commit -m merged
created new head
Testing the abort functionality in case of no conflicts
$ hg update -C 0
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ addcommit "E" 4
created new head
$ hg id
68352a18a7c4 tip
$ hg merge -r 4
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg merge --preview --abort
abort: cannot specify --preview with --abort
[255]
$ hg merge --abort
aborting the merge, updating back to 68352a18a7c4
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg id
68352a18a7c4 tip
$ cd ..