So Dan threw us for a loop, which Rich eventually figured out.

Summary of what Dan was seeing:

1. Dan changed usr/src/uts/intel/ip/ip.global-objs.debug64 to remove 
udp_version.  Same story for obj64.  This was in a changeset along his 
own development branch.

2. Dan then committed another changeset on his development branch to 
restore those symbols.

3. Later, when Phil Kirk pushed the Clearview changes, he ALSO removed 
those symbols.

If you do an "hg log -r X" to show any of these three changesets, it 
correctly identifies changes to the appropriate files.

If you do "hg log filepath" to work backwards from the file to the 
changeset, it does NOT identify change number 3.

If you do "hg log -I filepath" to work backwards from the file to the 
changeset, but use a Mercurial pattern instead of an explicit filepath 
(even though you have given the same, explicit path) it DOES correctly 
show all three changes.

What's going on: the manifest for changeset 3, above, is actually 
pointing to the filelog entry for changeset 1, above.  Because the 
versions of the file are exactly identical.  So there is *no* entry in 
the filelog for changeset 3.

It is further likely that this is triggering Mercurial issue 1327, in 
which merge is choosing the wrong ancestor for comparison during the merge.

Which is seriously bad juju: in Dan's case, Mercurial chose an ancestor 
changeset that was NOT IN THE LINEAR HERITAGE OF BOTH CHILD AND PARENT.

The consequences of which may be left as an exercise for the interested 
reader.  Hint: it is impossible to merge correctly under these 
circumstances.  :(

--Mark

Reply via email to