Skip to content

Commit 04efd9c

Browse files
committed
Auto merge of #7523 - bruceg:fix-zero-timestamps, r=alexcrichton
Set timestamp on generated files in archive to now When generating files (Cargo.lock, Cargo.toml, and .cargo_vcs_info.json), cargo neglected to set any timestamp on the file in the archive. This results in them being created on disk with a timestamp of 0 (Jan 1 1970 GMT) which is confusing another tool I use. This patch alters the behavior to set the mtime to now. Signed-off-by: Bruce Guenter <[email protected]>
2 parents 02e0c39 + b33c9e2 commit 04efd9c

File tree

1 file changed

+29
-25
lines changed

1 file changed

+29
-25
lines changed

src/cargo/ops/cargo_package.rs

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
use std::collections::{BTreeSet, HashMap};
2+
use std::fmt::Display;
23
use std::fs::{self, File};
34
use std::io::prelude::*;
45
use std::io::SeekFrom;
56
use std::path::{self, Path, PathBuf};
67
use std::rc::Rc;
78
use std::sync::Arc;
9+
use std::time::SystemTime;
810

911
use flate2::read::GzDecoder;
12+
use flate2::write::GzEncoder;
1013
use flate2::{Compression, GzBuilder};
1114
use log::debug;
1215
use serde_json::{self, json};
@@ -438,16 +441,8 @@ fn tar(
438441
internal(format!("could not archive source file `{}`", relative_str))
439442
})?;
440443

441-
let mut header = Header::new_ustar();
442444
let toml = pkg.to_registry_toml(ws.config())?;
443-
header.set_path(&path)?;
444-
header.set_entry_type(EntryType::file());
445-
header.set_mode(0o644);
446-
header.set_size(toml.len() as u64);
447-
header.set_cksum();
448-
ar.append(&header, toml.as_bytes()).chain_err(|| {
449-
internal(format!("could not archive source file `{}`", relative_str))
450-
})?;
445+
add_generated_file(&mut ar, &path, &toml, relative_str)?;
451446
} else {
452447
header.set_cksum();
453448
ar.append(&header, &mut file).chain_err(|| {
@@ -475,14 +470,7 @@ fn tar(
475470
.set_path(&path)
476471
.chain_err(|| format!("failed to add to archive: `{}`", fnd))?;
477472
let json = format!("{}\n", serde_json::to_string_pretty(json)?);
478-
let mut header = Header::new_ustar();
479-
header.set_path(&path)?;
480-
header.set_entry_type(EntryType::file());
481-
header.set_mode(0o644);
482-
header.set_size(json.len() as u64);
483-
header.set_cksum();
484-
ar.append(&header, json.as_bytes())
485-
.chain_err(|| internal(format!("could not archive source file `{}`", fnd)))?;
473+
add_generated_file(&mut ar, &path, &json, fnd)?;
486474
}
487475

488476
if pkg.include_lockfile() {
@@ -497,14 +485,7 @@ fn tar(
497485
pkg.version(),
498486
path::MAIN_SEPARATOR
499487
);
500-
let mut header = Header::new_ustar();
501-
header.set_path(&path)?;
502-
header.set_entry_type(EntryType::file());
503-
header.set_mode(0o644);
504-
header.set_size(new_lock.len() as u64);
505-
header.set_cksum();
506-
ar.append(&header, new_lock.as_bytes())
507-
.chain_err(|| internal("could not archive source file `Cargo.lock`"))?;
488+
add_generated_file(&mut ar, &path, &new_lock, "Cargo.lock")?;
508489
}
509490

510491
let encoder = ar.into_inner()?;
@@ -786,3 +767,26 @@ fn check_filename(file: &Path) -> CargoResult<()> {
786767
}
787768
Ok(())
788769
}
770+
771+
fn add_generated_file<D: Display>(
772+
ar: &mut Builder<GzEncoder<&File>>,
773+
path: &str,
774+
data: &str,
775+
display: D,
776+
) -> CargoResult<()> {
777+
let mut header = Header::new_ustar();
778+
header.set_path(path)?;
779+
header.set_entry_type(EntryType::file());
780+
header.set_mode(0o644);
781+
header.set_mtime(
782+
SystemTime::now()
783+
.duration_since(SystemTime::UNIX_EPOCH)
784+
.unwrap()
785+
.as_secs(),
786+
);
787+
header.set_size(data.len() as u64);
788+
header.set_cksum();
789+
ar.append(&header, data.as_bytes())
790+
.chain_err(|| internal(format!("could not archive source file `{}`", display)))?;
791+
Ok(())
792+
}

0 commit comments

Comments
 (0)