mirror of
https://github.com/mii443/wasmer.git
synced 2025-12-07 13:18:20 +00:00
Add unit test and fix problems when installing package
This commit is contained in:
@@ -290,7 +290,8 @@ fn try_lookup_command(sv: &mut SplitVersion) -> Result<PackageDownloadInfo, anyh
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn try_execute_local_package(args: &[String], sv: &SplitVersion) -> Result<(), anyhow::Error> {
|
fn try_execute_local_package(args: &[String], sv: &SplitVersion) -> Result<(), anyhow::Error> {
|
||||||
let package = match wasmer_registry::get_local_package(&sv.package, sv.version.as_deref()) {
|
let package = match wasmer_registry::get_local_package(None, &sv.package, sv.version.as_deref())
|
||||||
|
{
|
||||||
Some(p) => p,
|
Some(p) => p,
|
||||||
None => return Err(anyhow::anyhow!("no local package {sv:?} found")),
|
None => return Err(anyhow::anyhow!("no local package {sv:?} found")),
|
||||||
};
|
};
|
||||||
@@ -321,7 +322,7 @@ fn try_autoinstall_package(
|
|||||||
) -> Result<(), anyhow::Error> {
|
) -> Result<(), anyhow::Error> {
|
||||||
let sp = start_spinner(format!("Installing package {} ...", sv.package));
|
let sp = start_spinner(format!("Installing package {} ...", sv.package));
|
||||||
let v = sv.version.as_deref();
|
let v = sv.version.as_deref();
|
||||||
let result = wasmer_registry::install_package(&sv.package, v, package, force_install);
|
let result = wasmer_registry::install_package(None, &sv.package, v, package, force_install);
|
||||||
sp.close();
|
sp.close();
|
||||||
print!("\r\n");
|
print!("\r\n");
|
||||||
let (package, buf) = match result {
|
let (package, buf) = match result {
|
||||||
@@ -461,7 +462,7 @@ fn split_version(s: &str) -> Result<SplitVersion, anyhow::Error> {
|
|||||||
fn print_packages() -> Result<(), anyhow::Error> {
|
fn print_packages() -> Result<(), anyhow::Error> {
|
||||||
use prettytable::{format, row, Table};
|
use prettytable::{format, row, Table};
|
||||||
|
|
||||||
let rows = get_all_local_packages()
|
let rows = get_all_local_packages(None)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|pkg| {
|
.map(|pkg| {
|
||||||
let commands = pkg
|
let commands = pkg
|
||||||
|
|||||||
@@ -488,10 +488,13 @@ fn get_all_names_in_dir(dir: &PathBuf) -> Vec<(PathBuf, String)> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a list of all locally installed packages
|
/// Returns a list of all locally installed packages
|
||||||
pub fn get_all_local_packages() -> Vec<LocalPackage> {
|
pub fn get_all_local_packages(registry: Option<&str>) -> Vec<LocalPackage> {
|
||||||
let mut packages = Vec::new();
|
let mut packages = Vec::new();
|
||||||
|
let registries = match registry {
|
||||||
for registry in get_all_available_registries().unwrap_or_default() {
|
Some(s) => vec![s.to_string()],
|
||||||
|
None => get_all_available_registries().unwrap_or_default(),
|
||||||
|
};
|
||||||
|
for registry in registries {
|
||||||
let host = match url::Url::parse(®istry) {
|
let host = match url::Url::parse(®istry) {
|
||||||
Ok(o) => o.host_str().map(|s| s.to_string()),
|
Ok(o) => o.host_str().map(|s| s.to_string()),
|
||||||
Err(_) => continue,
|
Err(_) => continue,
|
||||||
@@ -533,8 +536,12 @@ pub fn get_all_local_packages() -> Vec<LocalPackage> {
|
|||||||
packages
|
packages
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_local_package(name: &str, version: Option<&str>) -> Option<LocalPackage> {
|
pub fn get_local_package(
|
||||||
get_all_local_packages()
|
registry: Option<&str>,
|
||||||
|
name: &str,
|
||||||
|
version: Option<&str>,
|
||||||
|
) -> Option<LocalPackage> {
|
||||||
|
get_all_local_packages(registry)
|
||||||
.iter()
|
.iter()
|
||||||
.find(|p| {
|
.find(|p| {
|
||||||
if p.name != name {
|
if p.name != name {
|
||||||
@@ -744,9 +751,8 @@ pub fn query_available_packages_from_registry(
|
|||||||
use crate::graphql::{execute_query, get_packages_query, GetPackagesQuery};
|
use crate::graphql::{execute_query, get_packages_query, GetPackagesQuery};
|
||||||
use graphql_client::GraphQLQuery;
|
use graphql_client::GraphQLQuery;
|
||||||
|
|
||||||
let name_query = name.split('/').nth(1).unwrap_or(name);
|
|
||||||
let q = GetPackagesQuery::build_query(get_packages_query::Variables {
|
let q = GetPackagesQuery::build_query(get_packages_query::Variables {
|
||||||
names: vec![name_query.to_string()],
|
names: vec![name.to_string()],
|
||||||
});
|
});
|
||||||
|
|
||||||
let response: get_packages_query::ResponseData =
|
let response: get_packages_query::ResponseData =
|
||||||
@@ -783,7 +789,8 @@ pub fn query_available_packages_from_registry(
|
|||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
.iter()
|
.iter()
|
||||||
.map(|s| s.get_name())
|
.map(|s| s.get_name())
|
||||||
.collect(),
|
.collect::<Vec<_>>()
|
||||||
|
.join(", "),
|
||||||
|
|
||||||
url: v.distribution.download_url.clone(),
|
url: v.distribution.download_url.clone(),
|
||||||
});
|
});
|
||||||
@@ -823,7 +830,7 @@ pub fn query_package_from_registry(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if version == Some(&v.version) {
|
if version != Some(&v.version) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -896,6 +903,7 @@ pub fn download_and_unpack_targz(url: &str, target_path: &Path) -> Result<PathBu
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn install_package(
|
pub fn install_package(
|
||||||
|
registry: Option<&str>,
|
||||||
name: &str,
|
name: &str,
|
||||||
version: Option<&str>,
|
version: Option<&str>,
|
||||||
package_download_info: Option<PackageDownloadInfo>,
|
package_download_info: Option<PackageDownloadInfo>,
|
||||||
@@ -904,7 +912,10 @@ pub fn install_package(
|
|||||||
let package_info = match package_download_info {
|
let package_info = match package_download_info {
|
||||||
Some(s) => s,
|
Some(s) => s,
|
||||||
None => {
|
None => {
|
||||||
let registries = get_all_available_registries()?;
|
let registries = match registry {
|
||||||
|
Some(s) => vec![s.to_string()],
|
||||||
|
None => get_all_available_registries()?,
|
||||||
|
};
|
||||||
let mut url_of_package = None;
|
let mut url_of_package = None;
|
||||||
let mut error_packages = Vec::new();
|
let mut error_packages = Vec::new();
|
||||||
|
|
||||||
@@ -993,7 +1004,7 @@ pub fn install_package(
|
|||||||
let version = package_info.version;
|
let version = package_info.version;
|
||||||
let name = package_info.package;
|
let name = package_info.package;
|
||||||
|
|
||||||
if !dir.join("wapm.toml").exists() {
|
if !dir.join("wapm.toml").exists() || force_install {
|
||||||
download_and_unpack_targz(&package_info.url, &dir)?;
|
download_and_unpack_targz(&package_info.url, &dir)?;
|
||||||
}
|
}
|
||||||
let target_path = dir;
|
let target_path = dir;
|
||||||
@@ -1066,3 +1077,50 @@ pub fn get_all_available_registries() -> Result<Vec<String>, String> {
|
|||||||
}
|
}
|
||||||
Ok(registries)
|
Ok(registries)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_install_package() {
|
||||||
|
let registry = "https://registry.wapm.io/graphql";
|
||||||
|
if !test_if_registry_present(registry).unwrap_or(false) {
|
||||||
|
panic!("registry.wapm.io not reachable, test will fail");
|
||||||
|
}
|
||||||
|
|
||||||
|
let wabt = query_package_from_registry(registry, "wasmer/wabt", Some("1.0.29")).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(wabt.registry, registry);
|
||||||
|
assert_eq!(wabt.package, "wasmer/wabt");
|
||||||
|
assert_eq!(wabt.version, "1.0.29");
|
||||||
|
assert_eq!(
|
||||||
|
wabt.commands,
|
||||||
|
"wat2wasm, wast2json, wasm2wat, wasm-interp, wasm-validate, wasm-strip"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
wabt.url,
|
||||||
|
"https://registry-cdn.wapm.io/packages/wasmer/wabt/wabt-1.0.29.tar.gz".to_string()
|
||||||
|
);
|
||||||
|
|
||||||
|
let (package, _) =
|
||||||
|
install_package(Some(registry), "wasmer/wabt", Some("1.0.29"), None, true).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
package.path,
|
||||||
|
get_global_install_dir("registry.wapm.io")
|
||||||
|
.unwrap()
|
||||||
|
.join("wasmer")
|
||||||
|
.join("wabt")
|
||||||
|
.join("1.0.29")
|
||||||
|
);
|
||||||
|
|
||||||
|
let all_installed_packages = get_all_local_packages(Some(registry));
|
||||||
|
let is_installed = all_installed_packages
|
||||||
|
.iter()
|
||||||
|
.any(|p| p.name == "wasmer/wabt" && p.version == "1.0.29");
|
||||||
|
if !is_installed {
|
||||||
|
let panic_str = get_all_local_packages(Some(registry))
|
||||||
|
.iter()
|
||||||
|
.map(|p| format!("{} {} {}", p.registry, p.name, p.version))
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join("\r\n");
|
||||||
|
panic!("get all local packages: failed to install:\r\n{panic_str}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user