将fetch pp cache改成使用vcir结构,跑通apnic全量同步
This commit is contained in:
@@ -52,12 +52,8 @@ impl SystemRsyncFetcher {
|
||||
return Ok(None);
|
||||
};
|
||||
|
||||
std::fs::create_dir_all(root).map_err(|e| {
|
||||
format!(
|
||||
"create rsync mirror root failed: {}: {e}",
|
||||
root.display()
|
||||
)
|
||||
})?;
|
||||
std::fs::create_dir_all(root)
|
||||
.map_err(|e| format!("create rsync mirror root failed: {}: {e}", root.display()))?;
|
||||
|
||||
let hash = hex::encode(sha2::Sha256::digest(normalized_rsync_base_uri.as_bytes()));
|
||||
let dir = root.join(hash);
|
||||
@@ -107,7 +103,8 @@ impl RsyncFetcher for SystemRsyncFetcher {
|
||||
.mirror_dst_dir(&base)
|
||||
.map_err(|e| RsyncFetchError::Fetch(e.to_string()))?
|
||||
{
|
||||
self.run_rsync(&base, &dst).map_err(RsyncFetchError::Fetch)?;
|
||||
self.run_rsync(&base, &dst)
|
||||
.map_err(RsyncFetchError::Fetch)?;
|
||||
let mut out = Vec::new();
|
||||
walk_dir_collect(&dst, &dst, &base, &mut out).map_err(RsyncFetchError::Fetch)?;
|
||||
return Ok(out);
|
||||
@@ -249,4 +246,74 @@ mod tests {
|
||||
assert!(e.contains("rsync failed:"), "{e}");
|
||||
assert!(e.contains("status="), "{e}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mirror_dst_dir_reports_root_creation_error() {
|
||||
let temp = tempfile::tempdir().expect("tempdir");
|
||||
let root_file = temp.path().join("mirror-root-file");
|
||||
std::fs::write(&root_file, b"not a directory").expect("write root file");
|
||||
|
||||
let fetcher = SystemRsyncFetcher::new(SystemRsyncConfig {
|
||||
rsync_bin: PathBuf::from("rsync"),
|
||||
timeout: Duration::from_secs(1),
|
||||
extra_args: Vec::new(),
|
||||
mirror_root: Some(root_file.clone()),
|
||||
});
|
||||
|
||||
let err = fetcher
|
||||
.mirror_dst_dir("rsync://example.net/repo/")
|
||||
.expect_err("file mirror root must fail");
|
||||
assert!(err.contains("create rsync mirror root failed"), "{err}");
|
||||
assert!(err.contains(&root_file.display().to_string()), "{err}");
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
#[test]
|
||||
fn mirror_dst_dir_reports_directory_creation_error_inside_root() {
|
||||
use std::os::unix::fs::PermissionsExt;
|
||||
|
||||
let temp = tempfile::tempdir().expect("tempdir");
|
||||
let root = temp.path().join("mirror");
|
||||
std::fs::create_dir_all(&root).expect("mkdir root");
|
||||
let mut perms = std::fs::metadata(&root).expect("metadata").permissions();
|
||||
perms.set_mode(0o555);
|
||||
std::fs::set_permissions(&root, perms).expect("chmod root readonly");
|
||||
|
||||
let fetcher = SystemRsyncFetcher::new(SystemRsyncConfig {
|
||||
rsync_bin: PathBuf::from("rsync"),
|
||||
timeout: Duration::from_secs(1),
|
||||
extra_args: Vec::new(),
|
||||
mirror_root: Some(root.clone()),
|
||||
});
|
||||
|
||||
let err = fetcher
|
||||
.mirror_dst_dir("rsync://example.net/repo/")
|
||||
.expect_err("readonly mirror root must fail");
|
||||
assert!(
|
||||
err.contains("create rsync mirror directory failed"),
|
||||
"{err}"
|
||||
);
|
||||
|
||||
let mut perms = std::fs::metadata(&root).expect("metadata").permissions();
|
||||
perms.set_mode(0o755);
|
||||
std::fs::set_permissions(&root, perms).expect("restore perms");
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
#[test]
|
||||
fn walk_dir_collect_ignores_non_file_entries() {
|
||||
use std::os::unix::net::UnixListener;
|
||||
|
||||
let temp = tempfile::tempdir().expect("tempdir");
|
||||
let root = temp.path();
|
||||
std::fs::write(root.join("a.cer"), b"x").expect("write file");
|
||||
let socket_path = root.join("skip.sock");
|
||||
let _listener = UnixListener::bind(&socket_path).expect("bind socket");
|
||||
|
||||
let mut out: Vec<(String, Vec<u8>)> = Vec::new();
|
||||
walk_dir_collect(root, root, "rsync://example.net/repo/", &mut out).expect("walk");
|
||||
|
||||
assert_eq!(out.len(), 1);
|
||||
assert_eq!(out[0].0, "rsync://example.net/repo/a.cer");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user