From 5e152299c71707ae93f60e1676d4318ca9bfc083 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Thu, 5 Feb 2026 14:40:39 +0100 Subject: [PATCH 01/24] feat(sentry-types): Add `Envelope::into_items` method Add a new method called `into_items` to the `Envelope` type. This method is similar to the existing `items` method, except that it yields owned `EnvelopeItem`s rather than references. Also, refactor a test where we can use this new method to avoid a clone. I intend to use this method elsewhere in the future, that is why I am adding it. --- CHANGELOG.md | 6 ++++++ .../tests/creates_distributed_trace.rs | 6 +++--- sentry-types/src/protocol/envelope.rs | 11 +++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e691db95..c2621cf3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### New Features + +- Added a `Envelope::into_items` method, which returns an iterator over owned [`EnvelopeItem`s](https://docs.rs/sentry/0.46.2/sentry/protocol/enum.EnvelopeItem.html) in the [`Envelope`](https://docs.rs/sentry/0.46.2/sentry/struct.Envelope.html) ([#983](https://github.com/getsentry/sentry-rust/pull/983)). + ## 0.46.2 ### New Features diff --git a/sentry-opentelemetry/tests/creates_distributed_trace.rs b/sentry-opentelemetry/tests/creates_distributed_trace.rs index 369e9ceb3..f0dbf3a0f 100644 --- a/sentry-opentelemetry/tests/creates_distributed_trace.rs +++ b/sentry-opentelemetry/tests/creates_distributed_trace.rs @@ -60,9 +60,9 @@ fn test_creates_distributed_trace() { let mut first_tx = None; let mut second_tx = None; - for envelope in &envelopes { - let tx = match envelope.items().next().unwrap() { - sentry::protocol::EnvelopeItem::Transaction(tx) => tx.clone(), + for envelope in envelopes { + let tx = match envelope.into_items().next().unwrap() { + sentry::protocol::EnvelopeItem::Transaction(tx) => tx, unexpected => panic!("Expected transaction, but got {unexpected:#?}"), }; diff --git a/sentry-types/src/protocol/envelope.rs b/sentry-types/src/protocol/envelope.rs index 3a9bed50d..040ca91ba 100644 --- a/sentry-types/src/protocol/envelope.rs +++ b/sentry-types/src/protocol/envelope.rs @@ -377,6 +377,17 @@ impl Envelope { EnvelopeItemIter { inner } } + /// Consume the Envelope and create an [`Iterator`] over all + /// owned [`EnvelopeItem`]s. + /// + /// Raw envelopes yield an empty iterator. + pub fn into_items(self) -> impl Iterator { + match self.items { + Items::EnvelopeItems(items) => items.into_iter(), + Items::Raw(_) => Default::default(), + } + } + /// Returns the Envelope headers. pub fn headers(&self) -> &EnvelopeHeaders { &self.headers From b04b1d2495d56e893b167ee0cf81e20f1b14e0ec Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Wed, 14 Jan 2026 13:48:32 +0100 Subject: [PATCH 02/24] fix(core): Make HubSwitchGuard !Send to prevent thread corruption HubSwitchGuard manages thread-local hub state but was Send, allowing it to be moved to another thread. When dropped on the wrong thread, it would corrupt that thread's hub state instead of restoring the original thread. To fix this, add PhantomData> to make the guard !Send while keeping it Sync. This prevents the guard from being moved across threads at compile time. Additionally, refactor sentry-tracing to store guards in thread-local storage keyed by span ID instead of in span extensions. This fixes a related bug where multiple threads entering the same span would clobber each other's guards. Fixes #943 Refs RUST-130 Co-Authored-By: Claude --- CHANGELOG.md | 5 +++++ sentry-core/src/hub_impl.rs | 16 ++++++++++++---- sentry-tracing/src/layer.rs | 31 +++++++++++++++++++++---------- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2621cf3d..50045878e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ - Added a `Envelope::into_items` method, which returns an iterator over owned [`EnvelopeItem`s](https://docs.rs/sentry/0.46.2/sentry/protocol/enum.EnvelopeItem.html) in the [`Envelope`](https://docs.rs/sentry/0.46.2/sentry/struct.Envelope.html) ([#983](https://github.com/getsentry/sentry-rust/pull/983)). +### Fixes + +- Fixed thread corruption bug where `HubSwitchGuard` could be dropped on wrong thread ([#957](https://github.com/getsentry/sentry-rust/pull/957)) + - **Breaking change**: `sentry_core::HubSwitchGuard` is now `!Send`, preventing it from being moved across threads. Code that previously sent the guard to another thread will no longer compile. + ## 0.46.2 ### New Features diff --git a/sentry-core/src/hub_impl.rs b/sentry-core/src/hub_impl.rs index 5786daa36..36994fa18 100644 --- a/sentry-core/src/hub_impl.rs +++ b/sentry-core/src/hub_impl.rs @@ -1,5 +1,6 @@ use std::cell::{Cell, UnsafeCell}; -use std::sync::{Arc, LazyLock, PoisonError, RwLock}; +use std::marker::PhantomData; +use std::sync::{Arc, LazyLock, MutexGuard, PoisonError, RwLock}; use std::thread; use crate::Scope; @@ -19,10 +20,14 @@ thread_local! { ); } -/// A Hub switch guard used to temporarily swap -/// active hub in thread local storage. +/// A guard that temporarily swaps the active hub in thread-local storage. +/// +/// This type is `!Send` because it manages thread-local state and must be +/// dropped on the same thread where it was created. pub struct SwitchGuard { inner: Option<(Arc, bool)>, + /// Makes this type `!Send` while keeping it `Sync`. + _not_send: PhantomData>, } impl SwitchGuard { @@ -41,7 +46,10 @@ impl SwitchGuard { let was_process_hub = is_process_hub.replace(false); Some((hub, was_process_hub)) }); - SwitchGuard { inner } + SwitchGuard { + inner, + _not_send: PhantomData, + } } fn swap(&mut self) -> Option> { diff --git a/sentry-tracing/src/layer.rs b/sentry-tracing/src/layer.rs index d02c0496d..72178001b 100644 --- a/sentry-tracing/src/layer.rs +++ b/sentry-tracing/src/layer.rs @@ -1,6 +1,6 @@ use std::borrow::Cow; use std::cell::RefCell; -use std::collections::BTreeMap; +use std::collections::{BTreeMap, HashMap}; use std::sync::Arc; use bitflags::bitflags; @@ -236,7 +236,6 @@ pub(super) struct SentrySpanData { pub(super) sentry_span: TransactionOrSpan, parent_sentry_span: Option, hub: Arc, - hub_switch_guard: Option, } impl Layer for SentryLayer @@ -338,7 +337,6 @@ where sentry_span, parent_sentry_span, hub, - hub_switch_guard: None, }); } @@ -350,12 +348,15 @@ where None => return, }; - let mut extensions = span.extensions_mut(); - if let Some(data) = extensions.get_mut::() { - data.hub_switch_guard = Some(sentry_core::HubSwitchGuard::new(data.hub.clone())); + let extensions = span.extensions(); + if let Some(data) = extensions.get::() { + let guard = sentry_core::HubSwitchGuard::new(data.hub.clone()); + SPAN_GUARDS.with(|guards| { + guards.borrow_mut().insert(id.clone(), guard); + }); data.hub.configure_scope(|scope| { scope.set_span(Some(data.sentry_span.clone())); - }) + }); } } @@ -366,18 +367,24 @@ where None => return, }; - let mut extensions = span.extensions_mut(); - if let Some(data) = extensions.get_mut::() { + let extensions = span.extensions(); + if let Some(data) = extensions.get::() { data.hub.configure_scope(|scope| { scope.set_span(data.parent_sentry_span.clone()); }); - data.hub_switch_guard.take(); } + SPAN_GUARDS.with(|guards| { + guards.borrow_mut().remove(id); + }); } /// When a span gets closed, finish the underlying sentry span, and set back /// its parent as the *current* sentry span. fn on_close(&self, id: span::Id, ctx: Context<'_, S>) { + SPAN_GUARDS.with(|guards| { + guards.borrow_mut().remove(&id); + }); + let span = match ctx.span(&id) { Some(span) => span, None => return, @@ -503,6 +510,10 @@ fn extract_span_data( thread_local! { static VISITOR_BUFFER: RefCell = const { RefCell::new(String::new()) }; + /// Hub switch guards keyed by span ID. Stored in thread-local so guards are + /// always dropped on the same thread where they were created. + static SPAN_GUARDS: RefCell> = + RefCell::new(HashMap::new()); } /// Records all span fields into a `BTreeMap`, reusing a mutable `String` as buffer. From c77642e4615658b05e12b910fc7086eb480f4f2c Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Wed, 28 Jan 2026 13:59:56 +0100 Subject: [PATCH 03/24] style(tracing): import HubSwitchGuard --- pr-findings.md | 24 ++++++++++++++++++++++++ sentry-tracing/src/layer.rs | 6 +++--- 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 pr-findings.md diff --git a/pr-findings.md b/pr-findings.md new file mode 100644 index 000000000..cc1889a3a --- /dev/null +++ b/pr-findings.md @@ -0,0 +1,24 @@ +# PR 957 review findings (updated scope: not targeting #946) + +## PR context +- PR: #957 “fix!(core): Make HubSwitchGuard !Send to prevent thread corruption” (open, base `master`, head `szokeasaurusrex/hubswitchguard`). +- Description says it fixes GitHub issue #943 and Linear RUST-130. +- Commit message still references GitHub issue #946 and Linear RUST-132; those references now appear out of scope and should be removed/updated to match intent. + +## Issue check (in-scope) +### #943 — “HubSwitchGuard should not be Send” (open) +- Repro shows moving a `HubSwitchGuard` across threads corrupts hub state. +- Expected: compile-time error; actual: wrong thread hub is replaced. +- The PR’s `!Send` change in `sentry-core` directly addresses this. + +### RUST-130 (Linear) +- Referenced in PR description; not accessible from GitHub CLI, so I can’t verify details. + +## Are any parts no longer necessary (given #946 is out of scope)? +- The `sentry-tracing` refactor still appears necessary even if #946 is out of scope. Reason: once `HubSwitchGuard` becomes `!Send`, storing it in span extensions (which can be accessed across threads) risks either compile-time Send/Sync issues or runtime drops on the wrong thread. Moving guards to thread-local storage keeps them on the originating thread and avoids making span data `!Send`. +- What does look unnecessary now: the references to #946 / RUST-132 in the commit message and any PR description text implying that fix; those should be removed or adjusted to avoid claiming a second issue as a goal. + +## Files touched (for traceability) +- `CHANGELOG.md`: adds “Unreleased” entry for the breaking change and fix. +- `sentry-core/src/hub_impl.rs`: makes `SwitchGuard`/`HubSwitchGuard` `!Send` using `PhantomData>`. +- `sentry-tracing/src/layer.rs`: removes guard from span extensions; stores it in thread-local map keyed by span ID; removes on exit/close. diff --git a/sentry-tracing/src/layer.rs b/sentry-tracing/src/layer.rs index 72178001b..8c9ddc601 100644 --- a/sentry-tracing/src/layer.rs +++ b/sentry-tracing/src/layer.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use bitflags::bitflags; use sentry_core::protocol::Value; -use sentry_core::{Breadcrumb, TransactionOrSpan}; +use sentry_core::{Breadcrumb, HubSwitchGuard, TransactionOrSpan}; use tracing_core::field::Visit; use tracing_core::{span, Event, Field, Level, Metadata, Subscriber}; use tracing_subscriber::layer::{Context, Layer}; @@ -350,7 +350,7 @@ where let extensions = span.extensions(); if let Some(data) = extensions.get::() { - let guard = sentry_core::HubSwitchGuard::new(data.hub.clone()); + let guard = HubSwitchGuard::new(data.hub.clone()); SPAN_GUARDS.with(|guards| { guards.borrow_mut().insert(id.clone(), guard); }); @@ -512,7 +512,7 @@ thread_local! { static VISITOR_BUFFER: RefCell = const { RefCell::new(String::new()) }; /// Hub switch guards keyed by span ID. Stored in thread-local so guards are /// always dropped on the same thread where they were created. - static SPAN_GUARDS: RefCell> = + static SPAN_GUARDS: RefCell> = RefCell::new(HashMap::new()); } From ab3f7b9318edd11be76890356194fcaa8a798d1a Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Wed, 28 Jan 2026 14:52:48 +0100 Subject: [PATCH 04/24] chore: remove pr-findings doc --- pr-findings.md | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 pr-findings.md diff --git a/pr-findings.md b/pr-findings.md deleted file mode 100644 index cc1889a3a..000000000 --- a/pr-findings.md +++ /dev/null @@ -1,24 +0,0 @@ -# PR 957 review findings (updated scope: not targeting #946) - -## PR context -- PR: #957 “fix!(core): Make HubSwitchGuard !Send to prevent thread corruption” (open, base `master`, head `szokeasaurusrex/hubswitchguard`). -- Description says it fixes GitHub issue #943 and Linear RUST-130. -- Commit message still references GitHub issue #946 and Linear RUST-132; those references now appear out of scope and should be removed/updated to match intent. - -## Issue check (in-scope) -### #943 — “HubSwitchGuard should not be Send” (open) -- Repro shows moving a `HubSwitchGuard` across threads corrupts hub state. -- Expected: compile-time error; actual: wrong thread hub is replaced. -- The PR’s `!Send` change in `sentry-core` directly addresses this. - -### RUST-130 (Linear) -- Referenced in PR description; not accessible from GitHub CLI, so I can’t verify details. - -## Are any parts no longer necessary (given #946 is out of scope)? -- The `sentry-tracing` refactor still appears necessary even if #946 is out of scope. Reason: once `HubSwitchGuard` becomes `!Send`, storing it in span extensions (which can be accessed across threads) risks either compile-time Send/Sync issues or runtime drops on the wrong thread. Moving guards to thread-local storage keeps them on the originating thread and avoids making span data `!Send`. -- What does look unnecessary now: the references to #946 / RUST-132 in the commit message and any PR description text implying that fix; those should be removed or adjusted to avoid claiming a second issue as a goal. - -## Files touched (for traceability) -- `CHANGELOG.md`: adds “Unreleased” entry for the breaking change and fix. -- `sentry-core/src/hub_impl.rs`: makes `SwitchGuard`/`HubSwitchGuard` `!Send` using `PhantomData>`. -- `sentry-tracing/src/layer.rs`: removes guard from span extensions; stores it in thread-local map keyed by span ID; removes on exit/close. From ddf0e1fe9fa460818b56a1073c60ea8309a04d6e Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Fri, 30 Jan 2026 15:04:10 +0100 Subject: [PATCH 05/24] fix(tracing): drop hub guard before span lookup --- sentry-tracing/src/layer.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sentry-tracing/src/layer.rs b/sentry-tracing/src/layer.rs index 8c9ddc601..d722b472b 100644 --- a/sentry-tracing/src/layer.rs +++ b/sentry-tracing/src/layer.rs @@ -362,6 +362,8 @@ where /// Set exited span's parent as *current* sentry span. fn on_exit(&self, id: &span::Id, ctx: Context<'_, S>) { + let _guard = SPAN_GUARDS.with(|guards| guards.borrow_mut().remove(id)); + let span = match ctx.span(id) { Some(span) => span, None => return, @@ -373,9 +375,6 @@ where scope.set_span(data.parent_sentry_span.clone()); }); } - SPAN_GUARDS.with(|guards| { - guards.borrow_mut().remove(id); - }); } /// When a span gets closed, finish the underlying sentry span, and set back From 6169b08253035efbc4107ae554e17813e035be28 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Thu, 5 Feb 2026 14:57:25 +0100 Subject: [PATCH 06/24] fix issue #946 --- sentry-tracing/src/{layer.rs => layer/mod.rs} | 19 +-- sentry-tracing/src/layer/span_guard_stack.rs | 118 ++++++++++++++++++ sentry-tracing/tests/span_cross_thread.rs | 77 ++++++++++++ sentry-tracing/tests/span_reentrancy.rs | 70 +++++++++++ 4 files changed, 276 insertions(+), 8 deletions(-) rename sentry-tracing/src/{layer.rs => layer/mod.rs} (97%) create mode 100644 sentry-tracing/src/layer/span_guard_stack.rs create mode 100644 sentry-tracing/tests/span_cross_thread.rs create mode 100644 sentry-tracing/tests/span_reentrancy.rs diff --git a/sentry-tracing/src/layer.rs b/sentry-tracing/src/layer/mod.rs similarity index 97% rename from sentry-tracing/src/layer.rs rename to sentry-tracing/src/layer/mod.rs index d722b472b..5e9848968 100644 --- a/sentry-tracing/src/layer.rs +++ b/sentry-tracing/src/layer/mod.rs @@ -1,11 +1,11 @@ use std::borrow::Cow; use std::cell::RefCell; -use std::collections::{BTreeMap, HashMap}; +use std::collections::BTreeMap; use std::sync::Arc; use bitflags::bitflags; use sentry_core::protocol::Value; -use sentry_core::{Breadcrumb, HubSwitchGuard, TransactionOrSpan}; +use sentry_core::{Breadcrumb, Hub, HubSwitchGuard, TransactionOrSpan}; use tracing_core::field::Visit; use tracing_core::{span, Event, Field, Level, Metadata, Subscriber}; use tracing_subscriber::layer::{Context, Layer}; @@ -16,6 +16,9 @@ use crate::SENTRY_NAME_FIELD; use crate::SENTRY_OP_FIELD; use crate::SENTRY_TRACE_FIELD; use crate::TAGS_PREFIX; +use span_guard_stack::SpanGuardStack; + +mod span_guard_stack; bitflags! { /// The action that Sentry should perform for a given [`Event`] @@ -350,11 +353,12 @@ where let extensions = span.extensions(); if let Some(data) = extensions.get::() { - let guard = HubSwitchGuard::new(data.hub.clone()); + let hub = Arc::new(Hub::new_from_top(data.hub.clone())); + let guard = HubSwitchGuard::new(hub.clone()); SPAN_GUARDS.with(|guards| { - guards.borrow_mut().insert(id.clone(), guard); + guards.borrow_mut().push(id.clone(), guard); }); - data.hub.configure_scope(|scope| { + hub.configure_scope(|scope| { scope.set_span(Some(data.sentry_span.clone())); }); } @@ -362,7 +366,7 @@ where /// Set exited span's parent as *current* sentry span. fn on_exit(&self, id: &span::Id, ctx: Context<'_, S>) { - let _guard = SPAN_GUARDS.with(|guards| guards.borrow_mut().remove(id)); + let _guard = SPAN_GUARDS.with(|guards| guards.borrow_mut().pop(id.clone())); let span = match ctx.span(id) { Some(span) => span, @@ -511,8 +515,7 @@ thread_local! { static VISITOR_BUFFER: RefCell = const { RefCell::new(String::new()) }; /// Hub switch guards keyed by span ID. Stored in thread-local so guards are /// always dropped on the same thread where they were created. - static SPAN_GUARDS: RefCell> = - RefCell::new(HashMap::new()); + static SPAN_GUARDS: RefCell = RefCell::new(SpanGuardStack::new()); } /// Records all span fields into a `BTreeMap`, reusing a mutable `String` as buffer. diff --git a/sentry-tracing/src/layer/span_guard_stack.rs b/sentry-tracing/src/layer/span_guard_stack.rs new file mode 100644 index 000000000..e18435290 --- /dev/null +++ b/sentry-tracing/src/layer/span_guard_stack.rs @@ -0,0 +1,118 @@ +//! This module contains code for stack-like storage for `HubSwitchGuard`s keyed +//! by tracing span ID. + +use std::collections::hash_map::Entry; +use std::collections::HashMap; + +use sentry_core::HubSwitchGuard; +use tracing_core::span::Id as SpanId; + +/// Holds per-span stacks of `HubSwitchGuard`s to handle span re-entrancy. +/// +/// Each time a span is entered, we should push a new guard onto the stack. +/// When the span exits, we should pop the guard from the stack. +pub(super) struct SpanGuardStack { + /// The map of span IDs to their respective guard stacks. + guards: HashMap>, +} + +impl SpanGuardStack { + /// Creates an empty guard stack map. + pub(super) fn new() -> Self { + Self { + guards: HashMap::new(), + } + } + + /// Pushes a guard for the given span ID, creating the stack if needed. + pub(super) fn push(&mut self, id: SpanId, guard: HubSwitchGuard) { + self.guards.entry(id).or_default().push(guard); + } + + /// Pops the most recent guard for the span ID, removing the stack when empty. + pub(super) fn pop(&mut self, id: SpanId) -> Option { + match self.guards.entry(id) { + Entry::Occupied(mut entry) => { + let stack = entry.get_mut(); + let guard = stack.pop(); + if stack.is_empty() { + entry.remove(); + } + guard + } + Entry::Vacant(_) => None, + } + } + + /// Removes all guards for the span ID without returning them. + /// + /// This function guarantees that the guards are dropped in LIFO order. + /// That way, the hub which was active when the span was first entered + /// will be the one active after this function returns. + /// + /// Typically, remove should only get called once the span is fully + /// exited, so this removal order guarantee is mostly just defensive. + pub(super) fn remove(&mut self, id: &SpanId) { + self.guards + .remove(id) + .into_iter() + .flatten() + .rev() // <- we drop in reverse order + .for_each(drop); + } +} + +#[cfg(test)] +mod tests { + use super::SpanGuardStack; + use sentry_core::{Hub, HubSwitchGuard}; + use std::sync::Arc; + use tracing_core::span::Id as SpanId; + + #[test] + fn pop_is_lifo() { + let initial = Hub::current(); + let hub_a = Arc::new(Hub::new_from_top(initial.clone())); + let hub_b = Arc::new(Hub::new_from_top(hub_a.clone())); + + let mut stack = SpanGuardStack::new(); + let id = SpanId::from_u64(1); + + stack.push(id.clone(), HubSwitchGuard::new(hub_a.clone())); + assert!(Arc::ptr_eq(&Hub::current(), &hub_a)); + + stack.push(id.clone(), HubSwitchGuard::new(hub_b.clone())); + assert!(Arc::ptr_eq(&Hub::current(), &hub_b)); + + drop(stack.pop(id.clone()).expect("guard for hub_b")); + assert!(Arc::ptr_eq(&Hub::current(), &hub_a)); + + drop(stack.pop(id.clone()).expect("guard for hub_a")); + assert!(Arc::ptr_eq(&Hub::current(), &initial)); + + assert!(stack.pop(id).is_none()); + } + + #[test] + fn remove_drops_all_guards_in_lifo_order() { + let initial = Hub::current(); + let hub_a = Arc::new(Hub::new_from_top(initial.clone())); + let hub_b = Arc::new(Hub::new_from_top(hub_a.clone())); + + assert!(!Arc::ptr_eq(&hub_b, &initial)); + assert!(!Arc::ptr_eq(&hub_a, &initial)); + assert!(!Arc::ptr_eq(&hub_a, &hub_b)); + + let mut stack = SpanGuardStack::new(); + let id = SpanId::from_u64(2); + + stack.push(id.clone(), HubSwitchGuard::new(hub_a.clone())); + assert!(Arc::ptr_eq(&Hub::current(), &hub_a)); + + stack.push(id.clone(), HubSwitchGuard::new(hub_b.clone())); + assert!(Arc::ptr_eq(&Hub::current(), &hub_b)); + + stack.remove(&id); + assert!(Arc::ptr_eq(&Hub::current(), &initial)); + } +} diff --git a/sentry-tracing/tests/span_cross_thread.rs b/sentry-tracing/tests/span_cross_thread.rs new file mode 100644 index 000000000..5eaa2cdd3 --- /dev/null +++ b/sentry-tracing/tests/span_cross_thread.rs @@ -0,0 +1,77 @@ +mod shared; + +use sentry::protocol::Context; +use std::thread; +use std::time::Duration; + +#[test] +fn cross_thread_span_entries_share_transaction() { + let transport = shared::init_sentry(1.0); + + let span = tracing::info_span!("foo"); + let span2 = span.clone(); + + let handle1 = thread::spawn(move || { + let _guard = span.enter(); + let _bar_span = tracing::info_span!("bar").entered(); + thread::sleep(Duration::from_millis(100)); + }); + + let handle2 = thread::spawn(move || { + thread::sleep(Duration::from_millis(10)); + let _guard = span2.enter(); + let _baz_span = tracing::info_span!("baz").entered(); + thread::sleep(Duration::from_millis(50)); + }); + + handle1.join().unwrap(); + handle2.join().unwrap(); + + let data = transport.fetch_and_clear_envelopes(); + let transactions: Vec<_> = data + .into_iter() + .flat_map(|envelope| { + envelope + .items() + .filter_map(|item| match item { + sentry::protocol::EnvelopeItem::Transaction(transaction) => { + Some(transaction.clone()) + } + _ => None, + }) + .collect::>() + }) + .collect(); + + assert_eq!( + transactions.len(), + 1, + "expected a single transaction for cross-thread span entries" + ); + + let transaction = &transactions[0]; + assert_eq!(transaction.name.as_deref(), Some("foo")); + + let trace = match transaction + .contexts + .get("trace") + .expect("transaction should include trace context") + { + Context::Trace(trace) => trace, + unexpected => panic!("expected trace context but got {unexpected:?}"), + }; + + let bar_span = transaction + .spans + .iter() + .find(|span| span.description.as_deref() == Some("bar")) + .expect("expected span \"bar\" to be recorded in the transaction"); + let baz_span = transaction + .spans + .iter() + .find(|span| span.description.as_deref() == Some("baz")) + .expect("expected span \"baz\" to be recorded in the transaction"); + + assert_eq!(bar_span.parent_span_id, Some(trace.span_id)); + assert_eq!(baz_span.parent_span_id, Some(trace.span_id)); +} diff --git a/sentry-tracing/tests/span_reentrancy.rs b/sentry-tracing/tests/span_reentrancy.rs new file mode 100644 index 000000000..8fc55aad4 --- /dev/null +++ b/sentry-tracing/tests/span_reentrancy.rs @@ -0,0 +1,70 @@ +use sentry::protocol::EnvelopeItem; + +mod shared; + +/// Ensures re-entering the same span does not corrupt the current tracing state, +/// so subsequent spans are still recorded under a single transaction. +#[test] +fn reentering_span_preserves_parent() { + let transport = shared::init_sentry(1.0); + + { + // Create a span and enter it, then re-enter the same span to simulate + // common async polling behavior where a span can be entered multiple times. + let span_a = tracing::info_span!("a"); + let _enter_a = span_a.enter(); + { + let _reenter_a = span_a.enter(); + } + + // Create another span while the original span is still entered to ensure + // it is recorded on the same transaction rather than starting a new one. + let span_b = tracing::info_span!("b"); + { + let _enter_b = span_b.enter(); + } + } + + let transactions: Vec<_> = transport + .fetch_and_clear_envelopes() + .into_iter() + .flat_map(|envelope| envelope.into_items()) + .filter_map(|item| match item { + EnvelopeItem::Transaction(transaction) => Some(transaction), + _ => None, + }) + .collect(); + + assert_eq!( + transactions.len(), + 1, + "expected a single transaction when reentering a span" + ); + + let transaction = &transactions[0]; + assert_eq!(transaction.name.as_deref(), Some("a")); + + let trace = match transaction + .contexts + .get("trace") + .expect("transaction should include trace context") + { + sentry::protocol::Context::Trace(trace) => trace, + unexpected => panic!("expected trace context but got {unexpected:?}"), + }; + + let b_span = transaction + .spans + .iter() + .find(|span| span.description.as_deref() == Some("b")) + .expect("expected span \"b\" to be recorded in the transaction"); + + assert_eq!(b_span.parent_span_id, Some(trace.span_id)); + assert!( + !transaction + .spans + .iter() + .any(|span| span.description.as_deref() == Some("a")), + "expected the transaction root span not to be duplicated in span list" + ); +} From 4e1c529a2c051ccee2b82340f1d30260dfbdde0c Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Thu, 5 Feb 2026 15:27:26 +0100 Subject: [PATCH 07/24] avoid unneeded clones --- sentry-tracing/src/layer/mod.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/sentry-tracing/src/layer/mod.rs b/sentry-tracing/src/layer/mod.rs index 5e9848968..a130fe4f7 100644 --- a/sentry-tracing/src/layer/mod.rs +++ b/sentry-tracing/src/layer/mod.rs @@ -353,14 +353,17 @@ where let extensions = span.extensions(); if let Some(data) = extensions.get::() { - let hub = Arc::new(Hub::new_from_top(data.hub.clone())); - let guard = HubSwitchGuard::new(hub.clone()); - SPAN_GUARDS.with(|guards| { - guards.borrow_mut().push(id.clone(), guard); - }); + let hub = Arc::new(Hub::new_from_top(&data.hub)); + hub.configure_scope(|scope| { scope.set_span(Some(data.sentry_span.clone())); }); + + let guard = HubSwitchGuard::new(hub); + + SPAN_GUARDS.with(|guards| { + guards.borrow_mut().push(id.clone(), guard); + }); } } From 96bcd82512116506955872f37ef0dd2c3d00bd07 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Thu, 5 Feb 2026 15:44:10 +0100 Subject: [PATCH 08/24] reorganize, add some comments --- sentry-tracing/src/layer/mod.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/sentry-tracing/src/layer/mod.rs b/sentry-tracing/src/layer/mod.rs index a130fe4f7..63b5e7242 100644 --- a/sentry-tracing/src/layer/mod.rs +++ b/sentry-tracing/src/layer/mod.rs @@ -353,6 +353,14 @@ where let extensions = span.extensions(); if let Some(data) = extensions.get::() { + // We fork the hub (based on the hub associated with the span) + // upon entering the span. This prevents data leakage if the span + // is entered and exited multiple times. + // + // Further, Hubs are meant to manage thread-local state, even + // though they can be shared across threads. As the span may being + // entered on a different thread than where it was created, we need + // to use a new hub to avoid altering state on the original thread. let hub = Arc::new(Hub::new_from_top(&data.hub)); hub.configure_scope(|scope| { @@ -369,8 +377,6 @@ where /// Set exited span's parent as *current* sentry span. fn on_exit(&self, id: &span::Id, ctx: Context<'_, S>) { - let _guard = SPAN_GUARDS.with(|guards| guards.borrow_mut().pop(id.clone())); - let span = match ctx.span(id) { Some(span) => span, None => return, @@ -382,11 +388,19 @@ where scope.set_span(data.parent_sentry_span.clone()); }); } + + // Drop the guard to switch back to previous hub + SPAN_GUARDS.with(|guards| guards.borrow_mut().pop(id.clone())); } /// When a span gets closed, finish the underlying sentry span, and set back /// its parent as the *current* sentry span. fn on_close(&self, id: span::Id, ctx: Context<'_, S>) { + // Ensure all remaining Hub guards are dropped, to restore the original + // Hub. + // + // By this point, the span probably should be fully executed, but we should + // still ensure the guard is dropped in case this expectation is violated. SPAN_GUARDS.with(|guards| { guards.borrow_mut().remove(&id); }); From 1f99fe5f9838003aae4211ec4111d6048e7da1df Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Tue, 3 Feb 2026 11:12:57 +0100 Subject: [PATCH 09/24] ref(cargo): Extract common items to workspace --- Cargo.toml | 7 +++++++ sentry-actix/Cargo.toml | 10 +++++----- sentry-anyhow/Cargo.toml | 10 +++++----- sentry-backtrace/Cargo.toml | 10 +++++----- sentry-contexts/Cargo.toml | 10 +++++----- sentry-core/Cargo.toml | 10 +++++----- sentry-debug-images/Cargo.toml | 10 +++++----- sentry-log/Cargo.toml | 10 +++++----- sentry-opentelemetry/Cargo.toml | 10 +++++----- sentry-panic/Cargo.toml | 10 +++++----- sentry-slog/Cargo.toml | 10 +++++----- sentry-tower/Cargo.toml | 10 +++++----- sentry-tracing/Cargo.toml | 10 +++++----- sentry-types/Cargo.toml | 10 +++++----- sentry/Cargo.toml | 10 +++++----- 15 files changed, 77 insertions(+), 70 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1b39197e6..d25815c62 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,3 +16,10 @@ members = [ "sentry-tracing", "sentry-types", ] + +[workspace.package] +authors = ["Sentry "] +repository = "https://github.com/getsentry/sentry-rust" +homepage = "https://sentry.io/welcome/" +edition = "2021" +rust-version = "1.81" diff --git a/sentry-actix/Cargo.toml b/sentry-actix/Cargo.toml index cefed9829..3c8d78a2b 100644 --- a/sentry-actix/Cargo.toml +++ b/sentry-actix/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "sentry-actix" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Sentry integration for actix-web 4. """ -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [features] default = ["release-health"] diff --git a/sentry-anyhow/Cargo.toml b/sentry-anyhow/Cargo.toml index 6ec87e460..19197f8a3 100644 --- a/sentry-anyhow/Cargo.toml +++ b/sentry-anyhow/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "sentry-anyhow" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Sentry integration for anyhow. """ -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [features] default = ["backtrace"] diff --git a/sentry-backtrace/Cargo.toml b/sentry-backtrace/Cargo.toml index 50ee58682..64a8ae50c 100644 --- a/sentry-backtrace/Cargo.toml +++ b/sentry-backtrace/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "sentry-backtrace" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Sentry integration and utilities for dealing with stacktraces. """ -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [dependencies] backtrace = "0.3.44" diff --git a/sentry-contexts/Cargo.toml b/sentry-contexts/Cargo.toml index 7bc7f50bc..75d461944 100644 --- a/sentry-contexts/Cargo.toml +++ b/sentry-contexts/Cargo.toml @@ -1,17 +1,17 @@ [package] name = "sentry-contexts" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Sentry integration for os, device, and rust contexts. """ build = "build.rs" -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [dependencies] sentry-core = { version = "0.46.2", path = "../sentry-core" } diff --git a/sentry-core/Cargo.toml b/sentry-core/Cargo.toml index e2c35ab2f..237a2b72c 100644 --- a/sentry-core/Cargo.toml +++ b/sentry-core/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "sentry-core" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Core Sentry library used for instrumentation and integration development. """ -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [package.metadata.docs.rs] all-features = true diff --git a/sentry-debug-images/Cargo.toml b/sentry-debug-images/Cargo.toml index 441160d79..602ff3f83 100644 --- a/sentry-debug-images/Cargo.toml +++ b/sentry-debug-images/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "sentry-debug-images" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Sentry integration that adds the list of loaded libraries to events. """ -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [dependencies] findshlibs = "=0.10.2" diff --git a/sentry-log/Cargo.toml b/sentry-log/Cargo.toml index afd455efe..1d0e0df6a 100644 --- a/sentry-log/Cargo.toml +++ b/sentry-log/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "sentry-log" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Sentry integration for the log and env_logger crates. """ -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [features] default = [] diff --git a/sentry-opentelemetry/Cargo.toml b/sentry-opentelemetry/Cargo.toml index 5e276e7af..13ec12e2b 100644 --- a/sentry-opentelemetry/Cargo.toml +++ b/sentry-opentelemetry/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "sentry-opentelemetry" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Sentry integration for OpenTelemetry. """ -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [package.metadata.docs.rs] all-features = true diff --git a/sentry-panic/Cargo.toml b/sentry-panic/Cargo.toml index 4b1e4443c..9ab2cb7d8 100644 --- a/sentry-panic/Cargo.toml +++ b/sentry-panic/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "sentry-panic" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Sentry integration for capturing panics. """ -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [dependencies] sentry-core = { version = "0.46.2", path = "../sentry-core", features = ["client"] } diff --git a/sentry-slog/Cargo.toml b/sentry-slog/Cargo.toml index ad1e1c264..a8c01e491 100644 --- a/sentry-slog/Cargo.toml +++ b/sentry-slog/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "sentry-slog" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Sentry integration for the slog crate. """ -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [dependencies] sentry-core = { version = "0.46.2", path = "../sentry-core" } diff --git a/sentry-tower/Cargo.toml b/sentry-tower/Cargo.toml index e4317b1f7..328ac6025 100644 --- a/sentry-tower/Cargo.toml +++ b/sentry-tower/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "sentry-tower" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Sentry integration for tower-based crates. """ -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [package.metadata.docs.rs] all-features = true diff --git a/sentry-tracing/Cargo.toml b/sentry-tracing/Cargo.toml index fe58ace81..f5ba80abf 100644 --- a/sentry-tracing/Cargo.toml +++ b/sentry-tracing/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "sentry-tracing" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Sentry integration for the tracing and tracing-subscriber crates. """ -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [package.metadata.docs.rs] all-features = true diff --git a/sentry-types/Cargo.toml b/sentry-types/Cargo.toml index 978bf7834..d35d863c2 100644 --- a/sentry-types/Cargo.toml +++ b/sentry-types/Cargo.toml @@ -1,17 +1,17 @@ [package] name = "sentry-types" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Common reusable types for implementing the sentry.io protocol. """ keywords = ["sentry", "protocol"] -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } [package.metadata.docs.rs] all-features = true diff --git a/sentry/Cargo.toml b/sentry/Cargo.toml index 526ece475..19076bdb2 100644 --- a/sentry/Cargo.toml +++ b/sentry/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "sentry" version = "0.46.2" -authors = ["Sentry "] +authors = { workspace = true } license = "MIT" readme = "README.md" -repository = "https://github.com/getsentry/sentry-rust" -homepage = "https://sentry.io/welcome/" +repository = { workspace = true } +homepage = { workspace = true } description = """ Sentry (sentry.io) client for Rust. """ -edition = "2021" -rust-version = "1.81" +edition = { workspace = true } +rust-version = { workspace = true } autoexamples = true # To build locally: From 3dccbf35437298bf0305c419c5fd7cd84ab810b1 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Mon, 9 Feb 2026 12:54:49 +0100 Subject: [PATCH 10/24] chore(msrv): Increase MSRV to 1.88 (#970) Bump the MSRV to 1.88 to allow dependency updates (see #968). I do not think this change requires a major version bump, as our [MSRV policy](https://github.com/getsentry/sentry-rust?tab=readme-ov-file#requirements) states we try to support the last six months of Rust versions, and 1.88 is more than six months old. Stacked on #969. --- .github/workflows/ci.yml | 4 ++-- CHANGELOG.md | 4 ++++ Cargo.toml | 2 +- README.md | 2 +- clippy.toml | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4d7c9131b..72ba62e25 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,7 +63,7 @@ jobs: - name: Run tests with nextest run: cargo nextest run --profile ci --all-features --all-targets - + - name: Upload test results to Sentry Prevent if: ${{ !cancelled() && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} uses: getsentry/prevent-action@v0 @@ -76,7 +76,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - rust: [1.81.0] + rust: [1.88.0] name: Check / Test MSRV on ${{ matrix.os }} runs-on: ${{ matrix.os }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 50045878e..c504d91cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ - Log HTTP 413 responses as oversized envelope discards in HTTP transports ([#966](https://github.com/getsentry/sentry-rust/pull/966)) +### Minimum Supported Rust Version + +- Bump minimum supported Rust version to 1.88 ([#970](https://github.com/getsentry/sentry-rust/pull/970)). + ## 0.46.1 ### Improvements diff --git a/Cargo.toml b/Cargo.toml index d25815c62..bb40a26e1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,4 +22,4 @@ authors = ["Sentry "] repository = "https://github.com/getsentry/sentry-rust" homepage = "https://sentry.io/welcome/" edition = "2021" -rust-version = "1.81" +rust-version = "1.88" diff --git a/README.md b/README.md index 160c12fc0..2157e02dd 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ best API and adding new features. We currently only verify this crate against a recent version of Sentry hosted on [sentry.io](https://sentry.io/) but it should work with on-prem Sentry versions 20.6 and later. -The **Minimum Supported Rust Version** is currently at _1.81.0_. +The **Minimum Supported Rust Version** is currently at _1.88.0_. The Sentry crates tries to support a _6 months_ old Rust version at time of release, and the MSRV will be increased in accordance with its dependencies. diff --git a/clippy.toml b/clippy.toml index 5e90250c4..711107cf7 100644 --- a/clippy.toml +++ b/clippy.toml @@ -1 +1 @@ -msrv = "1.81.0" +msrv = "1.88.0" From 972a0ae9eddc4088c8fb894840cb500bfc039539 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Feb 2026 13:06:08 +0000 Subject: [PATCH 11/24] build(deps): bump time from 0.3.41 to 0.3.47 (#984) Bumps [time](https://github.com/time-rs/time) from 0.3.41 to 0.3.47.
Release notes

