Specify utf-8-sig encoding when reading library source files in
source_stubs so UTF-8 characters are preserved on Windows and leading
BOMs are tolerated.
Reconfigure stdout and stderr streams to UTF-8 with backslashreplace
at the beginning of main, and specify UTF-8 encoding when writing test
fixtures.
A compound statement that is not a conditional, loop or lambda always runs, so its calls are collected like the body's own and its exits stop the scan. An export whose only throw sits in such a block stays a stub and fails a strict audit.
A conditional return, co_return or goto before the throwing call leaves a path that succeeds, so the audit stops collecting calls at it and the export, or a helper it calls, is partial. A guard that throws still leaves every path throwing, so it stays a stub.
The previous check called any stub call inside an #if block partial,
so an export that throws in every #if, #elif and #else alternative was
reported as partial. Each combination of preprocessor branches is now
expanded into its own body, an #if without #else gets an empty
alternative, and the export is a stub when every combination reaches
the throw. More than 256 combinations in one function, or unbalanced
directives, are reported as errors.
A NotImplemented_nid_no_patch call inside an #if, #ifdef or #ifndef block
opened in the export's own body runs only on some hosts, so the export
is partial, not a stub. An export wrapped in a preprocessor block from
outside its body keeps its class.
An export whose body reaches NotImplemented_nid_no_patch on every path,
directly or through a helper that always reaches it, stays a stub. One
that reaches it only under a condition (if, else, loop, switch, ternary,
short-circuit or lambda) is now classified as partial, so implemented
exports with guards for unknown behaviour are no longer counted as stubs.
progress.py and the progress page are unchanged.
report() turned every nonzero exit of git merge-base into "<head> and
<base> have no common ancestor", so a mistyped or unfetched --head, a
tree or a blob was reported as unrelated history and git's own error was
dropped. Now only exit status 1 keeps that message, and any other
failure raises "git merge-base failed: <stderr>" like the merge-tree
call in conflicts(). git merge-base returns 1 when the histories share
no commit and dies with 128 when a revision does not resolve to a
commit. The tool still exits 2 in both cases, and
test_unrelated_histories_are_an_error now also checks that an invalid
head reports git's own merge-base error and not a missing common
ancestor.