1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
use anyhow::Context as _;
use clap::Parser;
use wasmer_registry::wasmer_env::WasmerEnv;
/// Publish a package to the package registry.
#[derive(Debug, Parser)]
pub struct Publish {
#[clap(flatten)]
env: WasmerEnv,
/// Run the publish logic without sending anything to the registry server
#[clap(long, name = "dry-run")]
pub dry_run: bool,
/// Run the publish command without any output
#[clap(long)]
pub quiet: bool,
/// Override the package of the uploaded package in the wasmer.toml
#[clap(long)]
pub package_name: Option<String>,
/// Override the package version of the uploaded package in the wasmer.toml
#[clap(long)]
pub version: Option<semver::Version>,
/// Skip validation of the uploaded package
#[clap(long)]
pub no_validate: bool,
/// Directory containing the `wasmer.toml`, or a custom *.toml manifest file.
///
/// Defaults to current working directory.
#[clap(name = "PACKAGE_PATH")]
pub package_path: Option<String>,
/// Wait for package to be available on the registry before exiting.
#[clap(long)]
pub wait: bool,
/// Timeout (in seconds) for the publish query to the registry.
///
/// Note that this is not the timeout for the entire publish process, but
/// for each individual query to the registry during the publish flow.
#[clap(long, default_value = "30s")]
pub timeout: humantime::Duration,
}
impl Publish {
/// Executes `wasmer publish`
pub fn execute(&self) -> Result<(), anyhow::Error> {
let token = self
.env
.token()
.context("could not determine auth token for registry - run 'wasmer login'")?;
let publish = wasmer_registry::package::builder::Publish {
registry: self.env.registry_endpoint().map(|u| u.to_string()).ok(),
dry_run: self.dry_run,
quiet: self.quiet,
package_name: self.package_name.clone(),
version: self.version.clone(),
token,
no_validate: self.no_validate,
package_path: self.package_path.clone(),
wait: self.wait,
timeout: self.timeout.into(),
};
publish.execute().map_err(on_error)?;
if let Err(e) = invalidate_graphql_query_cache(&self.env) {
tracing::warn!(
error = &*e,
"Unable to invalidate the cache used for package version queries",
);
}
Ok(())
}
}
fn on_error(e: anyhow::Error) -> anyhow::Error {
#[cfg(feature = "telemetry")]
sentry::integrations::anyhow::capture_anyhow(&e);
e
}
// HACK: We want to invalidate the cache used for GraphQL queries so
// the current user sees the results of publishing immediately. There
// are cleaner ways to achieve this, but for now we're just going to
// clear out the whole GraphQL query cache.
// See https://github.com/wasmerio/wasmer/pull/3983 for more
fn invalidate_graphql_query_cache(env: &WasmerEnv) -> Result<(), anyhow::Error> {
let cache_dir = env.cache_dir().join("queries");
std::fs::remove_dir_all(cache_dir)?;
Ok(())
}