dirstate-tree: Skip readdir() in `hg status -mard`
When running the status algorithm in a mode where we don’t list unknown
or ignored files, all we care about are files that are listed in the dirstate.
We can there for skip making expensive calls to readdir() to list the contents
of filesystem directories, and instead only run stat() to get the filesystem
state of files listed in the dirstate. (This state may be an error for files
that don’t exist anymore on the filesystem.)
On 16 CPU threads, this reduces the time spent in the `status()` function for
`hg status -mard` on an old snapshot of mozilla-central from ~70ms to ~50ms.
Differential Revision: https://phab.mercurial-scm.org/D10752
#require test-repo
$ . "$TESTDIR/helpers-testrepo.sh"
$ cd "`dirname "$TESTDIR"`"
look for python scripts that do not use /usr/bin/env
$ testrepohg files 'set:grep(r"^#!.*?python") and not grep(r"^#!/usr/bi{1}n/env python") - **/*.t'
[1]
In tests, enforce $PYTHON and *not* /usr/bin/env python or similar:
$ testrepohg files 'set:grep(r"#!.*?python") and **/*.t' \
> -X tests/test-check-execute.t \
> -X tests/test-check-format.t \
> -X tests/test-check-module-imports.t \
> -X tests/test-check-pyflakes.t \
> -X tests/test-check-shbang.t
[1]
The above exclusions are because they're looking for files that
contain Python but don't end in .py - please avoid adding more.
look for shell scripts that do not use /bin/sh
$ testrepohg files 'set:grep(r"^#!.*/bi{1}n/sh") and not grep(r"^#!/bi{1}n/sh")'
[1]