# Changelog 1.15 ## [1.15.1] (2025-02-04) [1.15.1]: https://github.com/crystal-lang/crystal/releases/1.15.1 ### Bugfixes #### stdlib - _(networking)_ Disable directory path redirect when `directory_listing=false` ([#15393], thanks @straight-shoota) - _(runtime)_ **[regression]** abstract `EventLoop::Polling#system_add` invalid signature ([#15380], backported from [#15358], thanks @straight-shoota) - _(system)_ **[regression]** Fix GC `sig_suspend`, `sig_resume` for `gc_none` ([#15382], backported from [#15349], thanks @ysbaddaden) [#15393]: https://github.com/crystal-lang/crystal/pull/15393 [#15380]: https://github.com/crystal-lang/crystal/pull/15380 [#15358]: https://github.com/crystal-lang/crystal/pull/15358 [#15382]: https://github.com/crystal-lang/crystal/pull/15382 [#15349]: https://github.com/crystal-lang/crystal/pull/15349 ### Documentation #### stdlib - _(system)_ Fix code example in `Process::Status#exit_code` docs ([#15381], backported from [#15351], thanks @zw963) [#15381]: https://github.com/crystal-lang/crystal/pull/15381 [#15351]: https://github.com/crystal-lang/crystal/pull/15351 ### Infrastructure - Changelog for 1.15.1 ([#15406], thanks @straight-shoota) - Update distribution-scripts ([#15385], backported from [#15368], thanks @straight-shoota) - Update distribution-scripts ([#15388], thanks @straight-shoota) - _(ci)_ Add build shards to `mingw-w64` workflow ([#15344], thanks @straight-shoota) - _(ci)_ Update shards 0.19.1 ([#15384], backported from [#15366], thanks @straight-shoota) - _(ci)_ Add check for shards binary in `test_dist_linux_on_docker` ([#15394], thanks @straight-shoota) [#15406]: https://github.com/crystal-lang/crystal/pull/15406 [#15385]: https://github.com/crystal-lang/crystal/pull/15385 [#15368]: https://github.com/crystal-lang/crystal/pull/15368 [#15388]: https://github.com/crystal-lang/crystal/pull/15388 [#15344]: https://github.com/crystal-lang/crystal/pull/15344 [#15384]: https://github.com/crystal-lang/crystal/pull/15384 [#15366]: https://github.com/crystal-lang/crystal/pull/15366 [#15394]: https://github.com/crystal-lang/crystal/pull/15394 ## [1.15.0] (2025-01-09) [1.15.0]: https://github.com/crystal-lang/crystal/releases/1.15.0 ### Breaking changes #### lang - Allow constants to start with non-ascii uppercase and titlecase ([#15148], thanks @nanobowers) [#15148]: https://github.com/crystal-lang/crystal/pull/15148 ### Features #### lang - _(macros)_ Crystal `Not` operators do not need parens for stringification ([#15292], thanks @Blacksmoke16) - _(macros)_ Add `MacroIf#is_unless?` AST node method ([#15304], thanks @Blacksmoke16) [#15292]: https://github.com/crystal-lang/crystal/pull/15292 [#15304]: https://github.com/crystal-lang/crystal/pull/15304 #### stdlib - _(collection)_ Add `Iterator(T).empty` ([#15039], thanks @spuun) - _(collection)_ Add `Enumerable#find_value` ([#14893], thanks @jgaskins) - _(concurrency)_ Implement the ARM64 Windows context switch ([#15155], thanks @HertzDevil) - _(concurrency)_ Add optional `name` parameter forward to `WaitGroup#spawn` ([#15189], thanks @spuun) - _(crypto)_ Enable bindings for functions in LibreSSL ([#15177], thanks @straight-shoota) - _(log)_ Add `Log` overloads for logging exceptions without giving a block ([#15257], thanks @lachlan) - _(networking)_ Better handle explicit chunked encoding responses ([#15092], thanks @Blacksmoke16) - _(networking)_ Support OpenSSL on MSYS2 ([#15111], thanks @HertzDevil) - _(networking)_ Add `Socket::Address.from` without `addrlen` ([#15060], thanks @mamantoha) - _(networking)_ Add stringification for `HTTP::Cookie` ([#15240], thanks @straight-shoota) - _(networking)_ Add stringification for `HTTP::Cookies` ([#15246], thanks @straight-shoota) - _(networking)_ Add `HTTP::Cookie#expire` ([#14819], thanks @a-alhusaini) - _(numeric)_ Implement `fast_float` for `String#to_f` ([#15195], thanks @HertzDevil) - _(runtime)_ Support call stacks for MinGW-w64 builds ([#15117], thanks @HertzDevil) - _(runtime)_ Support MSYS2's CLANGARM64 environment on ARM64 Windows ([#15159], thanks @HertzDevil) - _(runtime)_ Improve `Crystal::Tracing` ([#15297], thanks @ysbaddaden) - _(runtime)_ Add `Thread#internal_name=` ([#15298], thanks @ysbaddaden) - _(runtime)_ Add `Thread::LinkedList#each` to safely iterate lists ([#15300], thanks @ysbaddaden) - _(system)_ Add `Process::Status#exit_code?` ([#15247], thanks @straight-shoota) - _(system)_ Add `Process::Status#abnormal_exit?` ([#15266], thanks @straight-shoota) - _(system)_ Improve `Process::Status#to_s` for abnormal exits on Windows ([#15283], thanks @straight-shoota) - _(system)_ Add `Process::Status#exit_signal?` ([#15284], thanks @straight-shoota) - _(system)_ Change `Process::Status#to_s` to hex format on Windows ([#15285], thanks @straight-shoota) - _(system)_ Add `Process::Status#system_exit_status` ([#15296], thanks @straight-shoota) - _(text)_ Add `Regex::CompileOptions::MULTILINE_ONLY` ([#14870], thanks @ralsina) - _(text)_ Add type restrictions to Levenshtein ([#15168], thanks @beta-ziliani) - _(text)_ Add `unit_separator` to `Int#humanize` and `#humanize_bytes` ([#15176], thanks @CTC97) - _(text)_ Add `String#byte_index(Regex)` ([#15248], thanks @Zeljko-Predjeskovic) - _(text)_ Add `Colorize::Object#ansi_escape` ([#15113], thanks @devnote-dev) [#15039]: https://github.com/crystal-lang/crystal/pull/15039 [#14893]: https://github.com/crystal-lang/crystal/pull/14893 [#15155]: https://github.com/crystal-lang/crystal/pull/15155 [#15189]: https://github.com/crystal-lang/crystal/pull/15189 [#15177]: https://github.com/crystal-lang/crystal/pull/15177 [#15257]: https://github.com/crystal-lang/crystal/pull/15257 [#15092]: https://github.com/crystal-lang/crystal/pull/15092 [#15111]: https://github.com/crystal-lang/crystal/pull/15111 [#15060]: https://github.com/crystal-lang/crystal/pull/15060 [#15240]: https://github.com/crystal-lang/crystal/pull/15240 [#15246]: https://github.com/crystal-lang/crystal/pull/15246 [#14819]: https://github.com/crystal-lang/crystal/pull/14819 [#15195]: https://github.com/crystal-lang/crystal/pull/15195 [#15117]: https://github.com/crystal-lang/crystal/pull/15117 [#15159]: https://github.com/crystal-lang/crystal/pull/15159 [#15297]: https://github.com/crystal-lang/crystal/pull/15297 [#15298]: https://github.com/crystal-lang/crystal/pull/15298 [#15300]: https://github.com/crystal-lang/crystal/pull/15300 [#15247]: https://github.com/crystal-lang/crystal/pull/15247 [#15266]: https://github.com/crystal-lang/crystal/pull/15266 [#15283]: https://github.com/crystal-lang/crystal/pull/15283 [#15284]: https://github.com/crystal-lang/crystal/pull/15284 [#15285]: https://github.com/crystal-lang/crystal/pull/15285 [#15296]: https://github.com/crystal-lang/crystal/pull/15296 [#14870]: https://github.com/crystal-lang/crystal/pull/14870 [#15168]: https://github.com/crystal-lang/crystal/pull/15168 [#15176]: https://github.com/crystal-lang/crystal/pull/15176 [#15248]: https://github.com/crystal-lang/crystal/pull/15248 [#15113]: https://github.com/crystal-lang/crystal/pull/15113 #### compiler - Basic MinGW-w64 cross-compilation support ([#15070], [#15219], thanks @HertzDevil, @BlobCodes) - _(cli)_ Support building from a MinGW-w64-based compiler ([#15077], thanks @HertzDevil) - _(codegen)_ Add indirect branch tracking ([#15122], thanks @ysbaddaden) - _(codegen)_ Emit position dependent code for embedded targets ([#15174], thanks @RX14) - _(interpreter)_ Support "long format" DLL import libraries ([#15119], thanks @HertzDevil) - _(interpreter)_ Add `cc`'s search paths to Unix dynamic library loader ([#15127], thanks @HertzDevil) - _(interpreter)_ Basic MinGW-w64-based interpreter support ([#15140], thanks @HertzDevil) - _(parser)_ Add `ECR::Lexer::SyntaxException` with location info ([#15222], thanks @nobodywasishere) [#15070]: https://github.com/crystal-lang/crystal/pull/15070 [#15219]: https://github.com/crystal-lang/crystal/pull/15219 [#15077]: https://github.com/crystal-lang/crystal/pull/15077 [#15122]: https://github.com/crystal-lang/crystal/pull/15122 [#15174]: https://github.com/crystal-lang/crystal/pull/15174 [#15119]: https://github.com/crystal-lang/crystal/pull/15119 [#15127]: https://github.com/crystal-lang/crystal/pull/15127 [#15140]: https://github.com/crystal-lang/crystal/pull/15140 [#15222]: https://github.com/crystal-lang/crystal/pull/15222 #### tools - _(formatter)_ Enable pending formatter features ([#14718], thanks @Blacksmoke16) - _(unreachable)_ Implement `codecov` format for `unreachable` tool ([#15059], thanks @Blacksmoke16) [#14718]: https://github.com/crystal-lang/crystal/pull/14718 [#15059]: https://github.com/crystal-lang/crystal/pull/15059 ### Bugfixes #### lang - _(macros)_ Add location information to more MacroIf related nodes ([#15100], thanks @Blacksmoke16) [#15100]: https://github.com/crystal-lang/crystal/pull/15100 #### stdlib - LibC bindings and std specs on NetBSD 10 ([#15115], thanks @ysbaddaden) - _(files)_ Treat `WinError::ERROR_DIRECTORY` as an error for non-existent files ([#15114], thanks @HertzDevil) - _(files)_ Replace handle atomically in `IO::FileDescriptor#close` on Windows ([#15165], thanks @HertzDevil) - _(llvm)_ Fix `find-llvm-config` to ignore `LLVM_CONFIG`'s escape sequences ([#15076], thanks @HertzDevil) - _(log)_ **[regression]** Fix `Log` to emit with `exception` even if block outputs `nil` ([#15253], thanks @lachlan) - _(macros)_ Avoid identifier naming collision in `getter`, `setter`, and `property` macros ([#15239], thanks @jgaskins) - _(networking)_ **[regression]** Fix `UNIXSocket#receive` ([#15107], thanks @straight-shoota) - _(numeric)_ Fix `Complex#/` edge cases ([#15086], thanks @HertzDevil) - _(numeric)_ Fix `Number#humanize` printing of `(-)Infinity` and `NaN` ([#15090], thanks @lachlan) - _(runtime)_ Fix Deadlock with parallel stop-world/fork calls in MT ([#15096], thanks @ysbaddaden) - _(runtime)_ **[regression]** Protect constant initializers with mutex on Windows ([#15134], thanks @HertzDevil) - _(runtime)_ use `uninitialized LibC::SigsetT` ([#15144], thanks @straight-shoota) - _(runtime)_ Fix static linking when using MinGW-w64 ([#15167], thanks @HertzDevil) - _(runtime)_ register GC callbacks inside `GC.init` ([#15278], thanks @ysbaddaden) - _(runtime)_ Cleanup nodes in `Thread::LinkedList(T)#delete` ([#15295], thanks @ysbaddaden) - _(runtime)_ Make `Crystal::EventLoop#remove(io)` a class method ([#15282], thanks @ysbaddaden) - _(system)_ Raise on abnormal exit in `Process::Status#exit_code` ([#15241], thanks @straight-shoota) - _(system)_ Fix `Process::Status` for unknown signals ([#15280], thanks @straight-shoota) - _(system)_ Fix error handling for `LibC.clock_gettime(CLOCK_MONOTONIC)` calls ([#15309], thanks @compumike) - _(text)_ Fix libiconv build on Windows ([#15095], thanks @HertzDevil) - _(text)_ Change `sprintf "%c"` to support only `Char` and `Int::Primitive` ([#15142], thanks @nanobowers) - _(time)_ Fix proper error handling for early end in `HTTP_DATE` parser ([#15232], thanks @straight-shoota) [#15115]: https://github.com/crystal-lang/crystal/pull/15115 [#15114]: https://github.com/crystal-lang/crystal/pull/15114 [#15165]: https://github.com/crystal-lang/crystal/pull/15165 [#15076]: https://github.com/crystal-lang/crystal/pull/15076 [#15253]: https://github.com/crystal-lang/crystal/pull/15253 [#15239]: https://github.com/crystal-lang/crystal/pull/15239 [#15107]: https://github.com/crystal-lang/crystal/pull/15107 [#15086]: https://github.com/crystal-lang/crystal/pull/15086 [#15090]: https://github.com/crystal-lang/crystal/pull/15090 [#15096]: https://github.com/crystal-lang/crystal/pull/15096 [#15134]: https://github.com/crystal-lang/crystal/pull/15134 [#15144]: https://github.com/crystal-lang/crystal/pull/15144 [#15167]: https://github.com/crystal-lang/crystal/pull/15167 [#15278]: https://github.com/crystal-lang/crystal/pull/15278 [#15295]: https://github.com/crystal-lang/crystal/pull/15295 [#15282]: https://github.com/crystal-lang/crystal/pull/15282 [#15241]: https://github.com/crystal-lang/crystal/pull/15241 [#15280]: https://github.com/crystal-lang/crystal/pull/15280 [#15309]: https://github.com/crystal-lang/crystal/pull/15309 [#15095]: https://github.com/crystal-lang/crystal/pull/15095 [#15142]: https://github.com/crystal-lang/crystal/pull/15142 [#15232]: https://github.com/crystal-lang/crystal/pull/15232 #### compiler - OpenBSD: fix integration and broken specs ([#15118], thanks @ysbaddaden) - _(interpreter)_ setup signal handlers in interpreted code ([#14766], [#15178], thanks @ysbaddaden, @straight-shoota) - _(parser)_ Fix `SyntaxHighlighter` delimiter state ([#15104], thanks @straight-shoota) - _(parser)_ Disallow weird assignments ([#14815], thanks @FnControlOption) [#15118]: https://github.com/crystal-lang/crystal/pull/15118 [#14766]: https://github.com/crystal-lang/crystal/pull/14766 [#15178]: https://github.com/crystal-lang/crystal/pull/15178 [#15104]: https://github.com/crystal-lang/crystal/pull/15104 [#14815]: https://github.com/crystal-lang/crystal/pull/14815 #### tools - Improve man and shell completion for tools ([#15082], thanks @Blacksmoke16) - _(docs-generator)_ Fix first doc comment inside macro yield ([#15050], thanks @RX14) - _(implementations)_ Fix `tool implementations` to handle gracefully a def with missing location ([#15273], thanks @straight-shoota) [#15082]: https://github.com/crystal-lang/crystal/pull/15082 [#15050]: https://github.com/crystal-lang/crystal/pull/15050 [#15273]: https://github.com/crystal-lang/crystal/pull/15273 ### Chores #### stdlib - Fix various typos ([#15080], thanks @kojix2) - _(runtime)_ Make `Enum` an abstract struct ([#15274], thanks @straight-shoota) - _(system)_ **[deprecation]** Deprecate `Process::Status#exit_status` ([#8647], thanks @jwoertink) - _(system)_ Redefine `Process::Status#normal_exit?` on Windows ([#15255], [#15267], thanks @straight-shoota) - _(system)_ **[breaking]** Redefine `Process::Status#signal_exit?` ([#15289], thanks @straight-shoota) [#15080]: https://github.com/crystal-lang/crystal/pull/15080 [#15274]: https://github.com/crystal-lang/crystal/pull/15274 [#8647]: https://github.com/crystal-lang/crystal/pull/8647 [#15255]: https://github.com/crystal-lang/crystal/pull/15255 [#15267]: https://github.com/crystal-lang/crystal/pull/15267 [#15289]: https://github.com/crystal-lang/crystal/pull/15289 #### compiler - _(codegen)_ Link i128 constants internally if possible ([#15217], thanks @BlobCodes) - _(parser)_ Add location to `RegexLiteral` ([#15235], thanks @straight-shoota) [#15217]: https://github.com/crystal-lang/crystal/pull/15217 [#15235]: https://github.com/crystal-lang/crystal/pull/15235 ### Performance #### stdlib - _(collection)_ Optimize `Slice#<=>` and `#==` with reference check ([#15234], thanks @straight-shoota) - _(concurrency)_ Do not over-commit fiber stacks on Windows ([#15037], thanks @HertzDevil) - _(text)_ Pre-compute `String` size after `#chomp()` if possible ([#15153], thanks @HertzDevil) - _(text)_ Optimize `String#rchop?()` ([#15175], thanks @HertzDevil) - _(text)_ Optimize `String#==` taking character size into account ([#15233], thanks @straight-shoota) [#15234]: https://github.com/crystal-lang/crystal/pull/15234 [#15037]: https://github.com/crystal-lang/crystal/pull/15037 [#15153]: https://github.com/crystal-lang/crystal/pull/15153 [#15175]: https://github.com/crystal-lang/crystal/pull/15175 [#15233]: https://github.com/crystal-lang/crystal/pull/15233 #### compiler - _(semantic)_ Inline `ASTNode` bindings dependencies and observers ([#15098], thanks @ggiraldez) [#15098]: https://github.com/crystal-lang/crystal/pull/15098 ### Refactor #### stdlib - Use Win32 heap functions with `-Dgc_none` ([#15173], thanks @HertzDevil) - _(collection)_ Refactor `Enumerable#map` to delegate to `#map_with_index` ([#15210], thanks @straight-shoota) - _(concurrency)_ Drop `Crystal::FiberChannel` ([#15245], thanks @ysbaddaden) - _(runtime)_ Refactor uses of `LibC.dladdr` inside `Exception::CallStack` ([#15108], thanks @HertzDevil) - _(runtime)_ Introduce `Crystal::EventLoop` namespace ([#15226], thanks @ysbaddaden) - _(runtime)_ Change `libevent` event loop to wait forever when blocking ([#15243], thanks @ysbaddaden) - _(runtime)_ Refactor the IOCP event loop (timers, ...) ([#15238], thanks @ysbaddaden) - _(runtime)_ Explicit exit from main ([#15299], thanks @ysbaddaden) - _(serialization)_ Use per-thread libxml2 global state on all platforms ([#15121], thanks @HertzDevil) - _(system)_ Assume `getrandom` on Linux ([#15040], thanks @ysbaddaden) - _(system)_ Refactor Lifetime Event Loop ([#14996], [#15205], [#15206], [#15215], [#15301], thanks @ysbaddaden) - _(system)_ Refactor use of `Process::Status#exit_code` to `#exit_code?` ([#15254], thanks @straight-shoota) - _(system)_ Refactor simplify `Process::Status#exit_reason` on Unix ([#15288], thanks @straight-shoota) [#15173]: https://github.com/crystal-lang/crystal/pull/15173 [#15210]: https://github.com/crystal-lang/crystal/pull/15210 [#15245]: https://github.com/crystal-lang/crystal/pull/15245 [#15108]: https://github.com/crystal-lang/crystal/pull/15108 [#15226]: https://github.com/crystal-lang/crystal/pull/15226 [#15243]: https://github.com/crystal-lang/crystal/pull/15243 [#15238]: https://github.com/crystal-lang/crystal/pull/15238 [#15299]: https://github.com/crystal-lang/crystal/pull/15299 [#15121]: https://github.com/crystal-lang/crystal/pull/15121 [#15040]: https://github.com/crystal-lang/crystal/pull/15040 [#14996]: https://github.com/crystal-lang/crystal/pull/14996 [#15205]: https://github.com/crystal-lang/crystal/pull/15205 [#15206]: https://github.com/crystal-lang/crystal/pull/15206 [#15215]: https://github.com/crystal-lang/crystal/pull/15215 [#15301]: https://github.com/crystal-lang/crystal/pull/15301 [#15254]: https://github.com/crystal-lang/crystal/pull/15254 [#15288]: https://github.com/crystal-lang/crystal/pull/15288 #### compiler - _(semantic)_ Replace uses of `AliasType#types?` by `Type#lookup_name` ([#15068], thanks @straight-shoota) [#15068]: https://github.com/crystal-lang/crystal/pull/15068 ### Documentation #### stdlib - Add docs for lib bindings with supported library versions ([#14900], [#15198], thanks @straight-shoota) - _(concurrency)_ Make `Fiber.timeout` and `.cancel_timeout` nodoc ([#15184], thanks @straight-shoota) - _(concurrency)_ Update example code for `::spawn` with `WaitGroup` ([#15191], thanks @BigBoyBarney) - _(numeric)_ Clarify behavior of `strict` for `String`-to-number conversions ([#15199], thanks @HertzDevil) - _(runtime)_ Make `Box` constructor and `object` getter nodoc ([#15136], thanks @straight-shoota) - _(runtime)_ Fix `EventLoop` docs for `Socket` `read`, `write` ([#15194], thanks @straight-shoota) - _(system)_ Add example for `Dir.glob` ([#15171], thanks @BigBoyBarney) - _(system)_ Adjust definition of `ExitReason::Aborted` ([#15256], thanks @straight-shoota) - _(text)_ Improve docs for `String#rindex!` ([#15132], thanks @BigBoyBarney) - _(text)_ Add note about locale-dependent system error messages ([#15196], thanks @HertzDevil) [#14900]: https://github.com/crystal-lang/crystal/pull/14900 [#15198]: https://github.com/crystal-lang/crystal/pull/15198 [#15184]: https://github.com/crystal-lang/crystal/pull/15184 [#15191]: https://github.com/crystal-lang/crystal/pull/15191 [#15199]: https://github.com/crystal-lang/crystal/pull/15199 [#15136]: https://github.com/crystal-lang/crystal/pull/15136 [#15194]: https://github.com/crystal-lang/crystal/pull/15194 [#15171]: https://github.com/crystal-lang/crystal/pull/15171 [#15256]: https://github.com/crystal-lang/crystal/pull/15256 [#15132]: https://github.com/crystal-lang/crystal/pull/15132 [#15196]: https://github.com/crystal-lang/crystal/pull/15196 ### Specs #### stdlib - Fix failing specs on FreeBSD ([#15093], thanks @ysbaddaden) - Disable specs that break on MinGW-w64 ([#15116], thanks @HertzDevil) - _(networking)_ DragonFlyBSD: std specs fixes + pending ([#15152], thanks @ysbaddaden) - _(networking)_ Close some dangling sockets in specs ([#15163], thanks @HertzDevil) - _(networking)_ Update specs to run with IPv6 support disabled ([#15046], thanks @Blacksmoke16) - _(networking)_ Add specs for invalid special characters in `Cookie` ([#15244], thanks @straight-shoota) - _(system)_ Improve `System::User` specs on Windows ([#15156], thanks @HertzDevil) - _(system)_ Make `cmd.exe` drop `%PROCESSOR_ARCHITECTURE%` in `Process` specs ([#15158], thanks @HertzDevil) - _(system)_ Add specs for signal exit ([#15229], thanks @straight-shoota) [#15093]: https://github.com/crystal-lang/crystal/pull/15093 [#15116]: https://github.com/crystal-lang/crystal/pull/15116 [#15152]: https://github.com/crystal-lang/crystal/pull/15152 [#15163]: https://github.com/crystal-lang/crystal/pull/15163 [#15046]: https://github.com/crystal-lang/crystal/pull/15046 [#15244]: https://github.com/crystal-lang/crystal/pull/15244 [#15156]: https://github.com/crystal-lang/crystal/pull/15156 [#15158]: https://github.com/crystal-lang/crystal/pull/15158 [#15229]: https://github.com/crystal-lang/crystal/pull/15229 #### compiler - _(cli)_ Remove the entire compiler code base from `external_command_spec` ([#15208], thanks @straight-shoota) - _(interpreter)_ **[regression]** Fix `Crystal::Loader.default_search_paths` spec for macOS ([#15135], thanks @HertzDevil) [#15208]: https://github.com/crystal-lang/crystal/pull/15208 [#15135]: https://github.com/crystal-lang/crystal/pull/15135 #### tools - Use empty prelude for compiler tools specs ([#15272], thanks @straight-shoota) - _(docs-generator)_ Allow skipping compiler tool specs that require Git ([#15125], thanks @HertzDevil) [#15272]: https://github.com/crystal-lang/crystal/pull/15272 [#15125]: https://github.com/crystal-lang/crystal/pull/15125 ### Infrastructure - Changelog for 1.15.0 ([#15277], thanks @straight-shoota) - Update previous Crystal release 1.14.0 ([#15071], thanks @straight-shoota) - Fix remove trailing whitespace from CRYSTAL definition ([#15131], thanks @straight-shoota) - Make utilities posix compatible ([#15139], thanks @nanobowers) - Update `shell.nix` to `nixpkgs-24.05` and LLVM 18 ([#14651], thanks @straight-shoota) - Makefile: Allow custom extensions for exports and spec flags ([#15099], thanks @straight-shoota) - Merge changelog entries for fixups with main PR ([#15207], thanks @straight-shoota) - Update link to good first issues ([#15250], thanks @BigBoyBarney) - Update distribution-scripts ([#15291], thanks @straight-shoota) - Bump NOTICE copyright year ([#15318], thanks @straight-shoota) - Merge `release/1.14`@1.14.1 ([#15329], thanks @straight-shoota) - Update distribution-scripts ([#15332], thanks @straight-shoota) - Make `bin/crystal` work on MSYS2 ([#15094], thanks @HertzDevil) - Make `Makefile` work on MSYS2 ([#15102], thanks @HertzDevil) - Support `.exe` file extension in `Makefile` on MSYS2 ([#15123], thanks @HertzDevil) - Support dereferencing symlinks in `make install` ([#15138], thanks @HertzDevil) - _(ci)_ Extract `deploy_api_docs` job into its own Workflow ([#15022], thanks @straight-shoota) - _(ci)_ Remove pin for ancient nix version ([#15150], thanks @straight-shoota) - _(ci)_ Migrate renovate config ([#15151], thanks @renovate) - _(ci)_ Update GH Actions ([#15052], thanks @renovate) - _(ci)_ Update msys2/setup-msys2 action to v2.26.0 ([#15265], thanks @renovate) - _(ci)_ Update shards 0.19.0 ([#15290], thanks @straight-shoota) - _(ci)_ **[security]** Restrict GitHub token permissions of CI workflows ([#15087], thanks @HertzDevil) - _(ci)_ Do not link against `DbgHelp` for MinGW-w64 CI build ([#15160], thanks @HertzDevil) - _(ci)_ Use MSYS2's upstream LLVM version on MinGW-w64 CI ([#15197], thanks @HertzDevil) - _(ci)_ Add CI workflow for cross-compiling Crystal on MSYS2 ([#15110], thanks @HertzDevil) - _(ci)_ Add MinGW-w64 CI workflow for stdlib and compiler specs ([#15124], thanks @HertzDevil) - _(ci)_ Make MinGW-w64 build artifact a full installation ([#15204], thanks @HertzDevil) - _(ci)_ Use official Apt repositories for LLVM CI ([#15103], thanks @HertzDevil) - _(ci)_ Drop LLVM Apt installer script on WebAssembly CI ([#15109], thanks @HertzDevil) - _(ci)_ Run interpreter specs on Windows CI ([#15141], thanks @HertzDevil) [#15277]: https://github.com/crystal-lang/crystal/pull/15277 [#15071]: https://github.com/crystal-lang/crystal/pull/15071 [#15131]: https://github.com/crystal-lang/crystal/pull/15131 [#15139]: https://github.com/crystal-lang/crystal/pull/15139 [#14651]: https://github.com/crystal-lang/crystal/pull/14651 [#15099]: https://github.com/crystal-lang/crystal/pull/15099 [#15207]: https://github.com/crystal-lang/crystal/pull/15207 [#15250]: https://github.com/crystal-lang/crystal/pull/15250 [#15291]: https://github.com/crystal-lang/crystal/pull/15291 [#15318]: https://github.com/crystal-lang/crystal/pull/15318 [#15329]: https://github.com/crystal-lang/crystal/pull/15329 [#15332]: https://github.com/crystal-lang/crystal/pull/15332 [#15094]: https://github.com/crystal-lang/crystal/pull/15094 [#15102]: https://github.com/crystal-lang/crystal/pull/15102 [#15123]: https://github.com/crystal-lang/crystal/pull/15123 [#15138]: https://github.com/crystal-lang/crystal/pull/15138 [#15022]: https://github.com/crystal-lang/crystal/pull/15022 [#15150]: https://github.com/crystal-lang/crystal/pull/15150 [#15151]: https://github.com/crystal-lang/crystal/pull/15151 [#15052]: https://github.com/crystal-lang/crystal/pull/15052 [#15265]: https://github.com/crystal-lang/crystal/pull/15265 [#15290]: https://github.com/crystal-lang/crystal/pull/15290 [#15087]: https://github.com/crystal-lang/crystal/pull/15087 [#15160]: https://github.com/crystal-lang/crystal/pull/15160 [#15197]: https://github.com/crystal-lang/crystal/pull/15197 [#15110]: https://github.com/crystal-lang/crystal/pull/15110 [#15124]: https://github.com/crystal-lang/crystal/pull/15124 [#15204]: https://github.com/crystal-lang/crystal/pull/15204 [#15103]: https://github.com/crystal-lang/crystal/pull/15103 [#15109]: https://github.com/crystal-lang/crystal/pull/15109 [#15141]: https://github.com/crystal-lang/crystal/pull/15141