Copy sources are collected during status() rather than after the fact like
in Python, because status() takes a &mut exclusive reference to the dirstate map
(in order to potentially mutate it for directory mtimes) and returns Cow<'_, HgPath>
that borrow the dirstate map.
Even though with Cow only some shared borrows remain, the still extend the same
lifetime of the initial &mut so the dirstate map cannot be borrowed again
to access copy sources after the fact:
https://doc.rust-lang.org/nomicon/lifetime-mismatch.html#limits-of-lifetimes
Additionally, collecting copy sources during the dirstate tree traversal that
status() already does avoids the cost of another traversal or other lookups
(though I haven’t benchmarked that cost).
I swear I had this enum somewhere. Maybe it got removed with the old flat dirstate implementation?