diff --git a/src/cargo/ops/cargo_package/mod.rs b/src/cargo/ops/cargo_package/mod.rs index 73bb0f7570c..0321b5601ad 100644 --- a/src/cargo/ops/cargo_package/mod.rs +++ b/src/cargo/ops/cargo_package/mod.rs @@ -917,8 +917,12 @@ fn tar( header.set_entry_type(EntryType::file()); header.set_mode(0o644); header.set_size(contents.len() as u64); - // use something nonzero to avoid rust-lang/cargo#9512 - header.set_mtime(1); + // We need to have the same DETERMINISTIC_TIMESTAMP for generated files + // https://github.com/alexcrichton/tar-rs/blob/d0261f1f6cc959ba0758e7236b3fd81e90dd1dc6/src/header.rs#L18-L24 + // Unfortunately tar-rs doesn't expose that so we harcode the timestamp here. + // Hardcoded value be removed once alexcrichton/tar-rs#420 is merged and released. + // See also rust-lang/cargo#16237 + header.set_mtime(1153704088); header.set_cksum(); ar.append_data(&mut header, &ar_path, contents.as_bytes()) .with_context(|| format!("could not archive source file `{}`", rel_str))?; diff --git a/tests/testsuite/package.rs b/tests/testsuite/package.rs index 6ed4ba3c5b0..3a12d8cf904 100644 --- a/tests/testsuite/package.rs +++ b/tests/testsuite/package.rs @@ -3162,12 +3162,16 @@ fn reproducible_output() { let f = File::open(&p.root().join("target/package/foo-0.0.1.crate")).unwrap(); let decoder = GzDecoder::new(f); let mut archive = Archive::new(decoder); + + // Hardcoded value be removed once alexcrichton/tar-rs#420 is merged and released. + // See also rust-lang/cargo#16237 + const DETERMINISTIC_TIMESTAMP: u64 = 1153704088; for ent in archive.entries().unwrap() { let ent = ent.unwrap(); println!("checking {:?}", ent.path()); let header = ent.header(); assert_eq!(header.mode().unwrap(), 0o644); - assert!(header.mtime().unwrap() != 0); + assert!(header.mtime().unwrap() == DETERMINISTIC_TIMESTAMP); assert_eq!(header.username().unwrap().unwrap(), ""); assert_eq!(header.groupname().unwrap().unwrap(), ""); }