a0178d28f7
* wasm: mix-fetch: remove harbour master client and use Nym API client * wasm: mix-fetch: fix up internal tester * Release Typescript SDK v1.4.1 * remove bump version tool from workspace * ts-sdk: contract clients: update and re-run autogen * ts: fix linting errors * update go * pin minimatch typings to fix lint errors * bump versions to rc * Update publish-sdk-npm.yml * Update publish-sdk-npm.yml * Update publish-sdk-npm.yml * Update publish-sdk-npm.yml * try disable typedoc because of minimatch errors * bump versions to rc0 * limit packages published to only wasm clients * TS SDK 1.4.1-rc1 * simplify version dependencies and add dist to dev mode * add back version complexity for CI * TS SDK 1.4.1-rc2 * ts-sdk: fix minimatch dependency and correct casing on `selfAddress` function call * wasm: rename `main` to `main_js` to avoid collision errors in exporting main from tests see https://github.com/wasm-bindgen/wasm-bindgen/issues/2206 * improve wasm js tests * TS SDK 1.4.1-rc3 * update example docs * TS SDK 1.4.1 release * update docs dependencies to SDK 1.4.1 * update yarn lock file after TS SDK 1.4.1 publish * Update ci-lint-typescript.yml * Update ci-lint-typescript.yml * Update ci-nym-wallet-storybook.yml * Bump node tester version and add additional yarn install step to fix linting --------- Co-authored-by: Mark Sinclair <mmsinclair@users.noreply.github.com>
179 lines
5.4 KiB
Rust
179 lines
5.4 KiB
Rust
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
use anyhow::{Context, bail};
|
|
use semver::{Prerelease, Version};
|
|
use std::collections::HashSet;
|
|
use std::path::Path;
|
|
|
|
pub(crate) trait ReleasePackage: Sized {
|
|
fn type_name() -> &'static str;
|
|
|
|
fn open<P: AsRef<Path>>(path: P) -> anyhow::Result<Self>;
|
|
|
|
fn save_changes(&mut self) -> anyhow::Result<()>;
|
|
|
|
fn get_current_version(&self) -> anyhow::Result<Version>;
|
|
|
|
fn set_version(&mut self, version: &Version);
|
|
|
|
fn remove_suffix(&mut self) -> anyhow::Result<()> {
|
|
let version = self.get_current_version()?;
|
|
let updated = version.try_remove_prerelease()?;
|
|
|
|
println!("\t>>> changing version from {version} to {updated}");
|
|
self.set_version(&updated);
|
|
Ok(())
|
|
}
|
|
|
|
fn bump_version(&mut self, pre_release: bool) -> anyhow::Result<()> {
|
|
let version = self.get_current_version()?;
|
|
let updated = if pre_release {
|
|
if version.pre.is_empty() {
|
|
let patch_updated = version.try_bump_patch_without_pre()?;
|
|
patch_updated.set_initial_release_candidate()?
|
|
} else {
|
|
version.try_bump_prerelease()?
|
|
}
|
|
} else {
|
|
version.try_bump_patch_without_pre()?
|
|
};
|
|
|
|
println!("\t>>> changing version from {version} to {updated}");
|
|
self.set_version(&updated);
|
|
Ok(())
|
|
}
|
|
|
|
fn update_nym_dependencies(&mut self, _: &HashSet<String>, _: bool) -> anyhow::Result<()> {
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
pub(crate) trait VersionBumpExt: Sized {
|
|
fn try_bump_prerelease(&self) -> anyhow::Result<Self>;
|
|
fn try_bump_patch_without_pre(&self) -> anyhow::Result<Self>;
|
|
|
|
fn set_initial_release_candidate(&self) -> anyhow::Result<Self>;
|
|
fn try_remove_prerelease(&self) -> anyhow::Result<Self>;
|
|
}
|
|
|
|
pub(crate) fn try_bump_raw_prerelease(raw: &str) -> anyhow::Result<Prerelease> {
|
|
// ugh that's disgusting
|
|
let (rc_prefix, pre_version) = raw
|
|
.split_once('.')
|
|
.context("the prerelease version does not contain a valid rc.X suffix")?;
|
|
|
|
let parsed_version: u32 = pre_version.parse()?;
|
|
let updated_version = parsed_version + 1;
|
|
|
|
Ok(format!("{rc_prefix}.{updated_version}").parse()?)
|
|
}
|
|
|
|
impl VersionBumpExt for Version {
|
|
fn try_bump_prerelease(&self) -> anyhow::Result<Self> {
|
|
if self.pre.is_empty() {
|
|
bail!(
|
|
"the current version ({self}) does not have pre-release data set - are you sure you followed the release process correctly?"
|
|
)
|
|
}
|
|
|
|
Ok(Version {
|
|
major: self.major,
|
|
minor: self.minor,
|
|
patch: self.patch,
|
|
pre: try_bump_raw_prerelease(self.pre.as_str())?,
|
|
build: self.build.clone(),
|
|
})
|
|
}
|
|
|
|
fn try_bump_patch_without_pre(&self) -> anyhow::Result<Self> {
|
|
if !self.pre.is_empty() {
|
|
bail!(
|
|
"the current version ({self}) has pre-release data set - are you sure you followed the release process correctly?"
|
|
)
|
|
}
|
|
|
|
let mut updated = self.clone();
|
|
updated.patch += 1;
|
|
Ok(updated)
|
|
}
|
|
|
|
fn set_initial_release_candidate(&self) -> anyhow::Result<Self> {
|
|
if !self.pre.is_empty() {
|
|
bail!(
|
|
"the current version ({self}) has pre-release data set - are you sure you followed the release process correctly?"
|
|
)
|
|
}
|
|
Ok(Version {
|
|
major: self.major,
|
|
minor: self.minor,
|
|
patch: self.patch,
|
|
pre: Prerelease::new("rc.0")?,
|
|
build: self.build.clone(),
|
|
})
|
|
}
|
|
|
|
fn try_remove_prerelease(&self) -> anyhow::Result<Self> {
|
|
if self.pre.is_empty() {
|
|
bail!(
|
|
"the current version ({self}) does not have pre-release data set - are you sure you followed the release process correctly?"
|
|
)
|
|
}
|
|
Ok(Version {
|
|
major: self.major,
|
|
minor: self.minor,
|
|
patch: self.patch,
|
|
pre: Default::default(),
|
|
build: self.build.clone(),
|
|
})
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use semver::Version;
|
|
|
|
#[test]
|
|
fn bump_patch_version() {
|
|
let cases = [
|
|
("1.0.0", Some("1.0.1")),
|
|
("2.3.0", Some("2.3.1")),
|
|
("1.0.0-rc.0", None),
|
|
("1.0.0-rc.foomp", None),
|
|
];
|
|
|
|
for (raw, expected) in cases {
|
|
let updated = Version::parse(raw).unwrap().try_bump_patch_without_pre();
|
|
if let Some(expected) = expected {
|
|
let expected = Version::parse(expected).unwrap();
|
|
assert_eq!(expected, updated.unwrap())
|
|
} else {
|
|
assert!(updated.is_err())
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn bump_rc_version() {
|
|
let cases = [
|
|
("1.0.0", None),
|
|
("1.0.0-rc.0", Some("1.0.0-rc.1")),
|
|
("1.0.0-rc.-1", None),
|
|
("1.2.3-rc.42", Some("1.2.3-rc.43")),
|
|
("1.2.3-rc42", None),
|
|
("1.0.0-rc.foomp", None),
|
|
];
|
|
|
|
for (raw, expected) in cases {
|
|
let updated = Version::parse(raw).unwrap().try_bump_prerelease();
|
|
if let Some(expected) = expected {
|
|
let expected = Version::parse(expected).unwrap();
|
|
assert_eq!(expected, updated.unwrap())
|
|
} else {
|
|
assert!(updated.is_err())
|
|
}
|
|
}
|
|
}
|
|
}
|