in src/vendor.rs [68:157]
fn filter_checksum_files(
third_party_dir: &Path,
vendordir: &Path,
config: &VendorConfig,
) -> Result<()> {
if config.checksum_exclude.is_empty() && config.gitignore_checksum_exclude.is_empty() {
return Ok(());
}
log::debug!(
"vendor.gitignore_checksum_exclude = {:?} vendor.checksum_exclude = {:?}",
config.gitignore_checksum_exclude,
config.checksum_exclude
);
// re-write checksum files to exclude things we don't want (like Cargo.lock)
let mut remove_globs = GlobSetBuilder::new();
for glob in &config.checksum_exclude {
let glob = GlobBuilder::new(glob)
.literal_separator(true)
.build()
.with_context(|| format!("Invalid checksum exclude glob `{}`", glob))?;
remove_globs.add(glob);
}
let remove_globs = remove_globs.build()?;
let mut gitignore = GitignoreBuilder::new(third_party_dir);
for ignore in &config.gitignore_checksum_exclude {
if let Some(err) = gitignore.add(third_party_dir.join(ignore)) {
log::warn!(
"Failed to read ignore file {}: {}; skipping",
ignore.display(),
err
);
}
}
let gitignore = gitignore.build()?;
log::debug!(
"remove_globs {:#?}, gitignore {:#?}",
remove_globs,
gitignore
);
for entry in fs::read_dir(&third_party_dir.join(vendordir))? {
let entry = entry?;
let path = entry.path(); // full/path/to/vendor/foo-1.2.3
let checksum = path.join(".cargo-checksum.json"); // full/path/to/vendor/foo-1.2.3/.cargo-checksum.json
log::trace!("Reading checksum {}", checksum.display());
let file = match fs::read(&checksum) {
Err(err) => {
log::warn!("Failed to read {}: {}", checksum.display(), err);
continue;
}
Ok(file) => file,
};
let mut checksums: CargoChecksums = match serde_json::from_slice(&file) {
Err(err) => {
log::warn!("Failed to deserialize {}: {}", checksum.display(), err);
continue;
}
Ok(cs) => cs,
};
let mut changed = false;
let pkgdir = relative_path(&third_party_dir, &path); // vendor/foo-1.2.3
checksums.files.retain(|k, _| {
log::trace!("{}: checking {}", checksum.display(), k);
let del =
remove_globs.is_match(k) || gitignore.matched(pkgdir.join(k), false).is_ignore();
if del {
log::debug!("{}: removing {}", checksum.display(), k);
changed = true;
};
!del
});
if changed {
log::info!("Rewriting checksum {}", checksum.display());
fs::write(checksum, serde_json::to_vec(&checksums)?)?;
}
}
Ok(())
}