hg evolve command usability problems
Angel Ezquerra
angel.ezquerra at gmail.com
Thu Jan 15 23:24:32 UTC 2015
TL;DR: I tried to use evolve. The experience was... not great.
I have recently had to use the hg evolve command to evolve several
revisions on one of the patch series that I have recently sent to the
list. The series had 6 revisions A-B-C-D-E-F. Only revisions A, C and
E were taken (as A', C' and E' on the mercurial repo). When I pulled
from mercurial's main repo I got A', C' and E', which made A, C and E
obsolete. This also made B, D and F unstable. I supposed that using
evolve to evolve B, D and F would be easy but boy was I wrong! It was
much harder and error prone than I suspected. So this email will try
to explain the problems I faced to see if we can improve things.
Before I start, note that I am aware that perhaps a lot of these
problems are not really problems and are just due to my lack of
understanding of the way evolve works. However, even if that is the
case perhaps this is an indication that there is a UI problem in
addition to a user problem?
The main problem that I've got is that the evolve command is too smart
and too dumb at the same time. It chooses which revision to evolve and
where to move it to. There is very little control over what the
command will do. In fact, since I cannot tell for sure what it will do
in advance I normally do hg evolve --dry-run to see if what it is
going to do makes sense or is what I really want to do (this is
perhaps the first problem).
In addition:
- I updated to A and did hg evolve --dry-run. The command proposed to
evolve D but I was expecting it to evolve B! I had to update to the
parent of A for evolve to propose to evolve B.
- It is not possible to choose where the evolved revision is placed.
If for example you want to rebase the revision to the head of your
branch you must first evolve and then rebase.
- After you evolve, the working directory points to the evolved
revision. If you then do hg evolve again you get a "nothing to evolve"
message! You must update back to where you were before, and then
evolve again, but then the evolve target is not always what you want.
- After I evolved a B (getting B' on top of A') I wanted to evolve D.
But D became D' on top of C', so now I had two new heads, B' and D'. I
realized my mistake (I should have rebased B' on top of C') so I
decided to strip D' to start over. However D was no longer marked as
unstable, just obsolete. So I could not evolve it again.
- I have no idea what would happen if a revision had two unstable
children and I ran hg evolve. Would it evolve both of them? The first
one? Why can't I just choose one of them?
It is hard for me to really explain the problems that I faced. Perhaps
it is a matter of me not really understanding evolve, but I felt as if
the tool were fighting me. It took me way longer to do what I wanted
to do than if I had just used graft, rebase or mq. I think the
changeset evolution concept is very powerful but I find that the
current UI is confusing and hard to use :-(
Also, the fact that you do not directly chose which revision you want
to evolve, seems to make the evolve command very GUI unfriendly.
I think that I would be happier with a more graft or rebase-like UI,
where I could explicitly choose the first unstable revision that I
want to evolve (rather than the revision above which evolve will look
for troubles) and the target.
Sorry for the negative email, but I think this is really confusing and
hard to use.
Angel
More information about the Evolve-testers
mailing list