repomodel, revpanel: improve upon "Not a head revision!" warning
The original motivation was to fix the calculation of what leads to "Not a head revision!" warnings in several places, which were all different and flawed in different ways. When thinking about how to fix them, deeper problems surfaced. The previous code showed "Not a head revision!" on the working directory line in the log, which is actually incorrect, as a working directory, when being committed, always becomes a head, as a freshly created revision trivally can’t have any children. Obviously, the label "Not a head revision!" was meant to refer to the working directory parent instead of the working directory. In addition to being at the wrong place, it also broke down for merges, where there are two working directory parents. E.g. when merging the heads of two differently named branches, it incorrectly showed the warning. Because the working directory pseudo-revision is about what happens when committing, a "Creates new head!" warning makes more sense. The logic for determining whether to show this warning is based on that from the `hg commit` command to determine whether to show "created new head". In the commit widget, it could be argued that the "Not a head revision!" warning was not at the wrong place, as it could refer to the parent(s) above the warning instead of to the working directory. Still, it didn’t quite make sense when merging two parents, where it’s not clear which parent it refers to. Also, the previous calculation used a definition of "head" which doesn’t match Mercurial’s. With this patch, it’s clarified that the commit widget is about the working directory. Therefore the warning and calculation is changed to be the same as in the log widget. These changes also make sense from a usability perspective. The user doesn’t need to be warned that they checked out a revision that is not a head. Instead, the user should be warned against creating a new head, as that is often undesirable. Similarly, instead of showing that the working directory parent is closed, we show if a closed branch head is reopened. Again, we use the same logic as the `hg commit` command. When amending a revision that is not a topological head, there is now a note that it will create orphans. In practice, I found this to be a much more valueable information than whether it creates an additional head. See the added comment for detailed reasoning. A few other places had to be changed to be consistent. One notable exception is the backout dialog, where the warning stayed "Not a head, backout will create a new head!". It already had the advantages of the new warning and it was clear which revision "not a head" refers to. The calculation still had to be fixed. For my taste, the patch is a bit too big. However splitting in into smaller parts would have risked that intermediate states would have even more inconsistencies.
Showing with 43 additions and 29 deletions