Emacs uses `hg status -A` in vc-hg-state, which in turn is used in many vc commands (e.g. vc-root-diff). The "-A" option makes mercurial look at all files under the directory, even the ignored ones. If there are a lot of ignored files, this will be very slow.
As an example, I have a repo that's 38MB / 300 files when freshly checked out, and 34GB / 1.2M files when the build finishes (if you're curious, it's a yocto project). Without clearing the disk cache, `hg stat -A > /dev/null` takes 28s; it's far longer if the disk cache isn't warmed up or the output is actually used. `hg status` takes about 90ms.
vg-git-state does not have this problem; currently it behaves like `hg status`, i.e. honoring the ignore rules. There is actually a FIXME comment regarding this functionality, noting that `git ls-files -i -o --exclude-standard` is the equivalent to `hg status -A`; this takes over 400s (I got sick of waiting).
I'm guessing VC has some sort of assumption that vc-x-state will return all files. Maybe the command could bailout after taking too long and use `hg status`. Maybe the command options could be configurable. Personally, I'd prefer just dropping the "-A", because I've never used it and I don't really see why you'd want to get ignored files by default; this is my current solution.
I'm using Emacs 24.5.1. I've tested Emacs 25.1.1 and it still has the issue; though vc-hg-state has changed, it still uses "-A" and is still very slow on my repo.
--
Thanks,
Jonathan Kotta
Hofstadter's Law:
It always takes longer than you expect, even
when you take into account Hofstadter's Law.