diff --git a/appmgr/src/install/mod.rs b/appmgr/src/install/mod.rs index fc6e250cc..d385469da 100644 --- a/appmgr/src/install/mod.rs +++ b/appmgr/src/install/mod.rs @@ -84,27 +84,27 @@ pub async fn list(#[context] ctx: RpcContext) -> Result, ) -> Result, Error> { - let (pkg_id, version_str) = if let Some(split) = id.split_once("@") { - split - } else { - (id.as_str(), "*") + let version_str = match &version_spec { + None => "*", + Some(v) => &*v, }; let version: VersionRange = version_str.parse()?; let reg_url = ctx.package_registry_url().await?; let (man_res, s9pk) = tokio::try_join!( reqwest::get(format!( - "{}/package/manifest/{}?version={}&eos-version-compat={}&arch={}", + "{}/package/manifest/{}?spec={}&eos-version-compat={}&arch={}", reg_url, - pkg_id, + id, version, Current::new().compat(), platforms::TARGET_ARCH, )), reqwest::get(format!( - "{}/package/{}.s9pk?version={}&eos-version-compat={}&arch={}", + "{}/package/{}.s9pk?spec={}&eos-version-compat={}&arch={}", reg_url, - pkg_id, + id, version, Current::new().compat(), platforms::TARGET_ARCH, @@ -319,7 +319,11 @@ pub async fn sideload( } #[instrument(skip(ctx))] -async fn cli_install(ctx: CliContext, target: String) -> Result<(), RpcError> { +async fn cli_install( + ctx: CliContext, + target: String, + version_spec: Option, +) -> Result<(), RpcError> { if target.ends_with(".s9pk") { let path = PathBuf::from(target); @@ -360,11 +364,23 @@ async fn cli_install(ctx: CliContext, target: String) -> Result<(), RpcError> { tracing::info!("Package Upload failed: {}", res.text().await?) } } else { + let params = match (target.split_once("@"), version_spec) { + (Some((pkg, v)), None) => serde_json::json!({ "id": pkg, "version-spec": v }), + (Some((pkg, v)), Some(_)) => { + return Err(crate::Error::new( + eyre!("Invalid package id {}", target), + ErrorKind::InvalidRequest, + ) + .into()) + } + (None, Some(v)) => serde_json::json!({ "id": target, "version-spec": v }), + (None, None) => serde_json::json!({ "id": target }), + }; tracing::debug!("calling package.install"); rpc_toolkit::command_helpers::call_remote( ctx, "package.install", - serde_json::json!({ "id": target }), + params, PhantomData::<()>, ) .await? @@ -580,7 +596,7 @@ pub async fn install_s9pk( let reg_url = ctx.package_registry_url().await?; for (dep, info) in &manifest.dependencies.0 { let manifest: Option = match reqwest::get(format!( - "{}/package/manifest/{}?version={}&eos-version-compat={}&arch={}", + "{}/package/manifest/{}?spec={}&eos-version-compat={}&arch={}", reg_url, dep, info.version, @@ -610,7 +626,7 @@ pub async fn install_s9pk( if tokio::fs::metadata(&icon_path).await.is_err() { tokio::fs::create_dir_all(&dir).await?; let icon = reqwest::get(format!( - "{}/package/icon/{}?version={}&eos-version-compat={}&arch={}", + "{}/package/icon/{}?spec={}&eos-version-compat={}&arch={}", reg_url, dep, info.version, diff --git a/appmgr/src/update/mod.rs b/appmgr/src/update/mod.rs index 655c2ff11..5597a1383 100644 --- a/appmgr/src/update/mod.rs +++ b/appmgr/src/update/mod.rs @@ -329,7 +329,7 @@ impl std::fmt::Display for EosUrl { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( f, - "{}/eos/eos.img?version=={}&eos-version={}&arch={}", + "{}/eos/eos.img?spec=={}&eos-version={}&arch={}", self.base, self.version, Current::new().semver(), diff --git a/ui/src/app/components/install-wizard/prebaked-wizards.ts b/ui/src/app/components/install-wizard/prebaked-wizards.ts index f52b655b5..cacf0e5d5 100644 --- a/ui/src/app/components/install-wizard/prebaked-wizards.ts +++ b/ui/src/app/components/install-wizard/prebaked-wizards.ts @@ -59,7 +59,7 @@ export class WizardBaker { action, verb: 'beginning update for', title, - executeAction: () => this.embassyApi.installPackage({ id, version }), + executeAction: () => this.embassyApi.installPackage({ id, 'version-spec': version ? `=${version}` : undefined }), }, }, bottomBar: { @@ -158,7 +158,7 @@ export class WizardBaker { action, verb: 'beginning downgrade for', title, - executeAction: () => this.embassyApi.installPackage({ id, version }), + executeAction: () => this.embassyApi.installPackage({ id, 'version-spec': version ? `=${version}` : undefined }), }, }, bottomBar: { diff --git a/ui/src/app/pages/apps-routes/app-list/app-list.page.ts b/ui/src/app/pages/apps-routes/app-list/app-list.page.ts index 91c49dee5..52de7e19c 100644 --- a/ui/src/app/pages/apps-routes/app-list/app-list.page.ts +++ b/ui/src/app/pages/apps-routes/app-list/app-list.page.ts @@ -118,7 +118,7 @@ export class AppListPage { async install (pkg: RecoveredInfo): Promise { pkg.installing = true try { - await this.api.installPackage({ id: pkg.id, version: undefined }) + await this.api.installPackage({ id: pkg.id, 'version-spec': undefined }) } catch (e) { this.errToast.present(e) pkg.installing = false diff --git a/ui/src/app/pages/marketplace-routes/marketplace-show/marketplace-show.page.ts b/ui/src/app/pages/marketplace-routes/marketplace-show/marketplace-show.page.ts index 5ac6da8d7..99fafcd12 100644 --- a/ui/src/app/pages/marketplace-routes/marketplace-show/marketplace-show.page.ts +++ b/ui/src/app/pages/marketplace-routes/marketplace-show/marketplace-show.page.ts @@ -191,7 +191,7 @@ export class MarketplaceShowPage { loader.present() try { - await this.embassyApi.installPackage({ id, version }) + await this.embassyApi.installPackage({ id, 'version-spec': version ? `=${version}` : undefined }) } catch (e) { this.errToast.present(e) } finally { diff --git a/ui/src/app/services/api/api.types.ts b/ui/src/app/services/api/api.types.ts index f97c2dc0e..5ba73ed9a 100644 --- a/ui/src/app/services/api/api.types.ts +++ b/ui/src/app/services/api/api.types.ts @@ -142,7 +142,7 @@ export module RR { export type GetPackageMetricsReq = { id: string } // package.metrics export type GetPackageMetricsRes = Metric - export type InstallPackageReq = WithExpire<{ id: string, version: string }> // package.install + export type InstallPackageReq = WithExpire<{ id: string, 'version-spec'?: string }> // package.install export type InstallPackageRes = WithRevision export type DryUpdatePackageReq = { id: string, version: string } // package.update.dry