
h1. Playground For Tests

<%= toc %>


	$ hg init play
	$ cd play

a0:

	$ hg branch a
	marked working directory as branch a
	$ echo a0 >f
	$ hg ci -Am a0
	adding f

b0(a0):

	$ hg branch b
	marked working directory as branch b
	$ echo b0 >f
	$ hg ci -m b0

c0(a0):

	$ hg up a
	1 files updated, 0 files merged, 0 files removed, 0 files unresolved
	$ hg branch c
	marked working directory as branch c
	$ hg ci -m c0
	created new head

d0(b0,c0):

	$ hg branch d
	marked working directory as branch d
	$ hg merge b
	1 files updated, 0 files merged, 0 files removed, 0 files unresolved
	(branch merge, don't forget to commit)
	$ hg ci -m d0

a1(a0):

	$ hg up a
	1 files updated, 0 files merged, 0 files removed, 0 files unresolved
	$ echo a1 >f
	$ hg ci -m a1
	created new head

b1(b0,a1):

	$ hg up b
	1 files updated, 0 files merged, 0 files removed, 0 files unresolved
	$ hg merge a
	merging f
	warning: conflicts during merge.
	merging f failed!
	0 files updated, 0 files merged, 0 files removed, 1 files unresolved
	use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon
	$ echo b1 >f
	$ hg resolve -m f
	$ hg ci -m b1	

c1(c0,a1):

	$ hg up c
	1 files updated, 0 files merged, 0 files removed, 0 files unresolved
	$ hg merge a
	1 files updated, 0 files merged, 0 files removed, 0 files unresolved
	(branch merge, don't forget to commit)
	$ hg ci -m c1	
	created new head

db1(d0,b1):

	$ hg up d
	1 files updated, 0 files merged, 0 files removed, 0 files unresolved
	$ hg merge b
	1 files updated, 0 files merged, 0 files removed, 0 files unresolved
	(branch merge, don't forget to commit)
	$ hg ci -m db1

dc1(db1,c1): Given the graph:

	$ hg glog --template "{rev}: {desc}\n"
	@    7: db1
	|\
	| | o    6: c1
	| | |\
	| o---+  5: b1
	| | | |
	| | | o  4: a1
	| | | |
	o---+ |  3: d0
	|/ / /
	| o /  2: c0
	| |/
	o /  1: b0
	|/
	o  0: a0

the merge of c1 and db1 fails:

	$ hg --debug --verbose merge c
	  searching for copies back to rev 1
	  unmatched files in local:
	   f.orig
	resolving manifests
	 overwrite None partial False
	 ancestor b4e69fc45ebe local 69240ea6fb11+ remote 6d406e6c0aca
	 f: versions differ -> m
	preserving f for resolve of f
	picked tool 'internal:merge' for f (binary False symlink False)
	merging f
	my f@69240ea6fb11+ other f@6d406e6c0aca ancestor f@4aa1222d962c
	warning: conflicts during merge.
	merging f failed!
	0 files updated, 0 files merged, 0 files removed, 1 files unresolved
	use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon

The merge chooses c0 as the ancestor, which has filerev 0 for f (let's call this f0).
We know that:

	* Merge parent c1 has f2.
	* Merge parent db1 has f3.
	* Merge ancestor c0 has f0.
	* Equidistant ancestor a1 has f2.

As is shown by:

	$ hg log --template "{rev}: {desc}\n"
	7: db1
	6: c1
	5: b1
	4: a1
	3: d0
	2: c0
	1: b0
	0: a0
	$ hg debugindex .hg/store/00changelog.i
	   rev    offset  length   base linkrev nodeid       p1           p2
	     0         0      65      0       0 4aa1222d962c 000000000000 000000000000
	     1        65      65      1       1 a1474e8e002f 4aa1222d962c 000000000000
	     2       130      63      2       2 b4e69fc45ebe 4aa1222d962c 000000000000
	     3       193      63      3       3 a56fea5d7996 b4e69fc45ebe a1474e8e002f
	     4       256      65      4       4 09b18e1f60a1 4aa1222d962c 000000000000
	     5       321      65      5       5 2e035c61ecb8 a1474e8e002f 09b18e1f60a1
	     6       386      63      6       6 6d406e6c0aca b4e69fc45ebe 09b18e1f60a1
	     7       449      64      7       7 69240ea6fb11 a56fea5d7996 2e035c61ecb8
	$ hg debugindex .hg/store/data/f.i
	   rev    offset  length   base linkrev nodeid       p1           p2
	     0         0       4      0       0 2b4eb07319bf 000000000000 000000000000
	     1         4       4      1       1 a473a4018ab4 2b4eb07319bf 000000000000
	     2         8       4      2       4 9a38122997b3 2b4eb07319bf 000000000000
	     3        12       4      3       5 0c949a9c87d2 a473a4018ab4 9a38122997b3
	$ hg man -r6 --debug
	9a38122997b3ac97be2a9aa2e556838341fdf2cc 644   f
	$ hg man -r7 --debug
	0c949a9c87d26bf30fd8d79a9315225aba39349e 644   f
	$ hg man -r2 --debug
	2b4eb07319bfa077a40a2f04913659aef0da42da 644   f
	$ hg man -r4 --debug
	9a38122997b3ac97be2a9aa2e556838341fdf2cc 644   f

So picking a1 would have let the merge succeed. But even with c0, we are merging two
revisions of which one is a descendant of the other: f3 has parents f2, f1.

I think in this situation, Hg should just choose the descendant.