Sourced from time's releases.

v0.3.47

See the changelog for details.

v0.3.46

See the changelog for details.

v0.3.45

See the changelog for details.

v0.3.44

See the changelog for details.

v0.3.43

See the changelog for details.

v0.3.42

See the changelog for details.

Changelog

Sourced from time's changelog.

0.3.47 [2026-02-05]

Security

  • The possibility of a stack exhaustion denial of service attack when parsing RFC 2822 has been eliminated. Previously, it was possible to craft input that would cause unbounded recursion. Now, the depth of the recursion is tracked, causing an error to be returned if it exceeds a reasonable limit.

    This attack vector requires parsing user-provided input, with any type, using the RFC 2822 format.

Compatibility

  • Attempting to format a value with a well-known format (i.e. RFC 3339, RFC 2822, or ISO 8601) will error at compile time if the type being formatted does not provide sufficient information. This would previously fail at runtime. Similarly, attempting to format a value with ISO 8601 that is only configured for parsing (i.e. Iso8601::PARSING) will error at compile time.

Added

  • Builder methods for format description modifiers, eliminating the need for verbose initialization when done manually.
  • date!(2026-W01-2) is now supported. Previously, a space was required between W and 01.
  • [end] now has a trailing_input modifier which can either be prohibit (the default) or discard. When it is discard, all remaining input is ignored. Note that if there are components after [end], they will still attempt to be parsed, likely resulting in an error.

Changed

  • More performance gains when parsing.

Fixed

  • If manually formatting a value, the number of bytes written was one short for some components. This has been fixed such that the number of bytes written is always correct.
  • The possibility of integer overflow when parsing an owned format description has been effectively eliminated. This would previously wrap when overflow checks were disabled. Instead of storing the depth as u8, it is stored as u32. This would require multiple gigabytes of nested input to overflow, at which point we've got other problems and trivial mitigations are available by downstream users.

0.3.46 [2026-01-23]

Added

  • All possible panics are now documented for the relevant methods.
  • The need to use #[serde(default)] when using custom serde formats is documented. This applies only when deserializing an Option<T>.
  • Duration::nanoseconds_i128 has been made public, mirroring std::time::Duration::from_nanos_u128.

... (truncated)

Commits
  • d5144cd v0.3.47 release
  • f6206b0 Guard against integer overflow in release mode
  • 1c63dc7 Avoid denial of service when parsing Rfc2822
  • 5940df6 Add builder methods to avoid verbose construction
  • 00881a4 Manually format macros everywhere
  • bb723b6 Add trailing_input modifier to end
  • 31c4f8e Permit W12 in date! macro
  • 490a17b Mark error paths in well-known formats as cold
  • 6cb1896 Optimize Rfc2822 parsing
  • 6d264d5 Remove erroneous #[inline(never)] attributes
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=time&package-manager=cargo&previous-version=0.3.41&new-version=0.3.47)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) Fixes #985 Fixes [RUST-148](https://linear.app/getsentry/issue/RUST-148/rustsec-2026-0009-denial-of-service-via-stack-exhaustion) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/getsentry/sentry-rust/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 42 +++++++++++++++++++++++++---------------- sentry-types/Cargo.toml | 2 +- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fa653927f..fb592480d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "actix-codec" @@ -989,9 +989,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", ] @@ -2358,9 +2358,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-traits" @@ -3369,18 +3369,28 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -3652,30 +3662,30 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", diff --git a/sentry-types/Cargo.toml b/sentry-types/Cargo.toml index d35d863c2..e62988a13 100644 --- a/sentry-types/Cargo.toml +++ b/sentry-types/Cargo.toml @@ -27,7 +27,7 @@ rand = "0.9.0" serde = { version = "1.0.104", features = ["derive"] } serde_json = "1.0.46" thiserror = "2.0.12" -time = { version = "0.3.5", features = ["formatting", "parsing"] } +time = { version = "0.3.47", features = ["formatting", "parsing"] } url = { version = "2.1.1", features = ["serde"] } uuid = { version = "1.0.0", features = ["serde"] } From 0b1ab4140bcca5790378c6a74f61bad8b52309ac Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Wed, 11 Feb 2026 18:25:23 +0100 Subject: [PATCH 12/24] ci: Use `cargo test` instead of `nextest` (#986) This reverts commit 750dec01620d77e7f62849b62bcdf20da1faf254, which introduced `cargo nextest` for the Rust stable tests, only (MSRV tests have consistently used `cargo test`). With this change, we also revert the Sentry Prevent upload. Resolves #972 Resolves [RUST-138](https://linear.app/getsentry/issue/RUST-138/replace-nextest-and-sentry-prevent-with-cargo-test) --- .config/nextest.toml | 5 ----- .github/workflows/ci.yml | 15 ++------------- 2 files changed, 2 insertions(+), 18 deletions(-) delete mode 100644 .config/nextest.toml diff --git a/.config/nextest.toml b/.config/nextest.toml deleted file mode 100644 index 6a109e171..000000000 --- a/.config/nextest.toml +++ /dev/null @@ -1,5 +0,0 @@ -[profile.ci] -fail-fast = false - -[profile.ci.junit] -path = "junit.xml" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 72ba62e25..333ff7315 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,8 +50,6 @@ jobs: name: Test using Rust stable on ${{ matrix.os }} runs-on: ${{ matrix.os }} - permissions: - id-token: write # required by `getsentry/prevent-action` steps: - name: Checkout sources @@ -59,17 +57,8 @@ jobs: - uses: Swatinem/rust-cache@v2 - - uses: taiki-e/install-action@nextest - - - name: Run tests with nextest - run: cargo nextest run --profile ci --all-features --all-targets - - - name: Upload test results to Sentry Prevent - if: ${{ !cancelled() && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} - uses: getsentry/prevent-action@v0 - with: - files: target/nextest/ci/junit.xml - disable_search: true + - name: Run cargo test + run: cargo test --workspace --all-features --all-targets MSRV: strategy: From 86c2d440ae2ae62a82dc1c7e638174a2f61e15ee Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Thu, 12 Feb 2026 12:43:06 +0100 Subject: [PATCH 13/24] ci: Replace make targets and remove Makefile (#987) Replace CI make invocations with explicit cargo commands to make workflow behavior easier to read directly in the CI config. Remove the root Makefile to avoid maintaining a separate command layer in addition to the workflow definitions. Closes GH-973 Closes [RUST-139](https://linear.app/getsentry/issue/RUST-139/delete-the-makefile-and-remove-references) --- .github/workflows/ci.yml | 55 +++++++++++++++++++++-- Makefile | 94 ---------------------------------------- 2 files changed, 52 insertions(+), 97 deletions(-) delete mode 100644 Makefile diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 333ff7315..2c13073b2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,7 +40,45 @@ jobs: - uses: Swatinem/rust-cache@v2 - - run: make checkall + - name: Check all features + run: cargo check --all-features + env: + RUSTFLAGS: -Dwarnings + + - name: Check sentry-core without default features + run: cargo check --no-default-features + working-directory: sentry-core + env: + RUSTFLAGS: -Dwarnings + + - name: Check default features + run: cargo check + env: + RUSTFLAGS: -Dwarnings + + - name: Check sentry panic feature without defaults + run: cargo check --no-default-features --features panic + working-directory: sentry + env: + RUSTFLAGS: -Dwarnings + + - name: Check sentry curl feature + run: cargo check --features curl + working-directory: sentry + env: + RUSTFLAGS: -Dwarnings + + - name: Check sentry curl+panic without defaults + run: cargo check --no-default-features --features curl,panic + working-directory: sentry + env: + RUSTFLAGS: -Dwarnings + + - name: Check sentry-actix + run: cargo check + working-directory: sentry-actix + env: + RUSTFLAGS: -Dwarnings test: strategy: @@ -81,9 +119,20 @@ jobs: - uses: Swatinem/rust-cache@v2 - - run: make checkfast + - name: Check sentry-core without default features + run: cargo check --no-default-features + working-directory: sentry-core + env: + RUSTFLAGS: -Dwarnings - - run: make testfast + - name: Check default features + run: cargo check + env: + RUSTFLAGS: -Dwarnings + + - name: Test sentry test feature + run: cargo test --features=test + working-directory: sentry codecov: name: Code Coverage diff --git a/Makefile b/Makefile deleted file mode 100644 index 685a92bca..000000000 --- a/Makefile +++ /dev/null @@ -1,94 +0,0 @@ -all: check -.PHONY: all - -clean: - @cargo clean -.PHONY: clean - -build: - @cargo build -.PHONY: build - -doc: - @cargo doc -.PHONY: doc - -check: style lint test -.PHONY: check - -# Linting - -style: - @rustup component add rustfmt --toolchain stable 2> /dev/null - cargo +stable fmt -- --check -.PHONY: style - -format: - @rustup component add rustfmt --toolchain stable 2> /dev/null - cargo +stable fmt -.PHONY: format - -lint: - @rustup component add clippy --toolchain stable 2> /dev/null - cargo +stable clippy --all-features --tests --examples -- -D clippy::all -.PHONY: lint - -fix: - @rustup component add clippy --toolchain stable 2> /dev/null - cargo +stable clippy --all-features --workspace --tests --examples --fix -- -D clippy::all -.PHONY: fix - -# Tests - -test: checkall testall -.PHONY: test - -testfast: - @echo 'TESTSUITE' - cd sentry && cargo test --features=test -.PHONY: testfast - -testall: - @echo 'TESTSUITE' - cargo test --all-features -.PHONY: testall - -# Checks - -checkfast: check-no-default-features check-default-features -.PHONY: checkfast - -checkall: check-all-features check-no-default-features check-default-features check-panic check-curl-transport check-actix -.PHONY: checkall - -check-all-features: - @echo 'ALL FEATURES' - @RUSTFLAGS=-Dwarnings cargo check --all-features -.PHONY: check-all-features - -check-default-features: - @echo 'DEFAULT FEATURES' - @RUSTFLAGS=-Dwarnings cargo check -.PHONY: check-default-features - -check-no-default-features: - @echo 'NO DEFAULT FEATURES' - @cd sentry-core && RUSTFLAGS=-Dwarnings cargo check --no-default-features -.PHONY: check-no-default-features - -check-panic: - @echo 'NO CLIENT + PANIC' - @cd sentry && RUSTFLAGS=-Dwarnings cargo check --no-default-features --features 'panic' -.PHONY: check-panic - -check-curl-transport: - @echo 'CURL TRANSPORT' - @cd sentry && RUSTFLAGS=-Dwarnings cargo check --features curl - @echo 'CURL TRANSPORT ONLY' - @cd sentry && RUSTFLAGS=-Dwarnings cargo check --no-default-features --features 'curl,panic' -.PHONY: check-curl-transport - -check-actix: - @echo 'ACTIX INTEGRATION' - @cd sentry-actix && RUSTFLAGS=-Dwarnings cargo check -.PHONY: check-actix From 1fdbf9e7c61f6f26bf20e1999d6d20b392ef543c Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Thu, 12 Feb 2026 16:23:35 +0100 Subject: [PATCH 14/24] ci: enforce workflow-level RUSTFLAGS in CI (#988) ### Description Move RUSTFLAGS=-Dwarnings to workflow-level env in ci.yml and remove duplicated step-level env blocks from check and MSRV jobs. #### Issues Closes #976 Closes [RUST-142](https://linear.app/getsentry/issue/RUST-142/enforce-rustflags=-dwarnings-across-all-ci-jobs) --- .github/workflows/ci.yml | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2c13073b2..481fbe1ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,9 @@ on: - "release/**" pull_request: +env: + RUSTFLAGS: -Dwarnings + jobs: lints: name: Lints @@ -42,43 +45,29 @@ jobs: - name: Check all features run: cargo check --all-features - env: - RUSTFLAGS: -Dwarnings - name: Check sentry-core without default features run: cargo check --no-default-features working-directory: sentry-core - env: - RUSTFLAGS: -Dwarnings - name: Check default features run: cargo check - env: - RUSTFLAGS: -Dwarnings - name: Check sentry panic feature without defaults run: cargo check --no-default-features --features panic working-directory: sentry - env: - RUSTFLAGS: -Dwarnings - name: Check sentry curl feature run: cargo check --features curl working-directory: sentry - env: - RUSTFLAGS: -Dwarnings - name: Check sentry curl+panic without defaults run: cargo check --no-default-features --features curl,panic working-directory: sentry - env: - RUSTFLAGS: -Dwarnings - name: Check sentry-actix run: cargo check working-directory: sentry-actix - env: - RUSTFLAGS: -Dwarnings test: strategy: @@ -122,13 +111,9 @@ jobs: - name: Check sentry-core without default features run: cargo check --no-default-features working-directory: sentry-core - env: - RUSTFLAGS: -Dwarnings - name: Check default features run: cargo check - env: - RUSTFLAGS: -Dwarnings - name: Test sentry test feature run: cargo test --features=test From 6f94b69ce21b646cba81190ca9d60faec0f5e9b3 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Fri, 13 Feb 2026 15:06:07 +0100 Subject: [PATCH 15/24] ci: Add required jobs aggregator check (#990) Add a single required-check aggregator job to CI. This makes branch protection easier to manage while still enforcing the full required CI set, and keeps `codecov` intentionally out of the gate. Closes #977 Closes [RUST-143](https://linear.app/getsentry/issue/RUST-143/add-aggregator-required-ci-job) --- .github/workflows/ci.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 481fbe1ee..5db8b684c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -155,3 +155,21 @@ jobs: - name: Run cargo doc run: cargo doc --workspace --all-features --document-private-items --no-deps + + required: + name: Check required jobs + runs-on: ubuntu-latest + if: ${{ always() }} + # Keep this list in sync with all CI jobs that should be required. + # `codecov` is intentionally excluded from this aggregator. + needs: [lints, check, test, MSRV, doc] + + steps: + - name: Fail if any required job did not succeed + if: >- + ${{ + contains(needs.*.result, 'failure') || + contains(needs.*.result, 'cancelled') || + contains(needs.*.result, 'skipped') + }} + run: exit 1 From e080911c7f75f3ad0849aaa182024041582cd364 Mon Sep 17 00:00:00 2001 From: "Daniel Szoke (via Pi Coding Agent)" Date: Thu, 12 Feb 2026 13:21:34 +0000 Subject: [PATCH 16/24] ci: align stable and MSRV check/test coverage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Run both check and test over a shared os×rust matrix for stable and 1.88.0, and remove the standalone MSRV job to reduce drift. Keep check permutations identical across toolchains, add explicit workspace doc-test runs in test, and retain an explicit sentry default+test feature assertion with an inline rationale comment. Closes #974 Closes [RUST-140](https://linear.app/getsentry/issue/RUST-140/align-msrv-and-stable-ci-coverage-including-doc-tests) --- .github/workflows/ci.yml | 48 +++++++++++++++------------------------- 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5db8b684c..9647470de 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,14 +33,20 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] + rust: [stable, 1.88.0] - name: Check feature permutations using Rust stable on ${{ matrix.os }} + name: Check feature permutations using Rust ${{ matrix.rust }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} steps: - name: Checkout sources uses: actions/checkout@v4 + - name: Install rust ${{ matrix.rust }} toolchain + run: | + rustup toolchain install ${{ matrix.rust }} --profile minimal --no-self-update + rustup default ${{ matrix.rust }} + - uses: Swatinem/rust-cache@v2 - name: Check all features @@ -74,27 +80,9 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] + rust: [stable, 1.88.0] - name: Test using Rust stable on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - - uses: Swatinem/rust-cache@v2 - - - name: Run cargo test - run: cargo test --workspace --all-features --all-targets - - MSRV: - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - rust: [1.88.0] - - name: Check / Test MSRV on ${{ matrix.os }} + name: Test using Rust ${{ matrix.rust }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} steps: @@ -108,16 +96,16 @@ jobs: - uses: Swatinem/rust-cache@v2 - - name: Check sentry-core without default features - run: cargo check --no-default-features - working-directory: sentry-core + - name: Run cargo test + run: cargo test --workspace --all-features --all-targets - - name: Check default features - run: cargo check + - name: Run cargo doc tests + run: cargo test --workspace --all-features --doc - - name: Test sentry test feature - run: cargo test --features=test - working-directory: sentry + # Keep this separate so we continue asserting the default+test feature + # combination for sentry explicitly, even with broader all-features coverage. + - name: Test sentry default+test feature combination + run: cargo test -p sentry --features test codecov: name: Code Coverage @@ -162,7 +150,7 @@ jobs: if: ${{ always() }} # Keep this list in sync with all CI jobs that should be required. # `codecov` is intentionally excluded from this aggregator. - needs: [lints, check, test, MSRV, doc] + needs: [lints, check, test, doc] steps: - name: Fail if any required job did not succeed From 3defd7af86f8c4103dec73619d7dc7eb55151ac0 Mon Sep 17 00:00:00 2001 From: "Daniel Szoke (via Pi Coding Agent)" Date: Thu, 12 Feb 2026 15:29:20 +0000 Subject: [PATCH 17/24] ci: Run cargo CI jobs with --locked Add --locked to cargo invocations in CI and weekly workflows so checks fail if Cargo.lock is out of sync. This keeps automation aligned with reproducible dependency resolution and prevents CI from silently updating lockfile state. Closes #982 Closes [RUST-147](https://linear.app/getsentry/issue/RUST-147/ensure-all-jobs-run-with-locked) --- .github/workflows/ci.yml | 26 +++++++++++++------------- .github/workflows/weekly.yml | 4 ++-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9647470de..43c1bb498 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: run: cargo fmt --all -- --check - name: Run cargo clippy - run: cargo clippy --all-features --workspace --tests --examples -- -D clippy::all + run: cargo clippy --all-features --workspace --tests --examples --locked -- -D clippy::all check: strategy: @@ -50,29 +50,29 @@ jobs: - uses: Swatinem/rust-cache@v2 - name: Check all features - run: cargo check --all-features + run: cargo check --all-features --locked - name: Check sentry-core without default features - run: cargo check --no-default-features + run: cargo check --no-default-features --locked working-directory: sentry-core - name: Check default features - run: cargo check + run: cargo check --locked - name: Check sentry panic feature without defaults - run: cargo check --no-default-features --features panic + run: cargo check --no-default-features --features panic --locked working-directory: sentry - name: Check sentry curl feature - run: cargo check --features curl + run: cargo check --features curl --locked working-directory: sentry - name: Check sentry curl+panic without defaults - run: cargo check --no-default-features --features curl,panic + run: cargo check --no-default-features --features curl,panic --locked working-directory: sentry - name: Check sentry-actix - run: cargo check + run: cargo check --locked working-directory: sentry-actix test: @@ -97,15 +97,15 @@ jobs: - uses: Swatinem/rust-cache@v2 - name: Run cargo test - run: cargo test --workspace --all-features --all-targets + run: cargo test --workspace --all-features --all-targets --locked - name: Run cargo doc tests - run: cargo test --workspace --all-features --doc + run: cargo test --workspace --all-features --doc --locked # Keep this separate so we continue asserting the default+test feature # combination for sentry explicitly, even with broader all-features coverage. - name: Test sentry default+test feature combination - run: cargo test -p sentry --features test + run: cargo test -p sentry --features test --locked codecov: name: Code Coverage @@ -120,7 +120,7 @@ jobs: - uses: taiki-e/install-action@cargo-llvm-cov - - run: cargo llvm-cov --all-features --workspace --lcov --output-path lcov.info + - run: cargo llvm-cov --all-features --workspace --lcov --output-path lcov.info --locked - uses: codecov/codecov-action@v5 with: @@ -142,7 +142,7 @@ jobs: - uses: Swatinem/rust-cache@v2 - name: Run cargo doc - run: cargo doc --workspace --all-features --document-private-items --no-deps + run: cargo doc --workspace --all-features --document-private-items --no-deps --locked required: name: Check required jobs diff --git a/.github/workflows/weekly.yml b/.github/workflows/weekly.yml index 4e37ca838..d1958fbe7 100644 --- a/.github/workflows/weekly.yml +++ b/.github/workflows/weekly.yml @@ -26,9 +26,9 @@ jobs: rustup toolchain install ${{ matrix.rust }} --profile minimal --component clippy --no-self-update rustup default ${{ matrix.rust }} - - run: cargo clippy --all-features --workspace --tests --examples -- -D clippy::all + - run: cargo clippy --all-features --workspace --tests --examples --locked -- -D clippy::all - - run: cargo test --workspace --all-features + - run: cargo test --workspace --all-features --locked weekly-audit: name: Audit From c0c5ac6bab3480651b0b1705c920d52f84e1f6be Mon Sep 17 00:00:00 2001 From: "Daniel Szoke (via Pi Coding Agent)" Date: Fri, 13 Feb 2026 15:23:50 +0000 Subject: [PATCH 18/24] ci: Add CI concurrency cancel-in-progress Configure workflow-level concurrency in ci.yml so newer runs for the same workflow+ref cancel older in-progress runs. Use github.head_ref || github.ref to keep PR and branch pushes grouped correctly without changing any job logic. Closes #979 Closes [RUST-145](https://linear.app/getsentry/issue/RUST-145/add-ci-concurrency-with-cancel-in-progress) --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 43c1bb498..4fa55b73a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,10 @@ on: - "release/**" pull_request: +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} + cancel-in-progress: true + env: RUSTFLAGS: -Dwarnings From 97175ffea4259e1909f8560ab14f7f1b8d9b08ee Mon Sep 17 00:00:00 2001 From: "Daniel Szoke (via Pi Coding Agent)" Date: Fri, 13 Feb 2026 15:33:00 +0000 Subject: [PATCH 19/24] ci(workflow): Split CI lanes into reusable workflows Refactor the top-level CI workflow into a thin orchestrator that calls reusable workflows for lint, check, test, and doc lanes via job-level uses. Keep lane behavior unchanged by moving the existing matrices, commands, flags, and environment settings into the called workflows. Keep codecov inline in ci.yml and preserve the required aggregator job identity and gating behavior so required checks remain stable during the refactor. Closes #980 Closes [RUST-146](https://linear.app/getsentry/issue/RUST-146/split-ci-into-reusable-workflows) --- .github/workflows/check.yml | 55 ++++++++++++++++++ .github/workflows/ci.yml | 113 +++--------------------------------- .github/workflows/doc.yml | 25 ++++++++ .github/workflows/lint.yml | 25 ++++++++ .github/workflows/test.yml | 40 +++++++++++++ 5 files changed, 153 insertions(+), 105 deletions(-) create mode 100644 .github/workflows/check.yml create mode 100644 .github/workflows/doc.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 000000000..35f047a6c --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,55 @@ +name: Check compile errors + +on: + workflow_call: + +env: + RUSTFLAGS: -Dwarnings + +jobs: + check: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + rust: [stable, 1.88.0] + + name: Check compile errors using Rust ${{ matrix.rust }} on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Install rust ${{ matrix.rust }} toolchain + run: | + rustup toolchain install ${{ matrix.rust }} --profile minimal --no-self-update + rustup default ${{ matrix.rust }} + + - uses: Swatinem/rust-cache@v2 + + - name: Check all features + run: cargo check --all-features --locked + + - name: Check sentry-core without default features + run: cargo check --no-default-features --locked + working-directory: sentry-core + + - name: Check default features + run: cargo check --locked + + - name: Check sentry panic feature without defaults + run: cargo check --no-default-features --features panic --locked + working-directory: sentry + + - name: Check sentry curl feature + run: cargo check --features curl --locked + working-directory: sentry + + - name: Check sentry curl+panic without defaults + run: cargo check --no-default-features --features curl,panic --locked + working-directory: sentry + + - name: Check sentry-actix + run: cargo check --locked + working-directory: sentry-actix diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4fa55b73a..e7bf5c268 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,100 +16,16 @@ env: jobs: lints: - name: Lints - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - - run: rustup component add rustfmt clippy - - - uses: Swatinem/rust-cache@v2 - - - name: Run cargo fmt - run: cargo fmt --all -- --check - - - name: Run cargo clippy - run: cargo clippy --all-features --workspace --tests --examples --locked -- -D clippy::all + name: Run lint checks + uses: ./.github/workflows/lint.yml check: - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - rust: [stable, 1.88.0] - - name: Check feature permutations using Rust ${{ matrix.rust }} on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - - name: Install rust ${{ matrix.rust }} toolchain - run: | - rustup toolchain install ${{ matrix.rust }} --profile minimal --no-self-update - rustup default ${{ matrix.rust }} - - - uses: Swatinem/rust-cache@v2 - - - name: Check all features - run: cargo check --all-features --locked - - - name: Check sentry-core without default features - run: cargo check --no-default-features --locked - working-directory: sentry-core - - - name: Check default features - run: cargo check --locked - - - name: Check sentry panic feature without defaults - run: cargo check --no-default-features --features panic --locked - working-directory: sentry - - - name: Check sentry curl feature - run: cargo check --features curl --locked - working-directory: sentry - - - name: Check sentry curl+panic without defaults - run: cargo check --no-default-features --features curl,panic --locked - working-directory: sentry - - - name: Check sentry-actix - run: cargo check --locked - working-directory: sentry-actix + name: Check compile errors + uses: ./.github/workflows/check.yml test: - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - rust: [stable, 1.88.0] - - name: Test using Rust ${{ matrix.rust }} on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - - name: Install rust ${{ matrix.rust }} toolchain - run: | - rustup toolchain install ${{ matrix.rust }} --profile minimal --no-self-update - rustup default ${{ matrix.rust }} - - - uses: Swatinem/rust-cache@v2 - - - name: Run cargo test - run: cargo test --workspace --all-features --all-targets --locked - - - name: Run cargo doc tests - run: cargo test --workspace --all-features --doc --locked - - # Keep this separate so we continue asserting the default+test feature - # combination for sentry explicitly, even with broader all-features coverage. - - name: Test sentry default+test feature combination - run: cargo test -p sentry --features test --locked + name: Run tests + uses: ./.github/workflows/test.yml codecov: name: Code Coverage @@ -132,21 +48,8 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} doc: - name: Build-test documentation - runs-on: ubuntu-latest - env: - RUSTDOCFLAGS: -Dwarnings - - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - - run: rustup component add rust-docs - - - uses: Swatinem/rust-cache@v2 - - - name: Run cargo doc - run: cargo doc --workspace --all-features --document-private-items --no-deps --locked + name: Build documentation + uses: ./.github/workflows/doc.yml required: name: Check required jobs diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml new file mode 100644 index 000000000..4e9c26e29 --- /dev/null +++ b/.github/workflows/doc.yml @@ -0,0 +1,25 @@ +name: Build documentation + +on: + workflow_call: + +env: + RUSTFLAGS: -Dwarnings + +jobs: + doc: + name: Build documentation + runs-on: ubuntu-latest + env: + RUSTDOCFLAGS: -Dwarnings + + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - run: rustup component add rust-docs + + - uses: Swatinem/rust-cache@v2 + + - name: Run cargo doc + run: cargo doc --workspace --all-features --document-private-items --no-deps --locked diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 000000000..c897555a7 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,25 @@ +name: Run lint checks + +on: + workflow_call: + +env: + RUSTFLAGS: -Dwarnings + +jobs: + lint: + name: Run lint checks + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - run: rustup component add rustfmt clippy + + - uses: Swatinem/rust-cache@v2 + + - name: Run cargo fmt + run: cargo fmt --all -- --check + + - name: Run cargo clippy + run: cargo clippy --all-features --workspace --tests --examples --locked -- -D clippy::all diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..bbb12ab57 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,40 @@ +name: Run tests + +on: + workflow_call: + +env: + RUSTFLAGS: -Dwarnings + +jobs: + test: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + rust: [stable, 1.88.0] + + name: Run tests using Rust ${{ matrix.rust }} on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Install rust ${{ matrix.rust }} toolchain + run: | + rustup toolchain install ${{ matrix.rust }} --profile minimal --no-self-update + rustup default ${{ matrix.rust }} + + - uses: Swatinem/rust-cache@v2 + + - name: Run cargo test + run: cargo test --workspace --all-features --all-targets --locked + + - name: Run cargo doc tests + run: cargo test --workspace --all-features --doc --locked + + # Keep this separate so we continue asserting the default+test feature + # combination for sentry explicitly, even with broader all-features coverage. + - name: Test sentry default+test feature combination + run: cargo test -p sentry --features test --locked From 173b8836781d648cd9349679c39cbcbc74fbf3d2 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Mon, 16 Feb 2026 12:03:20 +0100 Subject: [PATCH 20/24] build: `cargo update` (#968) Run `cargo update` to bump all dependencies to the latest versions. Stacked on #970. --- Cargo.lock | 1863 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 1154 insertions(+), 709 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fb592480d..34a9ffc6c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "bytes", "futures-core", "futures-sink", @@ -21,16 +21,16 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.10.0" +version = "3.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa882656b67966045e4152c634051e70346939fced7117d5f0b52146a7c74c9" +checksum = "7926860314cbe2fb5d1f13731e387ab43bd32bca224e82e6e2db85de0a3dba49" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", "base64", - "bitflags 2.9.4", + "bitflags 2.11.0", "brotli", "bytes", "bytestring", @@ -39,7 +39,7 @@ dependencies = [ "flate2", "foldhash", "futures-core", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "httparse", "httpdate", @@ -49,7 +49,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.9.0", + "rand 0.9.2", "sha1", "smallvec", "tokio", @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] @@ -85,9 +85,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" +checksum = "92589714878ca59a7626ea19734f0e07a6a875197eec751bb5d3f99e64998c63" dependencies = [ "futures-core", "tokio", @@ -95,9 +95,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.5.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6398974fd4284f4768af07965701efbbb5fdc0616bff20cade1bb14b77675e24" +checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" dependencies = [ "actix-rt", "actix-service", @@ -105,7 +105,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "socket2", + "socket2 0.5.10", "tokio", "tracing", ] @@ -132,9 +132,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.10.2" +version = "4.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2e3b15b3dc6c6ed996e4032389e9849d4ab002b1e92fbfe85b5f307d1479b4d" +checksum = "1654a77ba142e37f049637a3e5685f864514af11fcbc51cb51eb6596afe5b8d6" dependencies = [ "actix-codec", "actix-http", @@ -167,7 +167,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2", + "socket2 0.6.2", "time", "tracing", "url", @@ -182,38 +182,38 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] name = "aligned" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "377e4c0ba83e4431b10df45c1d4666f178ea9c552cac93e60c3a88bf32785923" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" dependencies = [ "as-slice", ] @@ -233,12 +233,6 @@ dependencies = [ "alloc-no-stdlib", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -256,15 +250,15 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" [[package]] name = "as-slice" @@ -294,18 +288,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] @@ -316,9 +310,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "axum" @@ -330,7 +324,7 @@ dependencies = [ "axum-core 0.4.5", "bytes", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body", "http-body-util", "itoa", @@ -342,21 +336,21 @@ dependencies = [ "rustversion", "serde", "sync_wrapper", - "tower 0.5.2", + "tower 0.5.3", "tower-layer", "tower-service", ] [[package]] name = "axum" -version = "0.8.3" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" dependencies = [ - "axum-core 0.5.2", + "axum-core 0.5.6", "bytes", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body", "http-body-util", "itoa", @@ -365,10 +359,9 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rustversion", - "serde", + "serde_core", "sync_wrapper", - "tower 0.5.2", + "tower 0.5.3", "tower-layer", "tower-service", ] @@ -382,7 +375,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body", "http-body-util", "mime", @@ -395,18 +388,17 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.2" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ "bytes", "futures-core", - "http 1.3.1", + "http 1.4.0", "http-body", "http-body-util", "mime", "pin-project-lite", - "rustversion", "sync_wrapper", "tower-layer", "tower-service", @@ -414,9 +406,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -424,7 +416,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-link", ] [[package]] @@ -435,9 +427,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bindgen" @@ -445,7 +437,7 @@ version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -456,7 +448,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] @@ -467,9 +459,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "block-buffer" @@ -480,11 +472,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + [[package]] name = "brotli" -version = "7.0.0" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -493,9 +494,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -503,9 +504,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" dependencies = [ "memchr", "serde", @@ -521,14 +522,14 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "byteorder" @@ -544,20 +545,20 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "bytestring" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" +checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" dependencies = [ "bytes", ] [[package]] name = "camino" -version = "1.1.9" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -591,10 +592,11 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.19" +version = "1.2.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -611,9 +613,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -623,11 +625,10 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ - "android-tzdata", "iana-time-zone", "num-traits", "windows-link", @@ -673,18 +674,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.36" +version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2df961d8c8a0d08aa9945718ccf584145eee3f3aa06cddbeac12933781102e04" +checksum = "63be97961acde393029492ce0be7a1af7e323e6bae9511ebfac33751be5e6806" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.36" +version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "132dbda40fb6753878316a489d5a1242a8ef2f0d9e47ba01c951ea8aa7d013a5" +checksum = "7f13174bda5dfd69d7e947827e5af4b0f2f94a4a3ee92912fba07a66150f21e2" dependencies = [ "anstyle", "clap_lex", @@ -692,24 +693,24 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" [[package]] name = "cmake" -version = "0.1.54" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" dependencies = [ "cc", ] [[package]] name = "const_format" -version = "0.2.34" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" dependencies = [ "const_format_proc_macros", ] @@ -725,6 +726,15 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "cookie" version = "0.16.2" @@ -738,9 +748,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.4" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -763,9 +773,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -839,15 +849,15 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -855,24 +865,24 @@ dependencies = [ [[package]] name = "curl" -version = "0.4.47" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9fb4d13a1be2b58f14d60adba57c9834b78c62fd86c3e76a148f732686e9265" +checksum = "79fc3b6dd0b87ba36e565715bf9a2ced221311db47bd18011676f24a6066edbc" dependencies = [ "curl-sys", "libc", - "openssl-probe", + "openssl-probe 0.1.6", "openssl-sys", "schannel", - "socket2", - "windows-sys 0.52.0", + "socket2 0.6.2", + "windows-sys 0.59.0", ] [[package]] name = "curl-sys" -version = "0.4.80+curl-8.12.1" +version = "0.4.85+curl-8.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55f7df2eac63200c3ab25bde3b2268ef2ee56af3d238e76d61f01c3c49bff734" +checksum = "c0efa6142b5ecc05f6d3eaa39e6af4888b9d3939273fb592c92b7088a8cf3fdb" dependencies = [ "cc", "libc", @@ -880,7 +890,7 @@ dependencies = [ "openssl-sys", "pkg-config", "vcpkg", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -894,9 +904,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.11" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ "darling_core", "darling_macro", @@ -904,26 +914,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.11" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "darling_macro" -version = "0.20.11" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] @@ -965,7 +975,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] @@ -974,7 +984,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" dependencies = [ - "thiserror 2.0.12", + "thiserror 2.0.18", ] [[package]] @@ -989,31 +999,33 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" dependencies = [ "powerfmt", ] [[package]] name = "derive_more" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ "derive_more-impl", ] [[package]] name = "derive_more-impl" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ + "convert_case", "proc-macro2", "quote", - "syn 2.0.100", + "rustc_version", + "syn 2.0.116", "unicode-xid", ] @@ -1027,6 +1039,16 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.11.0", + "objc2", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -1035,7 +1057,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] @@ -1046,9 +1068,9 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "embassy-futures" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067" +checksum = "dc2d050bdc5c21e0862a89256ed8029ae6c290a93aecefc73084b3002cdebb01" [[package]] name = "embassy-sync" @@ -1143,9 +1165,9 @@ dependencies = [ [[package]] name = "embuild" -version = "0.33.0" +version = "0.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a8cbd9507fabce8f2741b9ca45da9e898cc2b0f1c2e53d21cb2436aeac811d" +checksum = "e188ad2bbe82afa841ea4a29880651e53ab86815db036b2cb9f8de3ac32dad75" dependencies = [ "anyhow", "bindgen", @@ -1177,9 +1199,9 @@ dependencies = [ [[package]] name = "enumset" -version = "1.1.5" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a4b049558765cef5f0c1a273c3fc57084d768b44d2f98127aef4cceb17293" +checksum = "25b07a8dfbbbfc0064c0a6bdf9edcf966de6b1c33ce344bdeca3b41615452634" dependencies = [ "enumset_derive", "serde", @@ -1187,14 +1209,14 @@ dependencies = [ [[package]] name = "enumset_derive" -version = "0.10.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c3b24c345d8c314966bdc1832f6c2635bfcce8e7cf363bd115987bba2ee242" +checksum = "f43e744e4ea338060faee68ed933e46e722fb7f3617e722a5772d7e856d8b3ce" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] @@ -1236,12 +1258,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.11" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -1315,16 +1337,21 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.59.0", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "findshlibs" version = "0.10.2" @@ -1339,9 +1366,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1376,9 +1403,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1393,15 +1420,15 @@ dependencies = [ "cfg-if", "cvt", "libc", - "nix", + "nix 0.29.0", "windows-sys 0.52.0", ] [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -1414,9 +1441,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -1424,15 +1451,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -1441,32 +1468,32 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-timer" @@ -1476,9 +1503,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -1488,7 +1515,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -1504,48 +1530,61 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasip2", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", +] + [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "globset" -version = "0.4.16" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" dependencies = [ "aho-corasick", "bstr", @@ -1567,9 +1606,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -1577,7 +1616,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.9.0", + "indexmap 2.13.0", "slab", "tokio", "tokio-util", @@ -1586,17 +1625,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.3.1", - "indexmap 2.9.0", + "http 1.4.0", + "indexmap 2.13.0", "slab", "tokio", "tokio-util", @@ -1605,12 +1644,13 @@ dependencies = [ [[package]] name = "half" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", + "zerocopy", ] [[package]] @@ -1630,9 +1670,18 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "heapless" @@ -1652,10 +1701,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] -name = "hermit-abi" +name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -1665,18 +1720,18 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "hostname" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" +checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd" dependencies = [ "cfg-if", "libc", @@ -1696,12 +1751,11 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -1712,7 +1766,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.3.1", + "http 1.4.0", ] [[package]] @@ -1723,7 +1777,7 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.3.1", + "http 1.4.0", "http-body", "pin-project-lite", ] @@ -1742,9 +1796,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" @@ -1756,8 +1810,8 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2 0.4.9", - "http 1.3.1", + "h2 0.4.13", + "http 1.4.0", "http-body", "httparse", "httpdate", @@ -1771,12 +1825,11 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", - "http 1.3.1", + "http 1.4.0", "hyper", "hyper-util", "rustls", @@ -1784,7 +1837,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 0.26.8", + "webpki-roots", ] [[package]] @@ -1818,23 +1871,22 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "base64", "bytes", "futures-channel", - "futures-core", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body", "hyper", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.2", "tokio", "tower-service", "tracing", @@ -1842,9 +1894,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1866,21 +1918,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -1889,98 +1942,66 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ - "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", + "icu_locale_core", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] [[package]] -name = "icu_provider_macros" -version = "1.5.0" +name = "id-arena" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] name = "ident_case" @@ -1990,9 +2011,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -2001,9 +2022,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -2011,9 +2032,9 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.23" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" dependencies = [ "crossbeam-deque", "globset", @@ -2043,12 +2064,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.16.1", + "serde", + "serde_core", ] [[package]] @@ -2059,9 +2082,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" dependencies = [ "memchr", "serde", @@ -2069,13 +2092,13 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2107,25 +2130,25 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ "once_cell", "wasm-bindgen", @@ -2143,38 +2166,44 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" -version = "0.2.172" +version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" [[package]] name = "libloading" -version = "0.8.6" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets", + "windows-link", ] [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "libc", - "redox_syscall", + "redox_syscall 0.7.1", ] [[package]] name = "libz-sys" -version = "1.1.22" +version = "1.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" dependencies = [ "cc", "libc", @@ -2190,15 +2219,15 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "local-channel" @@ -2219,19 +2248,24 @@ checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.27" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "matchit" @@ -2247,9 +2281,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" -version = "2.7.4" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "mime" @@ -2265,35 +2299,36 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "9d5d26952a508f321b4d3d2e80e78fc2603eaefcdf0c30783867f19586518bdc" dependencies = [ "libc", "log", "openssl", - "openssl-probe", + "openssl-probe 0.2.1", "openssl-sys", "schannel", "security-framework", @@ -2322,7 +2357,19 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "libc", @@ -2340,20 +2387,20 @@ dependencies = [ [[package]] name = "normpath" -version = "1.3.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8911957c4b1549ac0dc74e30db9c8b0e66ddcd6d7acc33098f4c63a64a6d7ed" +checksum = "bf23ab2b905654b4cb177e30b629937b3868311d4e1cba859f899c041046e69b" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "nu-ansi-term" -version = "0.50.1" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2373,83 +2420,249 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", + "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] -name = "object" -version = "0.36.7" +name = "objc2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" dependencies = [ - "memchr", + "objc2-encode", ] [[package]] -name = "once_cell" -version = "1.21.3" +name = "objc2-cloud-kit" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-foundation", +] [[package]] -name = "oorandom" -version = "11.1.5" +name = "objc2-core-data" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] [[package]] -name = "openssl" -version = "0.10.72" +name = "objc2-core-foundation" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", + "bitflags 2.11.0", + "dispatch2", + "objc2", ] [[package]] -name = "openssl-macros" -version = "0.1.1" +name = "objc2-core-graphics" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", + "bitflags 2.11.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", ] [[package]] -name = "openssl-probe" -version = "0.1.6" +name = "objc2-core-image" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] [[package]] -name = "openssl-sys" -version = "0.9.107" +name = "objc2-core-location" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-sys" +version = "0.9.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", @@ -2467,7 +2680,7 @@ dependencies = [ "futures-sink", "js-sys", "pin-project-lite", - "thiserror 2.0.12", + "thiserror 2.0.18", "tracing", ] @@ -2483,29 +2696,34 @@ dependencies = [ "glob", "opentelemetry", "percent-encoding", - "rand 0.9.0", + "rand 0.9.2", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.18", "tokio", "tokio-stream", ] [[package]] name = "os_info" -version = "3.10.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a604e53c24761286860eba4e2c8b23a0161526476b1de520139d69cdb85a6b5" +checksum = "e4022a17595a00d6a369236fdae483f0de7f0a339960a53118b818238e132224" dependencies = [ + "android_system_properties", "log", + "nix 0.30.1", + "objc2", + "objc2-foundation", + "objc2-ui-kit", "serde", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -2513,15 +2731,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec", - "windows-targets", + "windows-link", ] [[package]] @@ -2535,9 +2753,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project" @@ -2556,7 +2774,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] @@ -2605,6 +2823,15 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2632,19 +2859,19 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.32" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ "toml_edit", ] @@ -2668,14 +2895,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -2700,14 +2927,14 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "quinn" -version = "0.11.7" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -2716,8 +2943,8 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2", - "thiserror 2.0.12", + "socket2 0.6.2", + "thiserror 2.0.18", "tokio", "tracing", "web-time", @@ -2725,19 +2952,20 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.10" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.3.2", - "rand 0.9.0", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.18", "tinyvec", "tracing", "web-time", @@ -2745,32 +2973,32 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.11" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.6.2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" @@ -2785,13 +3013,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", - "zerocopy", + "rand_core 0.9.5", ] [[package]] @@ -2811,7 +3038,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -2820,23 +3047,23 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.4", ] [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -2844,9 +3071,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -2854,18 +3081,27 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_syscall" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -2875,9 +3111,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -2886,15 +3122,15 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" [[package]] name = "relative-path" @@ -2918,16 +3154,16 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.25" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6eff9328d40131d43bd911d42d79eb6a47312002a4daefc9e37f17e74a7701a" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64", "bytes", "futures-channel", "futures-core", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body", "http-body-util", "hyper", @@ -2949,14 +3185,14 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-rustls", - "tower 0.5.2", + "tower 0.5.3", "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.4", + "webpki-roots", ] [[package]] @@ -2967,7 +3203,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -2999,15 +3235,15 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.100", + "syn 2.0.116", "unicode-ident", ] [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustc-hash" @@ -3030,7 +3266,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -3039,22 +3275,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.5" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.26" +version = "0.23.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" dependencies = [ "log", "once_cell", @@ -3065,29 +3301,21 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ "web-time", + "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.103.1" +version = "0.103.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" dependencies = [ "ring", "rustls-pki-types", @@ -3096,15 +3324,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "same-file" @@ -3117,11 +3345,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3132,11 +3360,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.11.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "core-foundation", "core-foundation-sys", "libc", @@ -3145,9 +3373,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "321c8673b092a9a42605034a9879d73cb79101ed5fd117bc9a597b89b4e9e61a" dependencies = [ "core-foundation-sys", "libc", @@ -3155,11 +3383,12 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -3193,7 +3422,7 @@ dependencies = [ "serde_json", "slog", "tokio", - "tower 0.5.2", + "tower 0.5.3", "tracing", "tracing-subscriber", "ureq", @@ -3253,13 +3482,13 @@ dependencies = [ "criterion", "futures", "log", - "rand 0.9.0", + "rand 0.9.2", "rayon", "sentry", "sentry-types", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.18", "tokio", "url", "uuid", @@ -3277,7 +3506,7 @@ dependencies = [ name = "sentry-log" version = "0.46.2" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "log", "pretty_env_logger", "sentry", @@ -3320,8 +3549,8 @@ name = "sentry-tower" version = "0.46.2" dependencies = [ "anyhow", - "axum 0.8.3", - "http 1.3.1", + "axum 0.8.8", + "http 1.4.0", "pin-project", "prost", "sentry", @@ -3329,7 +3558,7 @@ dependencies = [ "sentry-core", "tokio", "tonic", - "tower 0.5.2", + "tower 0.5.3", "tower-layer", "tower-service", "url", @@ -3339,7 +3568,7 @@ dependencies = [ name = "sentry-tracing" version = "0.46.2" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "log", "sentry", "sentry-backtrace", @@ -3357,11 +3586,11 @@ version = "0.46.2" dependencies = [ "debugid", "hex", - "rand 0.9.0", + "rand 0.9.2", "rstest", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.18", "time", "url", "uuid", @@ -3394,19 +3623,20 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", "serde", + "serde_core", + "zmij", ] [[package]] @@ -3449,52 +3679,69 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + [[package]] name = "slab" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "slog" -version = "2.7.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" +checksum = "9b3b8565691b22d2bdfc066426ed48f837fc0c5f2c8cad8d9718f7f99d6995c1" dependencies = [ + "anyhow", "erased-serde", + "rustversion", + "serde_core", ] [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "strum" @@ -3520,7 +3767,7 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "rustversion", @@ -3533,11 +3780,11 @@ version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "rustversion", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] @@ -3559,9 +3806,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" dependencies = [ "proc-macro2", "quote", @@ -3579,26 +3826,26 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "tempfile" -version = "3.19.1" +version = "3.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" dependencies = [ "fastrand", - "getrandom 0.3.2", + "getrandom 0.4.1", "once_cell", - "rustix 1.0.5", - "windows-sys 0.59.0", + "rustix 1.1.3", + "windows-sys 0.61.2", ] [[package]] @@ -3621,11 +3868,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.18", ] [[package]] @@ -3636,28 +3883,27 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -3693,9 +3939,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -3713,9 +3959,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -3728,31 +3974,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.2" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ - "backtrace", "bytes", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.6.2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] @@ -3767,9 +4012,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -3777,9 +4022,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -3788,9 +4033,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.14" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -3801,18 +4046,31 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.7.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.23.10+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.13.0", "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.8+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0742ff5ff03ea7e67c8ae6c93cac239e0d9784833362da3f9a9c1da8dfefcbdc" +dependencies = [ "winnow", ] @@ -3827,8 +4085,8 @@ dependencies = [ "axum 0.7.9", "base64", "bytes", - "h2 0.4.9", - "http 1.3.1", + "h2 0.4.13", + "http 1.4.0", "http-body", "http-body-util", "hyper", @@ -3837,7 +4095,7 @@ dependencies = [ "percent-encoding", "pin-project", "prost", - "socket2", + "socket2 0.5.10", "tokio", "tokio-stream", "tower 0.4.13", @@ -3868,9 +4126,9 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -3887,14 +4145,14 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "bytes", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body", "iri-string", "pin-project-lite", - "tower 0.5.2", + "tower 0.5.3", "tower-layer", "tower-service", ] @@ -3913,9 +4171,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -3925,20 +4183,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -3957,9 +4215,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -3977,9 +4235,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "uname" @@ -4001,9 +4259,15 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-xid" @@ -4019,9 +4283,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "3.0.11" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a3e9af6113ecd57b8c63d3cd76a385b2e3881365f1f489e54f49801d0c83ea" +checksum = "fdc97a28575b85cfedf2a7e7d3cc64b3e11bd8ac766666318003abbacc7a21fc" dependencies = [ "base64", "der", @@ -4029,36 +4293,36 @@ dependencies = [ "native-tls", "percent-encoding", "rustls", - "rustls-pemfile", "rustls-pki-types", "ureq-proto", "utf-8", - "webpki-root-certs 0.26.11", - "webpki-roots 0.26.8", + "webpki-root-certs", + "webpki-roots", ] [[package]] name = "ureq-proto" -version = "0.4.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadf18427d33828c311234884b7ba2afb57143e6e7e69fda7ee883b624661e36" +checksum = "d81f9efa9df032be5934a46a068815a10a042b494b6a58cb0a1a97bb5467ed6f" dependencies = [ "base64", - "http 1.3.1", + "http 1.4.0", "httparse", "log", ] [[package]] name = "url" -version = "2.5.4" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", + "serde_derive", ] [[package]] @@ -4067,12 +4331,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -4081,12 +4339,14 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.16.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" dependencies = [ - "getrandom 0.3.2", - "serde", + "getrandom 0.4.1", + "js-sys", + "serde_core", + "wasm-bindgen", ] [[package]] @@ -4134,52 +4394,49 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "wasip2" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen" -version = "0.2.100" +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" +name = "wasm-bindgen" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.100", + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" dependencies = [ "cfg-if", + "futures-util", "js-sys", "once_cell", "wasm-bindgen", @@ -4188,9 +4445,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4198,78 +4455,94 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.100", - "wasm-bindgen-backend", + "syn 2.0.116", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ "unicode-ident", ] [[package]] -name = "web-sys" -version = "0.3.77" +name = "wasm-encoder" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" dependencies = [ - "js-sys", - "wasm-bindgen", + "leb128fmt", + "wasmparser", ] [[package]] -name = "web-time" -version = "1.1.0" +name = "wasm-metadata" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ - "js-sys", - "wasm-bindgen", + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", ] [[package]] -name = "webpki-root-certs" -version = "0.26.11" +name = "wasmparser" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "webpki-root-certs 1.0.0", + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver", ] [[package]] -name = "webpki-root-certs" -version = "1.0.0" +name = "web-sys" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a83f7e1a9f8712695c03eabe9ed3fbca0feff0152f33f12593e5a6303cb1a4" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" dependencies = [ - "rustls-pki-types", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "webpki-roots" -version = "0.26.8" +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" dependencies = [ "rustls-pki-types", ] [[package]] name = "webpki-roots" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" dependencies = [ "rustls-pki-types", ] @@ -4304,11 +4577,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -4319,9 +4592,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.61.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", @@ -4332,46 +4605,46 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "windows-link" -version = "0.1.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-result" -version = "0.3.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ "windows-link", ] @@ -4382,7 +4655,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -4391,7 +4664,25 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", ] [[package]] @@ -4400,14 +4691,31 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -4416,85 +4724,205 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" -version = "0.7.6" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" dependencies = [ - "bitflags 2.9.4", + "wit-bindgen-rust-macro", ] [[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.116", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.116", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -4502,41 +4930,41 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.24" +version = "0.8.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] @@ -4549,21 +4977,32 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -4572,15 +5011,21 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.116", ] +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + [[package]] name = "zstd" version = "0.13.3" @@ -4601,9 +5046,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", From 35c8ba1f40d3b2b36ecfb77158f4d45b359e4d31 Mon Sep 17 00:00:00 2001 From: Burak Yigit Kaya Date: Mon, 16 Feb 2026 13:01:28 +0000 Subject: [PATCH 21/24] ci(release): Switch from action-prepare-release to Craft (#955) ## Summary This PR migrates from the deprecated `action-prepare-release` to the new Craft GitHub Actions. ## Changes - Migrated `.github/workflows/release.yml` to Craft reusable workflow ## Documentation See https://getsentry.github.io/craft/github-actions/ for more information. --------- Co-authored-by: Daniel Szoke --- .github/workflows/release.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1f711e048..3108584fd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,12 +4,16 @@ on: workflow_dispatch: inputs: version: - description: Version to release - required: true + description: Version to release (or "auto") + required: false force: description: Force a release even when there are release-blockers (optional) required: false +permissions: + contents: write + pull-requests: write + jobs: release: runs-on: ubuntu-latest @@ -30,7 +34,7 @@ jobs: - run: cargo install cargo-readme - name: Prepare release - uses: getsentry/action-prepare-release@v1 + uses: getsentry/craft@906009a1b771956757e521555b561379307eb667 # v2.21.4 env: GITHUB_TOKEN: ${{ steps.token.outputs.token }} with: From a8cbd6c6f22040229983bb3ee50d0b4d26d5ad2b Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Mon, 16 Feb 2026 13:01:37 +0000 Subject: [PATCH 22/24] feat: expose transport utilities (#949) ### Description Exposes `RateLimiter`, `RateLimiterCategory`, `StdTransportThread` and `TokioTransportThread` from the `transports` module. #### Issues Resolves: #941 #### Reminders - Add GH Issue ID _&_ Linear ID (if applicable) - Add an entry to CHANGELOG.md, following the format of existing entries - The PR title should use [Conventional Commits](https://develop.sentry.dev/engineering-practices/commit-messages/#type) style (`feat:`, `fix:`, `ref:`, `meta:`, etc.) - Useful links for external contributors: [Sentry SDK development docs](https://develop.sentry.dev/sdk/), [Discord community](https://discord.gg/sentry) --------- Co-authored-by: Daniel Szoke --- CHANGELOG.md | 1 + sentry/src/transports/mod.rs | 8 ++++++++ sentry/src/transports/thread.rs | 8 ++++++++ sentry/src/transports/tokio_thread.rs | 8 ++++++++ 4 files changed, 25 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c504d91cc..53d046382 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### New Features - Added a `Envelope::into_items` method, which returns an iterator over owned [`EnvelopeItem`s](https://docs.rs/sentry/0.46.2/sentry/protocol/enum.EnvelopeItem.html) in the [`Envelope`](https://docs.rs/sentry/0.46.2/sentry/struct.Envelope.html) ([#983](https://github.com/getsentry/sentry-rust/pull/983)). +- Expose transport utilities ([#949](https://github.com/getsentry/sentry-rust/pull/949)) ### Fixes diff --git a/sentry/src/transports/mod.rs b/sentry/src/transports/mod.rs index 4b572fef1..7e959612b 100644 --- a/sentry/src/transports/mod.rs +++ b/sentry/src/transports/mod.rs @@ -8,10 +8,18 @@ use std::sync::Arc; #[cfg(feature = "httpdate")] mod ratelimit; +#[cfg(feature = "httpdate")] +pub use self::ratelimit::{RateLimiter, RateLimitingCategory}; + #[cfg(any(feature = "curl", feature = "ureq"))] mod thread; +#[cfg(any(feature = "curl", feature = "ureq"))] +pub use self::thread::TransportThread as StdTransportThread; + #[cfg(feature = "reqwest")] mod tokio_thread; +#[cfg(feature = "reqwest")] +pub use self::tokio_thread::TransportThread as TokioTransportThread; #[cfg(feature = "reqwest")] mod reqwest; diff --git a/sentry/src/transports/thread.rs b/sentry/src/transports/thread.rs index 6ccca6fae..4ab402600 100644 --- a/sentry/src/transports/thread.rs +++ b/sentry/src/transports/thread.rs @@ -18,6 +18,7 @@ enum Task { Shutdown, } +/// A background-thread dedicated to sending [`Envelope`]s while respecting the rate limits imposed in the responses. pub struct TransportThread { sender: SyncSender, shutdown: Arc, @@ -25,6 +26,7 @@ pub struct TransportThread { } impl TransportThread { + /// Spawn a new background thread. pub fn new(mut send: SendFn) -> Self where SendFn: FnMut(Envelope, &mut RateLimiter) + Send + 'static, @@ -78,6 +80,9 @@ impl TransportThread { } } + /// Send an [`Envelope`]. + /// + /// In case the background thread cannot keep up, the [`Envelope`] is dropped. pub fn send(&self, envelope: Envelope) { // Using send here would mean that when the channel fills up for whatever // reason, trying to send an envelope would block everything. We'd rather @@ -87,6 +92,9 @@ impl TransportThread { } } + /// Flush all pending [`Envelope`]s. + /// + /// Returns true if successful within given timeout. pub fn flush(&self, timeout: Duration) -> bool { let (sender, receiver) = sync_channel(1); let _ = self.sender.send(Task::Flush(sender)); diff --git a/sentry/src/transports/tokio_thread.rs b/sentry/src/transports/tokio_thread.rs index 5ef734e31..398963882 100644 --- a/sentry/src/transports/tokio_thread.rs +++ b/sentry/src/transports/tokio_thread.rs @@ -18,6 +18,7 @@ enum Task { Shutdown, } +/// A background-thread powered by [`tokio`] dedicated to sending [`Envelope`]s while respecting the rate limits imposed in the responses. pub struct TransportThread { sender: SyncSender, shutdown: Arc, @@ -25,6 +26,7 @@ pub struct TransportThread { } impl TransportThread { + /// Spawn a new background thread. pub fn new(mut send: SendFn) -> Self where SendFn: FnMut(Envelope, RateLimiter) -> SendFuture + Send + 'static, @@ -89,6 +91,9 @@ impl TransportThread { } } + /// Send an [`Envelope`]. + /// + /// In case the background thread cannot keep up, the [`Envelope`] is dropped. pub fn send(&self, envelope: Envelope) { // Using send here would mean that when the channel fills up for whatever // reason, trying to send an envelope would block everything. We'd rather @@ -98,6 +103,9 @@ impl TransportThread { } } + /// Flush all pending [`Envelope`]s. + /// + /// Returns true if successful within given timeout. pub fn flush(&self, timeout: Duration) -> bool { let (sender, receiver) = sync_channel(1); let _ = self.sender.send(Task::Flush(sender)); From fe28971651d1d305be86b13ee4a08090b3f3565d Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Mon, 16 Feb 2026 14:42:30 +0100 Subject: [PATCH 23/24] chore(repo): Add Claude Code settings with basic permissions (#959) Adds `.claude/settings.json` to enable Claude Code with: - Basic bash commands (find, ls, git, grep, mv) - WebFetch access to GitHub and Sentry documentation sites This follows the same pattern used in other Sentry SDK repositories like sentry-javascript, sentry-dart, and sentry-react-native. Note: This adds .claude/settings.json with -f flag since .claude is in .gitignore for local settings. --------- Co-authored-by: Claude Sonnet 4.5 Co-authored-by: Daniel Szoke Co-authored-by: Daniel Szoke <7881302+szokeasaurusrex@users.noreply.github.com> --- .claude/settings.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .claude/settings.json diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 000000000..061f7e338 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,30 @@ +{ + "permissions": { + "allow": [ + "Bash(ls:*)", + "Bash(git status:*)", + "Bash(git log:*)", + "Bash(git diff:*)", + "Bash(git show:*)", + "Bash(git branch:*)", + "Bash(git remote:*)", + "Bash(git tag:*)", + "Bash(git stash list:*)", + "Bash(git rev-parse:*)", + "Bash(gh pr view:*)", + "Bash(gh pr list:*)", + "Bash(gh pr checks:*)", + "Bash(gh pr diff:*)", + "Bash(gh issue view:*)", + "Bash(gh issue list:*)", + "Bash(gh run view:*)", + "Bash(gh run list:*)", + "Bash(gh run logs:*)", + "Bash(gh repo view:*)", + "WebFetch(domain:docs.sentry.io)", + "WebFetch(domain:develop.sentry.dev)", + "Bash(grep:*)", + ], + "deny": [] + } +} From c4f2f72338c990a2d20653399ec72c93e4afee50 Mon Sep 17 00:00:00 2001 From: Daniel Szoke Date: Tue, 24 Feb 2026 13:36:30 +0100 Subject: [PATCH 24/24] add benchmark for #957 --- Cargo.lock | 59 +++++- ...-24-tracing-hub-forking-benchmark-setup.md | 53 ++++++ .../compare-tracing-perf-master-vs-head.sh | 160 +++++++++++++++++ sentry-tracing/Cargo.toml | 5 + sentry-tracing/benches/tracing_layer_perf.rs | 169 ++++++++++++++++++ 5 files changed, 444 insertions(+), 2 deletions(-) create mode 100644 docs/2026-02-24-tracing-hub-forking-benchmark-setup.md create mode 100755 scripts/bench/compare-tracing-perf-master-vs-head.sh create mode 100644 sentry-tracing/benches/tracing_layer_perf.rs diff --git a/Cargo.lock b/Cargo.lock index 34a9ffc6c..95b2a7f29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -233,6 +233,15 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + [[package]] name = "android_system_properties" version = "0.1.5" @@ -790,7 +799,7 @@ dependencies = [ "cast", "ciborium", "clap", - "criterion-plot", + "criterion-plot 0.5.0", "is-terminal", "itertools 0.10.5", "num-traits", @@ -806,6 +815,31 @@ dependencies = [ "walkdir", ] +[[package]] +name = "criterion" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" +dependencies = [ + "alloca", + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot 0.8.2", + "itertools 0.13.0", + "num-traits", + "oorandom", + "page_size", + "plotters", + "rayon", + "regex", + "serde", + "serde_json", + "tinytemplate", + "walkdir", +] + [[package]] name = "criterion-plot" version = "0.5.0" @@ -816,6 +850,16 @@ dependencies = [ "itertools 0.10.5", ] +[[package]] +name = "criterion-plot" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" +dependencies = [ + "cast", + "itertools 0.13.0", +] + [[package]] name = "critical-section" version = "1.2.0" @@ -2719,6 +2763,16 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "parking_lot" version = "0.12.5" @@ -3479,7 +3533,7 @@ name = "sentry-core" version = "0.46.2" dependencies = [ "anyhow", - "criterion", + "criterion 0.5.1", "futures", "log", "rand 0.9.2", @@ -3569,6 +3623,7 @@ name = "sentry-tracing" version = "0.46.2" dependencies = [ "bitflags 2.11.0", + "criterion 0.8.2", "log", "sentry", "sentry-backtrace", diff --git a/docs/2026-02-24-tracing-hub-forking-benchmark-setup.md b/docs/2026-02-24-tracing-hub-forking-benchmark-setup.md new file mode 100644 index 000000000..bce68232d --- /dev/null +++ b/docs/2026-02-24-tracing-hub-forking-benchmark-setup.md @@ -0,0 +1,53 @@ +# Tracing hub-forking benchmark setup + +## What was added + +- `sentry-tracing/Cargo.toml` + - Added dev dependency: `criterion = "0.8.2"` + - Added bench target: + - `[[bench]]` + - `name = "tracing_layer_perf"` + - `harness = false` + +- `sentry-tracing/benches/tracing_layer_perf.rs` + - Criterion benchmarks for: + - `enter_exit_existing_span` + - `create_enter_exit_close_span` + - `reenter_same_span_depth2` + - `cross_thread_shared_span` + - Each scenario runs in: + - `sentry_active` + - `tracing_only_control` + +- `scripts/bench/compare-tracing-perf-master-vs-head.sh` + - Automates `origin/master` vs current branch comparison + - Creates/reuses a master worktree at `target/bench-worktrees/tracing-perf-master` + - Reuses current checkout as head candidate + - Runs identical `cargo bench` commands on both + - Saves artifacts to `target/bench-compare//` + - Produces: + - raw logs + - commands used + - summary markdown table with deltas + +## How to run + +Full profile (default): + +```bash +scripts/bench/compare-tracing-perf-master-vs-head.sh +``` + +Reduced profile: + +```bash +scripts/bench/compare-tracing-perf-master-vs-head.sh --reduced +``` + +## Output + +Artifacts are written to: + +- `target/bench-compare//summary.md` +- `target/bench-compare//commands.txt` +- `target/bench-compare//raw/` diff --git a/scripts/bench/compare-tracing-perf-master-vs-head.sh b/scripts/bench/compare-tracing-perf-master-vs-head.sh new file mode 100755 index 000000000..d84d91013 --- /dev/null +++ b/scripts/bench/compare-tracing-perf-master-vs-head.sh @@ -0,0 +1,160 @@ +#!/usr/bin/env bash +set -euo pipefail + +profile="full" +if [[ "${1:-}" == "--reduced" ]]; then + profile="reduced" +fi + +if [[ "$profile" == "full" ]]; then + sample_size=100 + measurement_time=10 + warm_up_time=3 +else + sample_size=20 + measurement_time=2 + warm_up_time=1 +fi + +repo_root="$(git rev-parse --show-toplevel)" +current_branch="$(git rev-parse --abbrev-ref HEAD)" +head_sha="$(git rev-parse HEAD)" +timestamp="$(date -u +%Y%m%dT%H%M%SZ)" + +worktree_root="$repo_root/target/bench-worktrees" +master_worktree="$worktree_root/tracing-perf-master" +head_worktree="$repo_root" + +artifact_dir="$repo_root/target/bench-compare/$timestamp" +raw_dir="$artifact_dir/raw" +mkdir -p "$raw_dir/master" "$raw_dir/head" + +mkdir -p "$worktree_root" + +git config --global --add safe.directory "$repo_root" >/dev/null 2>&1 || true +git config --global --add safe.directory "$master_worktree" >/dev/null 2>&1 || true + +git fetch origin master >/dev/null + +if [[ ! -e "$master_worktree/.git" ]]; then + git worktree add --detach "$master_worktree" origin/master >/dev/null +else + git -C "$master_worktree" fetch origin master >/dev/null + git -C "$master_worktree" checkout --detach -f origin/master >/dev/null +fi + +# Keep benchmark harness identical between baseline and candidate. +mkdir -p "$master_worktree/sentry-tracing/benches" +cp "$repo_root/sentry-tracing/Cargo.toml" "$master_worktree/sentry-tracing/Cargo.toml" +cp "$repo_root/sentry-tracing/benches/tracing_layer_perf.rs" "$master_worktree/sentry-tracing/benches/tracing_layer_perf.rs" +cp "$repo_root/Cargo.lock" "$master_worktree/Cargo.lock" + +scenarios=( + enter_exit_existing_span + create_enter_exit_close_span + reenter_same_span_depth2 + cross_thread_shared_span +) + +modes=( + sentry_active + tracing_only_control +) + +commands_file="$artifact_dir/commands.txt" +{ + echo "# profile=$profile" + echo "# branch=$current_branch" + echo "# head_sha=$head_sha" + echo "cargo bench -p sentry-tracing --bench tracing_layer_perf --no-run" + for scenario in "${scenarios[@]}"; do + echo "cargo bench -p sentry-tracing --bench tracing_layer_perf $scenario -- --sample-size $sample_size --measurement-time $measurement_time --warm-up-time $warm_up_time --noplot" + done +} >"$commands_file" + +run_suite() { + local label="$1" + local worktree="$2" + + ( + cd "$worktree" + cargo bench -p sentry-tracing --bench tracing_layer_perf --no-run + ) >"$raw_dir/$label/build.log" 2>&1 + + for scenario in "${scenarios[@]}"; do + local log_file="$raw_dir/$label/$scenario.log" + ( + cd "$worktree" + cargo bench -p sentry-tracing --bench tracing_layer_perf "$scenario" -- \ + --sample-size "$sample_size" \ + --measurement-time "$measurement_time" \ + --warm-up-time "$warm_up_time" \ + --noplot + ) 2>&1 | tee "$log_file" + done +} + +parse_mean_ns() { + local log_file="$1" + local bench_name="$2" + + awk -v bench="$bench_name" ' + function to_ns(v, u) { + if (u == "ns") return v + if (u == "us" || u == "µs" || u == "μs") return v * 1000 + if (u == "ms") return v * 1000000 + if (u == "s") return v * 1000000000 + return -1 + } + /^Benchmarking / { + current = $0 + sub(/^Benchmarking /, "", current) + sub(/:.*/, "", current) + } + $1 == "time:" && current == bench { + gsub("\\[", "", $2) + middle_value = $4 + middle_unit = $5 + print to_ns(middle_value + 0, middle_unit) + exit + } + ' "$log_file" +} + +run_suite master "$master_worktree" +run_suite head "$head_worktree" + +summary_file="$artifact_dir/summary.md" +{ + echo "# tracing_layer_perf: origin/master vs $current_branch" + echo + printf -- "- profile: \`%s\`\n" "$profile" + printf -- "- baseline: \`%s\`\n" "origin/master" + printf -- "- candidate: \`%s (%s)\`\n" "$current_branch" "$head_sha" + echo + echo "| scenario | mode | master mean (ns) | head mean (ns) | delta |" + echo "|---|---|---:|---:|---:|" + + for scenario in "${scenarios[@]}"; do + for mode in "${modes[@]}"; do + bench_name="$scenario/$mode" + master_ns="$(parse_mean_ns "$raw_dir/master/$scenario.log" "$bench_name")" + head_ns="$(parse_mean_ns "$raw_dir/head/$scenario.log" "$bench_name")" + + if [[ -z "$master_ns" || -z "$head_ns" ]]; then + delta="n/a" + else + delta="$(awk -v a="$master_ns" -v b="$head_ns" 'BEGIN { printf "%.2f%%", ((b - a) / a) * 100 }')" + fi + + echo "| $scenario | $mode | $master_ns | $head_ns | $delta |" + done + done + echo + printf -- "Commands: \`%s\`\n" "$commands_file" + printf -- "Raw logs: \`%s\`\n" "$raw_dir" +} >"$summary_file" + +echo "Benchmark comparison complete." +echo "Artifacts: $artifact_dir" +echo "Summary: $summary_file" diff --git a/sentry-tracing/Cargo.toml b/sentry-tracing/Cargo.toml index f5ba80abf..6bbbb718a 100644 --- a/sentry-tracing/Cargo.toml +++ b/sentry-tracing/Cargo.toml @@ -38,3 +38,8 @@ serde_json = "1" tracing = "0.1" tracing-subscriber = { version = "0.3.20", features = ["fmt", "registry"] } tokio = { version = "1.44", features = ["rt-multi-thread", "macros", "time"] } +criterion = "0.8.2" + +[[bench]] +name = "tracing_layer_perf" +harness = false diff --git a/sentry-tracing/benches/tracing_layer_perf.rs b/sentry-tracing/benches/tracing_layer_perf.rs new file mode 100644 index 000000000..156125f2f --- /dev/null +++ b/sentry-tracing/benches/tracing_layer_perf.rs @@ -0,0 +1,169 @@ +use std::sync::Arc; + +use criterion::{criterion_group, criterion_main, Criterion}; +use std::hint::black_box; +use tracing_subscriber::prelude::*; + +struct NoopTransport; + +impl sentry::Transport for NoopTransport { + fn send_envelope(&self, envelope: sentry::Envelope) {} +} + +fn active_hub() -> Arc { + let client = Arc::new(sentry::Client::from(sentry::ClientOptions { + dsn: Some("https://public@sentry.invalid/1".parse().unwrap()), + transport: Some(Arc::new(Arc::new(NoopTransport))), + traces_sample_rate: 1.0, + ..Default::default() + })); + let scope = Arc::new(sentry::Scope::default()); + Arc::new(sentry::Hub::new(Some(client), scope)) +} + +fn bench_sentry_active(b: &mut criterion::Bencher<'_>, mut op: F) +where + F: FnMut(), +{ + let dispatch = + tracing::Dispatch::new(tracing_subscriber::registry().with(sentry_tracing::layer())); + let hub = active_hub(); + + sentry::Hub::run(hub, || { + tracing::dispatcher::with_default(&dispatch, || { + b.iter(|| op()); + }); + }); +} + +fn bench_tracing_only_control(b: &mut criterion::Bencher<'_>, mut op: F) +where + F: FnMut(), +{ + let dispatch = tracing::Dispatch::new(tracing_subscriber::registry()); + + tracing::dispatcher::with_default(&dispatch, || { + b.iter(|| op()); + }); +} + +fn tracing_layer_perf(c: &mut Criterion) { + { + let mut group = c.benchmark_group("enter_exit_existing_span"); + group.bench_function("sentry_active", |b| { + let dispatch = tracing::Dispatch::new( + tracing_subscriber::registry().with(sentry_tracing::layer()), + ); + let hub = active_hub(); + + sentry::Hub::run(hub, || { + tracing::dispatcher::with_default(&dispatch, || { + let span = tracing::info_span!("existing"); + b.iter(|| { + let _guard = span.enter(); + black_box(()); + }); + }); + }); + }); + group.bench_function("tracing_only_control", |b| { + let dispatch = tracing::Dispatch::new(tracing_subscriber::registry()); + tracing::dispatcher::with_default(&dispatch, || { + let span = tracing::info_span!("existing"); + b.iter(|| { + let _guard = span.enter(); + black_box(()); + }); + }); + }); + group.finish(); + } + + { + let mut group = c.benchmark_group("create_enter_exit_close_span"); + group.bench_function("sentry_active", |b| { + bench_sentry_active(b, || { + let span = tracing::info_span!("created"); + let _guard = span.enter(); + black_box(()); + }) + }); + group.bench_function("tracing_only_control", |b| { + bench_tracing_only_control(b, || { + let span = tracing::info_span!("created"); + let _guard = span.enter(); + black_box(()); + }) + }); + group.finish(); + } + + { + let mut group = c.benchmark_group("reenter_same_span_depth2"); + group.bench_function("sentry_active", |b| { + bench_sentry_active(b, || { + let span = tracing::info_span!("reenter"); + let _guard1 = span.enter(); + let _guard2 = span.enter(); + black_box(()); + }) + }); + group.bench_function("tracing_only_control", |b| { + bench_tracing_only_control(b, || { + let span = tracing::info_span!("reenter"); + let _guard1 = span.enter(); + let _guard2 = span.enter(); + black_box(()); + }) + }); + group.finish(); + } + + { + let mut group = c.benchmark_group("cross_thread_shared_span"); + group.bench_function("sentry_active", |b| { + bench_sentry_active(b, || { + let span = tracing::info_span!("shared"); + let span_a = span.clone(); + let span_b = span; + + std::thread::scope(|scope| { + scope.spawn(move || { + let _guard = span_a.enter(); + let _child = tracing::info_span!("child_a").entered(); + black_box(()); + }); + scope.spawn(move || { + let _guard = span_b.enter(); + let _child = tracing::info_span!("child_b").entered(); + black_box(()); + }); + }); + }) + }); + group.bench_function("tracing_only_control", |b| { + bench_tracing_only_control(b, || { + let span = tracing::info_span!("shared"); + let span_a = span.clone(); + let span_b = span; + + std::thread::scope(|scope| { + scope.spawn(move || { + let _guard = span_a.enter(); + let _child = tracing::info_span!("child_a").entered(); + black_box(()); + }); + scope.spawn(move || { + let _guard = span_b.enter(); + let _child = tracing::info_span!("child_b").entered(); + black_box(()); + }); + }); + }) + }); + group.finish(); + } +} + +criterion_group!(benches, tracing_layer_perf); +criterion_main!(benches);