diff --git a/README.md b/README.md index 089db0b..4b6d1b7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![CI](https://github.com/amrali-eg/EncodingChecker/actions/workflows/ci.yml/badge.svg)](https://github.com/amrali-eg/EncodingChecker/actions/workflows/ci.yml) -# EncodingChecker v3.14.0 +# EncodingChecker v3.14.1 EncodingChecker is a Windows tool for finding, checking, and safely converting text-file encodings. Use the GUI for everyday work or the command line for repeatable jobs. diff --git a/docs/RELEASE-NOTES-v3.14.1.md b/docs/RELEASE-NOTES-v3.14.1.md new file mode 100644 index 0000000..35cdba3 --- /dev/null +++ b/docs/RELEASE-NOTES-v3.14.1.md @@ -0,0 +1,71 @@ +# EncodingChecker v3.14.1 + +One product fix. Everything else in this release is invisible to anyone running +`EncodingChecker.exe`, and the notes say so rather than padding the list. + +## A constructed include pattern can no longer hang a scan + +`-Include` and `-Exclude` masks are translated to regular expressions. That translation +is unchanged — `*` still becomes `.*`, `?` still becomes `.`, and a mask with no +separator still matches at any directory depth. What changed is how .NET evaluates the +result. + +The old engine could be made to retry an exponential number of alternatives. A mask +carrying twelve separated wildcards, matched against a nonmatching forty-character run of +the separating character, did not finish within three seconds and had to be killed. +Realistic names answered in 0–5 ms throughout. The new engine returns the correct answer +in 0.427 ms, and runs in time proportional to the input, so no mask can stall a scan. + +**Include and exclude results are identical.** An independent differential comparison ran +500 generated masks against 200 generated paths — 100,000 pairs, including directory +separators and the regex-special characters EC escapes — and found no case where the two +engines disagreed. A regression test asserts the engine before exercising the hostile +input, so restoring the old one fails in 9 ms rather than hanging the test run. + +**It is not free.** Measured over 3,937 files, median of five warm runs: 128 ms before, +148 ms after — about 16%, or roughly 5 µs per file, and the same figure for a plain +`*.txt` mask as for `*a*b*.txt`. That is the price of a bounded worst case, and it is +recorded here so nobody has to measure it again. + +Both inputs have to be deliberately hostile for the old behaviour to appear, and the mask +comes from the operator rather than from an untrusted file, which is why the defect was +scored Theoretical. An unbounded runtime was still worth removing for the price of one +option. + +## What else is in this release, and why you will not notice it + +- **The release gate is deterministic.** The GUI smoke suite could select an encoding + from the wrong drop-down, because it searched the whole application for any visible item + with a matching name and two combos hold the same names. It failed once during the + v3.14.0 release and passed on a re-run of the same commit. It now sets the value + directly. This is test machinery; `EncodingChecker.exe` is unaffected. +- **That suite now runs on every pull request**, not only at tag time, so a GUI regression + is found by the change that caused it. +- **Every `.cs` file changed by one byte.** Source files now agree on encoding — UTF-8 + without a byte-order mark, CRLF — with an `.editorconfig` recording the choice. No + compiled behaviour changes; the assembly hash does, because the sources did. +- **The defect ledger and release documentation were rewritten** to be read by a + maintainer rather than decoded, and four claims in them turned out to be untrue and were + corrected. + +## Compatibility + +Nothing changes. Conversion semantics stay at **7**, the plan schema at **6**, the journal +schema at **5**. Plans and journals written by v3.14.0 apply unchanged. Every exit code, +reason code, report column and journal field is what it was, and the set of files any given +`-Include` or `-Exclude` mask selects is unchanged. + +## Verification + +- 756 tests pass, none skipped (was 755); release build with no warnings +- The GUI smoke suite passes all ten phases, against both an ordinary Release build and the + published single-file executable +- The regex fix was mutation-checked: restoring `RegexOptions.Compiled` fails the new test + in 9 ms, on the engine assertion rather than by hanging, and the file restored + byte-identical by SHA-256 +- Phase B now also asserts that the ASCII file receives a verified recovery record. EC + converts ASCII to UTF-8 even though the bytes are identical, and until now nothing + checked that the restore point was written for that case +- `docs/Test-DefectBacklog.ps1` passes at **65 findings — 52 fixed, 9 open** +- **No four-corpus audit was run.** This release changes no detection or conversion policy, + so the checklist does not require one diff --git a/sources/EncodingChecker/Properties/AssemblyInfo.cs b/sources/EncodingChecker/Properties/AssemblyInfo.cs index d4a9f73..2a1bf14 100644 --- a/sources/EncodingChecker/Properties/AssemblyInfo.cs +++ b/sources/EncodingChecker/Properties/AssemblyInfo.cs @@ -41,5 +41,5 @@ // You can specify all the values, or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("3.14.0.0")] -[assembly: AssemblyFileVersion("3.14.0.0")] +[assembly: AssemblyVersion("3.14.1.0")] +[assembly: AssemblyFileVersion("3.14.1.0")]