hg rebase treats obsolete commits differently depending what has
happened to the commit:
- Obsolete commit without non-obsolete successors: Skipped, and a note is printed ("it has no successor").
- Obsolete commit with a successor in the destination (ancestor of it): Skipped, and a note is printed ("already in destination").
- Obsolete commit with a successor in the rebase set: The commit and its descendants are skipped, and a note is printed ("not rebasing <commit> and its descendants as this would cause divergence"), unless allowdivergence config set.
- Obsolete commit with a successor elsewhere: Error ("this rebase will cause divergences"), unless allowdivergence config set.
Before this patch, we did all those checks up front, except for (3),
which was checked later. The later check consisted of two parts: 1)
filtering out of descendants, and 2) conditionally printing message if
the allowdivergence config was not set. This patch makes it so we do
the filtering early.
A consequence of filtering out divergence-causing commits earlier is
that we rebase commits in slightly different order, which has some
impact on tests.