"Mark J. Nelson" <Mark.J.Nelson at Sun.COM> writes:

> 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.

Not backwards from file -> changeset, that's what 'hg log <file>' is
doing, "the fast path", "the broken path".

Using patterns forces the slow path, which goes forward from
changeset -> file.

> 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