From 11645cbf28eaf0e978b7a6ea2f5cb7b74c12190f Mon Sep 17 00:00:00 2001 From: Hampus Date: Fri, 2 Oct 2026 15:25:05 +0200 Subject: [PATCH] fix(ci): keep published source maps when a rebuild differs (#3113) --- tools/ci/src/common.rs | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/tools/ci/src/common.rs b/tools/ci/src/common.rs index 6fff33e0d..e1fbc20cc 100644 --- a/tools/ci/src/common.rs +++ b/tools/ci/src/common.rs @@ -562,7 +562,12 @@ pub(crate) fn split_append_only_upload_plan( let mut skipped = Vec::new(); for item in plan { if let Some(remote) = existing_objects.get(&item.key) { - ensure_existing_s3_object_matches_local(bucket, &item, remote)?; + if let Err(error) = ensure_existing_s3_object_matches_local(bucket, &item, remote) { + if !item.key.ends_with(".map") { + return Err(error); + } + println!("Keeping the published source map: {error}"); + } skipped.push(item); } else { pending.push(item); @@ -1159,6 +1164,35 @@ mod tests { assert!(error.to_string().contains("differs from local file")); } + #[test] + fn append_only_plan_keeps_a_published_source_map_that_differs() { + let temp = tempfile::tempdir().unwrap(); + let path = temp.path().join("abc.worker.js.map"); + fs::write(&path, "local").unwrap(); + let plan = vec![S3UploadPlanItem::new( + path, + "assets/abc.worker.js.map".to_string(), + )]; + let existing = BTreeMap::from([( + "assets/abc.worker.js.map".to_string(), + S3ObjectMetadata { + e_tag: Some("\"00000000000000000000000000000000\"".to_string()), + size: Some(9), + }, + )]); + + let (pending, skipped) = split_append_only_upload_plan("bucket", plan, &existing).unwrap(); + + assert!(pending.is_empty()); + assert_eq!( + skipped + .iter() + .map(|item| item.key.as_str()) + .collect::>(), + vec!["assets/abc.worker.js.map"] + ); + } + #[test] fn append_only_plan_rejects_existing_key_without_comparable_etag() { let temp = tempfile::tempdir().unwrap();