pub(crate) mod starlark;
pub(crate) mod symlink;
pub(crate) mod target_triple;
pub(crate) const CRATES_IO_INDEX_URL: &str = "https://github.com/rust-lang/crates.io-index";
use std::collections::BTreeMap;
use std::path::{Path, PathBuf};
pub(crate) fn sanitize_module_name(name: &str) -> String {
name.replace('-', "_")
}
pub(crate) fn sanitize_repository_name(name: &str) -> String {
name.replace('+', "-")
}
pub(crate) fn normalize_cargo_file_paths(
outputs: BTreeMap<PathBuf, String>,
out_dir: &Path,
) -> BTreeMap<PathBuf, String> {
outputs
.into_iter()
.map(|(path, content)| {
let original_path_str = path.to_str().expect("All file paths should be strings");
let original_parent_path_str = path
.parent()
.expect("Should have parent")
.to_str()
.expect("All file paths should be strings");
let path = if original_parent_path_str.contains('+') {
let new_parent_file_path = sanitize_repository_name(original_parent_path_str);
std::fs::rename(
out_dir.join(original_parent_path_str),
out_dir.join(new_parent_file_path),
)
.expect("Could not rename paths");
PathBuf::from(&original_path_str.replace('+', "-"))
} else {
path
};
let path = out_dir.join(path);
(path, content)
})
.collect()
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_sanitize_repository_name() {
let name = "anyhow-1.0.0+semver_meta";
let got = sanitize_repository_name(name);
assert_eq!(got, String::from("anyhow-1.0.0-semver_meta"));
}
#[test]
fn test_sanitize_repository_name_no_change() {
let name = "tokio-1.20.0";
let got = sanitize_repository_name(name);
assert_eq!(got, String::from("tokio-1.20.0"));
}
#[test]
fn test_normalize_cargo_file_paths() {
let mut outputs = BTreeMap::new();
outputs.insert(
PathBuf::from("libbpf-sys-1.3.0+v1.3.0/BUILD.bazel"),
"contents".into(),
);
let outdir = tempfile::tempdir().unwrap();
std::fs::create_dir_all(outdir.path().join("libbpf-sys-1.3.0+v1.3.0")).unwrap();
let got = normalize_cargo_file_paths(outputs, outdir.path());
for output in got.into_keys() {
assert!(!output.to_str().unwrap().contains('+'));
}
}
#[test]
fn test_normalize_cargo_file_paths_no_rename() {
let mut outputs = BTreeMap::new();
outputs.insert(PathBuf::from("tokio-1.30.0/BUILD.bazel"), "contents".into());
let outdir = tempfile::tempdir().unwrap();
let got = normalize_cargo_file_paths(outputs, outdir.path());
for output in got.into_keys() {
assert!(!output.to_str().unwrap().contains('+'));
}
}
}