fix(ci): fix tests

This commit is contained in:
2026-07-23 21:35:59 +08:00
parent f92cc6ae91
commit 1a6a261cac
2 changed files with 65 additions and 14 deletions

View File

@@ -85,12 +85,7 @@ pub fn package_root_from_registry_info(pkg_info: &JsonValue) -> Result<PathBuf,
return Err("Registry package path is empty".to_string()); return Err("Registry package path is empty".to_string());
} }
let path = Path::new(raw_path); let full_path = registry_path_to_pathbuf(raw_path.trim());
let full_path = if path.is_absolute() {
path.to_path_buf()
} else {
get_registry_cache_root().join(path)
};
if full_path.file_name().and_then(|v| v.to_str()) == Some("dcr.toml") { if full_path.file_name().and_then(|v| v.to_str()) == Some("dcr.toml") {
return full_path return full_path
@@ -102,6 +97,39 @@ pub fn package_root_from_registry_info(pkg_info: &JsonValue) -> Result<PathBuf,
Ok(full_path) Ok(full_path)
} }
pub fn registry_path_to_pathbuf(raw: &str) -> PathBuf {
let s = raw.trim();
if let Some(rest) = s.strip_prefix("file://") {
if rest.len() >= 3 && rest.as_bytes()[0] == b'/' && rest.as_bytes()[2] == b':' {
return PathBuf::from(&rest[1..]);
}
if rest.len() >= 2 && rest.as_bytes()[1] == b':' {
return PathBuf::from(rest);
}
if rest.starts_with('/') {
return PathBuf::from(rest);
}
return PathBuf::from(format!("/{rest}"));
}
let mut s = s.replace('\\', "/");
if let Some(rest) = s.strip_prefix("//?/") {
s = rest.to_string();
} else if let Some(rest) = s.strip_prefix("//./") {
s = rest.to_string();
}
if s.len() >= 3 && s.as_bytes()[0] == b'/' && s.as_bytes()[2] == b':' {
s = s[1..].to_string();
}
let path = PathBuf::from(&s);
if path.is_absolute() || (s.len() >= 2 && s.as_bytes()[1] == b':') || s.starts_with('/') {
path
} else {
get_registry_cache_root().join(path)
}
}
pub fn registry_include_dir(dep_root: &Path) -> PathBuf { pub fn registry_include_dir(dep_root: &Path) -> PathBuf {
dep_root.join("target").join("include") dep_root.join("target").join("include")
} }
@@ -244,4 +272,19 @@ mod tests {
); );
let _ = std::fs::remove_dir_all(&root); let _ = std::fs::remove_dir_all(&root);
} }
#[test]
fn registry_path_strips_windows_extended_prefix() {
let p = registry_path_to_pathbuf("//?/D:/cache/mylib");
let s = p.to_string_lossy().replace('\\', "/");
assert_eq!(s, "D:/cache/mylib");
let p2 = registry_path_to_pathbuf("/D:/cache/mylib");
let s2 = p2.to_string_lossy().replace('\\', "/");
assert_eq!(s2, "D:/cache/mylib");
let p3 = registry_path_to_pathbuf("file:///D:/cache/mylib");
let s3 = p3.to_string_lossy().replace('\\', "/");
assert_eq!(s3, "D:/cache/mylib");
}
} }

View File

@@ -117,16 +117,24 @@ fn registry_dependency_is_built_from_cache() {
"[registry.local]\nurl = \"file://local\"\npriority = 1\n", "[registry.local]\nurl = \"file://local\"\npriority = 1\n",
) )
.expect("failed to write registry config"); .expect("failed to write registry config");
let dep_path = dep let dep_abs = dep.canonicalize().unwrap_or(dep.clone());
.canonicalize() let mut dep_path = dep_abs.to_string_lossy().replace('\\', "/");
.unwrap_or(dep.clone()) if let Some(rest) = dep_path.strip_prefix("//?/") {
.to_string_lossy() dep_path = rest.to_string();
.replace('\\', "/"); }
if dep_path.len() >= 3 && dep_path.as_bytes()[0] == b'/' && dep_path.as_bytes()[2] == b':' {
dep_path = dep_path[1..].to_string();
}
std::fs::write( std::fs::write(
dcr_home.join("index.json"), dcr_home.join("index.json"),
format!( serde_json::json!({
"{{\"packages\":[{{\"name\":\"mylib\",\"latest_version\":\"0.1.0\",\"path\":\"{dep_path}\"}}]}}" "packages": [{
), "name": "mylib",
"latest_version": "0.1.0",
"path": dep_path
}]
})
.to_string(),
) )
.expect("failed to write registry index"); .expect("failed to write registry index");