Fix --package-name on wasmer init

This commit is contained in:
Felix Schütt
2022-12-16 12:04:04 +01:00
parent c1966702e2
commit ad5b9f2595

View File

@@ -31,6 +31,9 @@ pub struct Init {
/// Namespace to init with, default = current logged in user or _ /// Namespace to init with, default = current logged in user or _
#[clap(long)] #[clap(long)]
pub namespace: Option<String>, pub namespace: Option<String>,
/// Package name to init with, default = Cargo.toml name or current directory name
#[clap(long)]
pub package_name: Option<String>,
/// Version of the initialized package /// Version of the initialized package
#[clap(long)] #[clap(long)]
pub version: Option<semver::Version>, pub version: Option<semver::Version>,
@@ -110,18 +113,19 @@ impl Init {
None None
}; };
let (package_name, target_file) = self.target_file()?; let (fallback_package_name, target_file) = self.target_file()?;
if target_file.exists() && !self.overwrite { if target_file.exists() && !self.overwrite {
anyhow::bail!( anyhow::bail!(
"wapm project already initialized in {}", "wasmer project already initialized in {}",
target_file.display(), target_file.display(),
); );
} }
let constructed_manifest = construct_manifest( let constructed_manifest = construct_manifest(
cargo_toml.as_ref(), cargo_toml.as_ref(),
&package_name, &fallback_package_name,
self.package_name.as_deref(),
&target_file, &target_file,
&manifest_path, &manifest_path,
bin_or_lib, bin_or_lib,
@@ -161,21 +165,32 @@ impl Init {
match self.out.as_ref() { match self.out.as_ref() {
None => { None => {
let current_dir = std::env::current_dir()?; let current_dir = std::env::current_dir()?;
let package_name = current_dir let package_name = self
.canonicalize()? .package_name
.file_stem() .clone()
.and_then(|s| s.to_str()) .or_else(|| {
.map(|s| s.to_string()) current_dir
.canonicalize()
.ok()?
.file_stem()
.and_then(|s| s.to_str())
.map(|s| s.to_string())
})
.ok_or_else(|| anyhow::anyhow!("no current dir name"))?; .ok_or_else(|| anyhow::anyhow!("no current dir name"))?;
Ok((package_name, current_dir.join(WASMER_TOML_NAME))) Ok((package_name, current_dir.join(WASMER_TOML_NAME)))
} }
Some(s) => { Some(s) => {
let _ = std::fs::create_dir_all(s); let _ = std::fs::create_dir_all(s);
let package_name = s let package_name = self
.canonicalize()? .package_name
.file_stem() .clone()
.and_then(|s| s.to_str()) .or_else(|| {
.map(|s| s.to_string()) s.canonicalize()
.ok()?
.file_stem()
.and_then(|s| s.to_str())
.map(|s| s.to_string())
})
.ok_or_else(|| anyhow::anyhow!("no dir name"))?; .ok_or_else(|| anyhow::anyhow!("no dir name"))?;
Ok((package_name, s.join(WASMER_TOML_NAME))) Ok((package_name, s.join(WASMER_TOML_NAME)))
} }
@@ -320,7 +335,8 @@ impl GetBindingsResult {
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
fn construct_manifest( fn construct_manifest(
cargo_toml: Option<&MiniCargoTomlPackage>, cargo_toml: Option<&MiniCargoTomlPackage>,
package_name: &String, fallback_package_name: &String,
package_name: Option<&str>,
target_file: &Path, target_file: &Path,
manifest_path: &Path, manifest_path: &Path,
bin_or_lib: BinOrLib, bin_or_lib: BinOrLib,
@@ -330,7 +346,12 @@ fn construct_manifest(
include_fs: &[String], include_fs: &[String],
quiet: bool, quiet: bool,
) -> wapm_toml::Manifest { ) -> wapm_toml::Manifest {
let package_name = cargo_toml.as_ref().map(|p| &p.name).unwrap_or(package_name); let package_name = package_name.unwrap_or_else(|| {
cargo_toml
.as_ref()
.map(|p| &p.name)
.unwrap_or(fallback_package_name)
});
let namespace = namespace.or_else(|| wasmer_registry::whoami(None, None).ok().map(|o| o.1)); let namespace = namespace.or_else(|| wasmer_registry::whoami(None, None).ok().map(|o| o.1));
let version = version.unwrap_or_else(|| { let version = version.unwrap_or_else(|| {
cargo_toml cargo_toml
@@ -412,9 +433,12 @@ fn construct_manifest(
wapm_toml::Manifest { wapm_toml::Manifest {
package: wapm_toml::Package { package: wapm_toml::Package {
name: match namespace { name: if wasmer_registry::Package::validate_package_name(&package_name) {
None => package_name.to_string(), package_name.to_string()
Some(s) => format!("{s}/{package_name}"), } else if let Some(s) = namespace {
format!("{s}/{package_name}")
} else {
package_name.to_string()
}, },
version, version,
description, description,