mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-04-24 22:30:03 +00:00
Fix subcrate resolution for wasm-bindgen-cli
(#1245)
Fixed #1244 Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
parent
aeacebcf83
commit
812fb9b0af
2 changed files with 35 additions and 5 deletions
|
@ -80,7 +80,7 @@ pub trait Fetcher: Send + Sync {
|
||||||
struct RepoInfo {
|
struct RepoInfo {
|
||||||
repo: Url,
|
repo: Url,
|
||||||
repository_host: RepositoryHost,
|
repository_host: RepositoryHost,
|
||||||
subcrate: Option<String>,
|
subcrate: Option<CompactString>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Data required to fetch a package
|
/// Data required to fetch a package
|
||||||
|
@ -133,7 +133,7 @@ impl RepoInfo {
|
||||||
/// If `repo` contains a subcrate, then extracts and returns it.
|
/// If `repo` contains a subcrate, then extracts and returns it.
|
||||||
/// It will also remove that subcrate path from `repo` to match
|
/// It will also remove that subcrate path from `repo` to match
|
||||||
/// `scheme:/{repo_owner}/{repo_name}`
|
/// `scheme:/{repo_owner}/{repo_name}`
|
||||||
fn detect_subcrate(repo: &mut Url, repository_host: RepositoryHost) -> Option<String> {
|
fn detect_subcrate(repo: &mut Url, repository_host: RepositoryHost) -> Option<CompactString> {
|
||||||
match repository_host {
|
match repository_host {
|
||||||
RepositoryHost::GitHub => Self::detect_subcrate_common(repo, &["tree"]),
|
RepositoryHost::GitHub => Self::detect_subcrate_common(repo, &["tree"]),
|
||||||
RepositoryHost::GitLab => Self::detect_subcrate_common(repo, &["-", "blob"]),
|
RepositoryHost::GitLab => Self::detect_subcrate_common(repo, &["-", "blob"]),
|
||||||
|
@ -141,7 +141,7 @@ impl RepoInfo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn detect_subcrate_common(repo: &mut Url, seps: &[&str]) -> Option<String> {
|
fn detect_subcrate_common(repo: &mut Url, seps: &[&str]) -> Option<CompactString> {
|
||||||
let mut path_segments = repo.path_segments()?;
|
let mut path_segments = repo.path_segments()?;
|
||||||
|
|
||||||
let _repo_owner = path_segments.next()?;
|
let _repo_owner = path_segments.next()?;
|
||||||
|
@ -157,13 +157,18 @@ impl RepoInfo {
|
||||||
// Skip branch name
|
// Skip branch name
|
||||||
let _branch_name = path_segments.next()?;
|
let _branch_name = path_segments.next()?;
|
||||||
|
|
||||||
let subcrate = path_segments.next()?;
|
let (subcrate, is_crate_present) = match path_segments.next()? {
|
||||||
|
// subcrate url is of path /crates/$subcrate_name, e.g. wasm-bindgen-cli
|
||||||
|
"crates" => (path_segments.next()?, true),
|
||||||
|
// subcrate url is of path $subcrate_name, e.g. cargo-audit
|
||||||
|
subcrate => (subcrate, false),
|
||||||
|
};
|
||||||
|
|
||||||
if path_segments.next().is_some() {
|
if path_segments.next().is_some() {
|
||||||
// A subcrate url should not contain anything more.
|
// A subcrate url should not contain anything more.
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
let subcrate = subcrate.to_string();
|
let subcrate = subcrate.into();
|
||||||
|
|
||||||
// Pop subcrate path to match regular repo style:
|
// Pop subcrate path to match regular repo style:
|
||||||
//
|
//
|
||||||
|
@ -174,6 +179,9 @@ impl RepoInfo {
|
||||||
let mut paths = repo.path_segments_mut().unwrap();
|
let mut paths = repo.path_segments_mut().unwrap();
|
||||||
|
|
||||||
paths.pop(); // pop subcrate
|
paths.pop(); // pop subcrate
|
||||||
|
if is_crate_present {
|
||||||
|
paths.pop(); // pop crate
|
||||||
|
}
|
||||||
paths.pop(); // pop branch name
|
paths.pop(); // pop branch name
|
||||||
seps.iter().for_each(|_| {
|
seps.iter().for_each(|_| {
|
||||||
paths.pop();
|
paths.pop();
|
||||||
|
@ -198,6 +206,7 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_detect_subcrate_github() {
|
fn test_detect_subcrate_github() {
|
||||||
|
// cargo-audit
|
||||||
let urls = [
|
let urls = [
|
||||||
"https://github.com/RustSec/rustsec/tree/main/cargo-audit",
|
"https://github.com/RustSec/rustsec/tree/main/cargo-audit",
|
||||||
"https://github.com/RustSec/rustsec/tree/master/cargo-audit",
|
"https://github.com/RustSec/rustsec/tree/master/cargo-audit",
|
||||||
|
@ -216,6 +225,26 @@ mod test {
|
||||||
Url::parse("https://github.com/RustSec/rustsec").unwrap()
|
Url::parse("https://github.com/RustSec/rustsec").unwrap()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// wasm-bindgen-cli
|
||||||
|
let urls = [
|
||||||
|
"https://github.com/rustwasm/wasm-bindgen/tree/main/crates/cli",
|
||||||
|
"https://github.com/rustwasm/wasm-bindgen/tree/master/crates/cli",
|
||||||
|
];
|
||||||
|
for url in urls {
|
||||||
|
let mut repo = Url::parse(url).unwrap();
|
||||||
|
|
||||||
|
let repository_host = RepositoryHost::guess_git_hosting_services(&repo);
|
||||||
|
assert_eq!(repository_host, RepositoryHost::GitHub);
|
||||||
|
|
||||||
|
let subcrate_prefix = RepoInfo::detect_subcrate(&mut repo, repository_host).unwrap();
|
||||||
|
assert_eq!(subcrate_prefix, "cli");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
repo,
|
||||||
|
Url::parse("https://github.com/rustwasm/wasm-bindgen").unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -13,6 +13,7 @@ mkdir -p "$othertmpdir/bin"
|
||||||
# Copy it to bin to test use of env var `CARGO`
|
# Copy it to bin to test use of env var `CARGO`
|
||||||
cp "./$1" "$othertmpdir/bin/"
|
cp "./$1" "$othertmpdir/bin/"
|
||||||
|
|
||||||
|
# cargo-audit
|
||||||
cargo binstall --no-confirm cargo-audit@0.17.5 --strategies crate-meta-data
|
cargo binstall --no-confirm cargo-audit@0.17.5 --strategies crate-meta-data
|
||||||
|
|
||||||
cargo_audit_version="$(cargo audit --version)"
|
cargo_audit_version="$(cargo audit --version)"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue