From 23fa57323b3279984a996296d3caf39a4f87b176 Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Mon, 9 Nov 2026 17:33:17 +0000 Subject: [PATCH 1/2] fix: broken modified at time cause crash --- packages/app-lib/src/state/cache.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app-lib/src/state/cache.rs b/packages/app-lib/src/state/cache.rs index da0c73a39f..8fd19f5b0c 100644 --- a/packages/app-lib/src/state/cache.rs +++ b/packages/app-lib/src/state/cache.rs @@ -449,7 +449,7 @@ pub(crate) fn file_modified_at_ns( let elapsed = metadata .modified()? .duration_since(std::time::UNIX_EPOCH) - .map_err(std::io::Error::other)?; + .unwrap_or_default(); Ok(elapsed .as_secs() From 9dafb1bad851bc54c5668ccf191426ac895b2107 Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Mon, 9 Nov 2026 18:01:10 +0000 Subject: [PATCH 2/2] fix: rev --- packages/app-lib/src/state/cache.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/app-lib/src/state/cache.rs b/packages/app-lib/src/state/cache.rs index 8fd19f5b0c..43958ec282 100644 --- a/packages/app-lib/src/state/cache.rs +++ b/packages/app-lib/src/state/cache.rs @@ -443,18 +443,25 @@ pub struct KnownModrinthFile<'a> { pub version_id: &'a str, } +/// Returns the file's modification time as signed nanoseconds since the Unix +/// epoch, reinterpreted as `u64` so pre-1970 timestamps stay distinct from one +/// another and cast back to the correct negative `i64`. pub(crate) fn file_modified_at_ns( metadata: &std::fs::Metadata, ) -> std::io::Result { - let elapsed = metadata + let signed_ns = match metadata .modified()? .duration_since(std::time::UNIX_EPOCH) - .unwrap_or_default(); + { + Ok(since_epoch) => { + i64::try_from(since_epoch.as_nanos()).unwrap_or(i64::MAX) + } + Err(before_epoch) => i64::try_from(before_epoch.duration().as_nanos()) + .map(|ns| -ns) + .unwrap_or(i64::MIN), + }; - Ok(elapsed - .as_secs() - .saturating_mul(1_000_000_000) - .saturating_add(u64::from(elapsed.subsec_nanos()))) + Ok(signed_ns as u64) } pub(crate) fn file_hash_cache_key(