## crystal-lang/crystal — v1.17.1…v1.20.3

_608+ commits._

### Features
- **Add changelog for 1.20.3 (#17110)** (2f93147)
- **Add `HTTP::Headers#to_json` and `#to_yaml` (#16890)** (ae29914)
- **Add io_uring event loop (linux) (#16264)** (1a6ac44)
- **Add `IO::PrefixSuffixBuffer` for capturing truncated streams (#16774)** (88b1aa9)
- **Add `@[Experimental]` annotation to new Process API (#16816)** (001230e)
- **Add arithmetic error reporting for MathInterpreter (#16809)** (c8a32a1)
- **Add `Process.capture` (#16773)** (7b5e7ae)
- **Add short option bundling for `OptionParser` (#16770)** (1883e2d)
- **Refactor code duplication in `Process.new` overloads (#16782)** (413c050)
- **Add `@[TargetFeature]` annotation (#16717)** (ec596cb)
- **Add internal state to `Fiber::ExecutionContext::Parallel::Scheduler` (#16732)** (43cd1c3)
- **Add specs for parsing `MacroVar` syntax inside literals (#16778)** (b39a682)
- **Add `Crystal::Lock` (#16768)** (75dcbce)
- **Add `FileUtils#rm_f` (#12832)** (d2a7100)
- **Add `spec/syntax_spec.cr` (#16749)** (e1bdcb5)
- **Add `Process.run?` (#16738)** (23c5530)
- **Add formatter specs for `ProcNotation` (#16742)** (a854491)
- **Add `Process.run(args)` without `command` (#16739)** (0879b20)
- **Add adaptive scaling to `ExecutionContext::Parallel` (#16719)** (9a07714)
- **Remove invalid `Pointer.new` constructor from API docs (#16734)** (509fe12)
- **Add `compile` spec helper (#16735)** (0a1b374)
- **Add `HTTP::Response#content_type` and `#content_length` as convenient accessors (#16712)** (95d4d93)
- **Add changelogs for older releases (#16698)** (0109a0f)
- **Add parser specs for escaping in delimited literals (#16703)** (8b67c11)
- **Avoid deprecated `Pointer.new(Int)` in `dlfcn` (#16691)** (e9eff00)
- **Add Kernel TLS support to custom `OpenSSL::BIO` (#16646)** (e13f4b3)
- **Add `Process.new` with `args` instead of `command, args` (#16681)** (5ce8048)
- **Add support for `Sec-WebSocket-Protocol` to `HTTP::WebSocketHandler` (#16574)** (5aeb807)
- **Revert "Support short option bundling in `OPtionParser` (#16563)" (#16670)** (a75923d)
- **Add `Sec-WebSocket-Protocol` checks to `HTTP::WebSocket::Protocol` (#16600)** (e3c9991)
- **Support short option bundling in `OPtionParser` (#16563)** (7d6fc2a)
- **Add `IO#read_greedy` (#16535)** (23fd68c)
- **[CI] Add `fail-fast: false` to all matrix strategies (#16656)** (8fa7f90)
- **Support LLVM 22.1 and 23.0 (#16631)** (710d9a5)

### Fixes
- **Fix: add alias vs anchor ratio check to YAML::PullParser (#17109)** (9f4f11d)
- **Fix: add max_nesting to YAML::PullParser (#17107)** (1ef6b60)
- **[Backport release/1.20] Fix: `Range#sample` eventually loses randomness (#16909)** (b18b725)
- **Fix: OpenSSL Kernel TLS support should be opt-in (#16897)** (f6319c2)
- **Fix issues in OpenSSL Kernel TLS (#16888)** (7abb891)
- **Fix: don't parse debug sections from bare threads (#16877)** (43e8580)
- **Fix lexing macro delimiter state inside literals (#16892)** (257ca75)
- **Fix: `record` macro must check against absolute `::Crystal::Version` [fixup #16172] (#16834)** (abd9c55)
- **Fix `blink_fast` reset code in `Colorize` (#16806)** (99137c8)
- **Fix formatter increment `@line` only on write (#16762)** (48dfdcb)
- **Fix sequence_end_event_initialize return type (#16803)** (2e02ad9)
- **Fix PCRE2 FFI type declarations (#16804)** (8283fbd)
- **Fix signedness in GMP FFI bindings (#16799)** (6f0147e)
- **Fix typo in digest.cr (#16808)** (c501794)
- **Fix `Socket::IPAddress` IPv4 address in IPv6 with zone identifier (#16813)** (9d9391d)
- **Fix add missing `Mutex.new(protection:)` [fixup #16737] (#16802)** (4739b57)
- **Fix MIME.parse_media_type invalid character check (#16793)** (07db5b6)
- **Fix changelog script (#16791)** (e3d9fd8)
- **Fix output of `update-changelog.sh` (#16790)** (9c384ac)
- **Fix tuple splat validation (#16787)** (304ff29)
- **Fix race condition in `Process#wait` on Windows (#16766)** (6fbb77f)
- **Fix `Process.new(args)` etc. support `Enumerable(String)` args (#16784)** (88d6055)
- **Fix formatter indent and newlines between expression items (#16769)** (26344bb)
- **Fix track line increment when formatting macro literal only (#16761)** (c7c205d)
- **Fix: return thread to pool after scheduler shutdown [fixup #15885] (#16750)** (725f1e5)
- **Fix formatter `ProcNotation` with parens around argument type (#16753)** (5b5628a)
- **Fix: alias `Mutex::Protection` as `Sync::Type` [fixup #16737] (#16759)** (f4c2f0a)
- **Fix: `Fiber#resumable?` spec must run in concurrent context (#16731)** (b1a5880)
- **Fix decode gzip MTIME as `UInt32` (#16730)** (a206191)
- **Fix: `thread_local` macro exposes `Thread` class in stdlib docs [fixup #16173] (#16714)** (b19ad26)
- **Fix `declare_fun` attribute copy (#16708)** (ffa8dc3)
- **Fix typo in `Link` annotation spec (#16710)** (1c40678)
- **Fix spec for delimiter literals with PCRE1 [fixup #16703] (#16709)** (011faea)
- **Fix: modernize channel specs to avoid parallelism issues (#16704)** (867fe84)
- **Fix: call `xmlFree` for string pointer from `xmlNodeGetContent` (#16688)** (8c15f33)
- **Fix ICE on alias generic instance namespace lookup [fixup #8512] (#16700)** (765f2fa)
- **Fix alignment for fields in packed structs for x86_64 ABI (#16667)** (7b9201f)
- **Fix typo (#16694)** (1d90414)
- **Fix lexing percent literals with `|` delimiter in macro context (#16672)** (5d7d8c5)
- **Fix `Pointer#to_s` with lib typedefs (#16687)** (d059c51)
- **Fix `String#scan` zero-width matches with multibyte characters(#16684)** (63396ab)
- **Fix: `Sync::ConditionVariable` can hang forever (#16677)** (c76e408)
- **Fix: don't terminate thread on Windows/IOCP (#16680)** (9b5a049)
- **Fix constant lookup in ivar initializer blocks (#14827) (#16678)** (7fded65)
- **Fix: must resolve `Errno.value` within `Fiber.syscall(&)` [fixup #15871] (#16679)** (19a1ab3)
- **Fix typos in ELF reader (#16668)** (3380269)
- **Fix remove useless assignment [fixup #16600] (#16671)** (7c07990)
- **Fix `forward_missing_to` in `HTTP::Headers` (#16637)** (a34be1f)
- **Fix `Float#abs` to return `self` (#16655)** (23b1aad)
- **Fix: OpenSSL sockets shouldn't flush on read (#16650)** (37d25b0)
- **Fix `System.cpu_count` to return `Int32` (#16648)** (e6575d2)
- **[CI] Fix lint workflow to use `prek` instead of `pre-commit` (#16653)** (fc467e1)
- **Fix: increase timeout of execution context stress test helper (#16639)** (1161cf3)
- **Fix: race condition in `Process.run` spec (#16638)** (c2d848c)
- **Fix: `Thread.sleep` is invalid when duration is greater or equal to 1 minute (#16629)** (89289f1)

### Backend
- **[CI] Upgrade library dependencies for Windows CI (#17025)** (4185aeb)
- **YAML::PullParser: memoize anchor name (#17108)** (83c8a08)
- **Changelog for 1.20.2 (#16945)** (2482c62)
- **[Backport release/1.20] Simplify `Sync::Mutex#synchronize` proc type constraints (#16937)** (e856b95)
- **Changelog for 1.20.1 (#16898)** (e60210e)
- **[Backport release/1.20] Refactor `Exception::CallStack` for better boundaries (#16896)** (504ba43)
- **Revert "Refactor `Formatter` code for simplification" (#16885)** (f331cb1)
- **Changelog for 1.20.0 (#16751)** (c7d6de7)
- **Merge commit from fork** (c948b31)
- **API docs for TargetFeature annotation [fixup #16717] (#16835)** (171f2c9)
- **Document that reentrant read lock can deadlock (#16833)** (bcee097)
- **Remove redundant `#not_nil!` calls in `OAuth::RequestToken.from_response` [fixup #16634] (#16828)** (f2520de)
- **Merge `release/1.19` into master** (5c11ba3)
- **Update GH Actions (#16800)** (c92f836)
- **Update `devenv.lock` (#16775)** (616ccd5)
- **Sort link ref labels by PR number (#16789)** (3502341)
- **Group PRs with same name (#16788)** (4205e4b)
- **Update GH Actions (#16786)** (792d6a8)
- **Remove unnecessary `shell: true` from `Process.run` calls (#16781)** (c49b590)
- **Replace `Mutex` use cases with `Sync::Mutex` (#16783)** (783d6bc)
- **Standardize `DelimiterState#open_count` to initialize with `0` (#16771)** (4f105e0)
- **Handle events in `EventLoop::IOCP` instead of `System::IOCP` (#16765)** (066c322)
- **Improve formatter spec helper to show trailing whitespace (#16760)** (e80697b)
- **Extract `Formatter#visit_string_interpolation_body` [fixup #16720] (#16747)** (b1a9d35)
- **Update `devenv.lock` (#16673)** (56c63ac)
- **Parse `ProcNotation` with empty arg parenthesis: `() ->` (#16741)** (41ddd6a)
- **Refactor `Formatter` code for simplification (#16745)** (9546b9f)
- **Extract helper methods for formatter string interpolation (#16720)** (a831012)
- **Soft deprecate `Mutex` in favor to `Sync::Mutex` (#16737)** (e2e459d)
- **Disable buggy ameba rule `Lint/SpecFocus` (#16740)** (58704e2)
- **Improve docs for `Fiber::ExecutionContext` (#16602)** (82920b7)
- **Enhance parser specs for escaping delimiters [follow-up #16703] (#16721)** (2f7fa6d)
- **Detect `OAuth` error in payload (#16634)** (6e16ec8)
- **Update cachix/install-nix-action digest to 1ca7d21 (#16727)** (887e660)
- **Remove useless parser delimiter state condition [fixup #16672] (#16716)** (86d7d21)
- **Escape quotes in the filename within the location pragmas (#16549)** (30718d0)
- **Forward API docs for properties in `record` macro (#16172)** (6ab3651)
- **Refactor `assert_syntax_error` to use `expect_raises` (#16711)** (77945b9)
- **Update GH Actions (#16702)** (4b058d6)
- **[CI] Test stdlib with execution contexts on Windows and macOS (#16701)** (d3875e0)
- **[CI] Pin `nixpkgs` in `lint` workflow (#16706)** (cac0296)
- **Update devenv 2.0 (#16705)** (ce6fb18)
- **Prefer modern linker (`mold` or `lld`) (#16696)** (a31ab77)
- **Refactor parsing interpolation (#16693)** (70b7f96)
- **Emit `unreachable` for inlined `NoReturn` returns (#16690)** (f87da51)
- **Update GH Actions (#16660)** (7399a19)
- **Use `FdLock` on all targets (#16569)** (4b3707b)
- **[CI] Run `lint` workflow on all files when `devenv.lock` was changed (#16682)** (526f58a)
- **Use `System.wstr_literal` for env names on Win32 (#16669)** (866b1e8)
- **Rename duplicated "between 64 and 128 bits" case (#16683)** (3f82f81)
- **[CI] Drop separate lint workflows for actionlint and shellcheck (#16663)** (cc871d0)
- **Update `devenv.lock` (#16658)** (f6f24a6)
- **Improve performance of `System::Time.monotonic` on Windows (#16555)** (046f147)
- **Ensure that heredoc lexing allows only valid identifiers (#16548)** (388b48e)
- **Detach execution context scheduler from running thread during blocking syscall (#15871)** (d321df9)
- **Update GH Actions (#16654)** (9cf0528)
- **Refactor initialization of custom OpenSSL BIO (#16651)** (7c514a2)
- **Update `devenv.lock` (#16623)** (5966a65)
- **Refactor OpenSSL::BIO (#16640)** (7aac4ea)
- **Rename filename to path in WASI EventLoop#open (#16636)** (a56eb84)
- **Use `Slice.literal` for `fast_float` when supported, part 2 (#16261)** (5a0b4a6)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/crystal-lang/crystal?utm_source=github-action)._