By: Tom Sydney Kerckhove <syd@cs-syd.eu>
Mutation: emit UTF-8 bytes for output instead of forcing the handle encoding The mutation child and the driver render results with non-ASCII status markers (the check/cross marks and box-drawing characters). Writing them through a Text.IO / String path encodes via the handle's locale encoding, so under a C/POSIX locale (a Nix build sandbox) the handle is ASCII and the write crashes with "cannot encode character" and a non-zero exit. The earlier workaround was to hSetEncoding the handles to UTF-8, but that is a global mutable side-effect. Instead, emit UTF-8 bytes directly, so the handle's encoding is irrelevant: use safe-coloured-text's putChunksUtf8With / hPutChunksUtf8With (which write a ByteString builder, no char encoding) everywhere chunks are printed, and encode printOutputSpecForest's lazy Text to UTF-8 and write the bytes. Drop the hSetEncoding calls (in sydTest and the driver) and remove every Data.Text.IO usage (the runners, OptParse, and a UTF-8 file write in the sqitch-postgres test). In a UTF-8 environment the bytes are identical, so there is no change to golden output.