subrepos: prompt on conflicts on update with dirty subrepos
Consider a repository with a single subrepository. The changesets in
the main repository reference the subrepository changesets like this:
m0 -> s0
m1 -> s1
m2 -> s2
Starting from a state (m1, s0), doing 'hg update m2' in the main
repository will yield a conflict: the subrepo is at revision s0 but
the target revision says it should be at revision s2.
Before this change, Mercurial would do (m1, s0) -> (m2, s2) and thus
ignore the conflict between the working copy and the target revision.
With this change, the user is prompted to resolve the conflict by
choosing which revision he wants. This is consistent with 'hg merge',
which also prompts the user when it detects conflicts in the merged
.hgsubstate files.
The prompt looks like this:
$ hg update tip
subrepository sources for my-subrepo differ
use (l)ocal source (
fc627a69481f) or (r)emote source (
12a213df6fa9)?
$ hg init
$ echo foo > foo
$ echo bar > bar
$ hg ci -qAm 'add foo bar'
$ echo foo2 >> foo
$ echo bleh > bar
$ hg ci -m 'change foo bar'
$ hg up -qC 0
$ hg mv foo foo1
$ echo foo1 > foo1
$ hg cat foo >> foo1
$ hg ci -m 'mv foo foo1'
created new head
$ hg merge
merging foo1 and foo to foo1
1 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg debugstate --nodates
n 0 -2 bar
m 644 14 foo1
copy: foo -> foo1
$ hg st -q
M bar
M foo1
Removing foo1 and bar:
$ cp foo1 F
$ cp bar B
$ hg rm -f foo1 bar
$ hg debugstate --nodates
r 0 -2 bar
r 0 -1 foo1
copy: foo -> foo1
$ hg st -qC
R bar
R foo1
Re-adding foo1 and bar:
$ cp F foo1
$ cp B bar
$ hg add -v foo1 bar
adding bar
adding foo1
$ hg debugstate --nodates
n 0 -2 bar
m 644 14 foo1
copy: foo -> foo1
$ hg st -qC
M bar
M foo1
foo
Reverting foo1 and bar:
$ hg revert -vr . foo1 bar
saving current version of bar as bar.orig
reverting bar
saving current version of foo1 as foo1.orig
reverting foo1
$ hg debugstate --nodates
n 0 -2 bar
m 644 14 foo1
copy: foo -> foo1
$ hg st -qC
M bar
M foo1
foo
$ hg diff