stabilize: improve unstable selection heuristic
Without argument, stabilize was picking the first in:
"unstable() and ((suspended() or obsancestors(::.))::)"
which usually returned the "oldest" unstable revision in parent
predecessors descendants. This revision is interesting because it
usually gives "soft" merges but rebasing it left the working directory
on a remote branch, which was very confusing.
The new heuristic picks an unstable changeset which can be rebased on
top of the parent revision, or on top of one of its descendants
(selected in revision order). This has the advantage of selecting a
revision which can be rebased on the current subtree, and leave the
working directory in a more convenient location.
-----------------------------------------------------
Vocabulary
-----------------------------------------------------
.. note:: all terminology is subject to change
:obsolete marker:
express a relation from 0..n new changesets to 1 old changeset
:obsolete changesets:
non public changeset which are target of a obsolete marker
:unstable changeset:
changeset not obsolete but with obsolete ancestor
:extinct changeset:
obsolete changeset without unstable descendant
:suspended changeset:
obsolete changeset with unstable descendant
:obsolete-parents:
previous versions of a changeset, through a direct obsolete marker.
:obsolete-children:
new versions of a changeset, through a direct obsolete marker.
:obsolete-ancestors:
previous versions of a changeset, through any number of obsolete marker
:obsolete-descendant:
new versions of a changeset, through any number of obsolete marker
:obsolete-diff:
diff between a changeset and it's obsolete parent
:obsolete-tip:
obsolete-descendants which are not obsolete themselves.
:conflicting changeset:
multiple obsolete-tip for an obsolete changeset through diverging obsolete
markers (no changeset split marker)