head() has visible overhead if there are too many heads (ex. 10k+).
Usually when we only care about draft heads, heads(draft()) is better
since draft() are usually pre-calculated and the revset gets calculated as
draft() - parents(draft()), unrelated to the number of total heads.
Note that head() & draft() and heads(draft()) are not strictly
equivalent (ex, a head with a secret phase) so it's changing the behavior a
bit. The new behavior is probably more desirable - in both smartlog and
backup case, people do want to see/backup the draft head, regardless of
whether it has secret descendants or not.
This makes smartlogrevset take 50ms less:
Before:
148 | smartlogrevset smartlog.py:438 117 \ revs (3 times) localrepo.py:783 116 | mfunc (3 times) revset.py:2202 116 | getset (3 times) revset.py:92 116 | andset (2 times) revset.py:165 116 | getset (4 times) revset.py:92 62 \ andset (2 times) revset.py:165 62 | getset (4 times) revset.py:92 78 \ func (3 times) revset.py:235 49 \ head (2 times) revset.py:1117 49 \ branchmap (4 times) localrepo.py:953 46 \ <genexpr> (16348 times) revset.py:1126 38 | rev (16344 times) changelog.py:353 <<<< too many heads 67 \ branch (2 times) revset.py:465 42 \ wrapper (2 times) localrepo.py:141 42 | revbranchcache (2 times) localrepo.py:959 40 | __init__ branchmap.py:354 12 | read (2 times) vfs.py:78 25 \ branchmap (2 times) localrepo.py:953 25 \ andset revset.py:165 30 \ func (2 times) revset.py:235 30 | notbackedup backupcommands.py:302 52 | _backupheads (2 times) backupcommands.py:389 28 \ _masterrev smartlog.py:426
After:
99 | smartlogrevset smartlog.py:438 69 \ revs (3 times) localrepo.py:783 68 | mfunc (3 times) revset.py:2202 68 | getset (3 times) revset.py:92 68 | andset (2 times) revset.py:165 68 | getset (4 times) revset.py:92 13 | andset revset.py:165 13 | getset (2 times) revset.py:92 27 \ _masterrev smartlog.py:426