From 2e75782f6563f7e005148c0869a9fe2e3b3f61f7 Mon Sep 17 00:00:00 2001 From: Shuheng Liu Date: Tue, 21 Jan 2025 23:03:21 -0500 Subject: [PATCH 01/16] feat: add command to update module version --- src/cls/IPM/General/SemanticVersion.cls | 62 ++++++++++++++++++ src/cls/IPM/Main.cls | 83 +++++++++++++++++++++++++ 2 files changed, 145 insertions(+) diff --git a/src/cls/IPM/General/SemanticVersion.cls b/src/cls/IPM/General/SemanticVersion.cls index 19e13282..9fc4676c 100644 --- a/src/cls/IPM/General/SemanticVersion.cls +++ b/src/cls/IPM/General/SemanticVersion.cls @@ -206,6 +206,68 @@ Method Satisfies(pExpression As %IPM.General.SemanticVersionExpression) As %Bool Quit pExpression.IsSatisfiedBy($this) } +Method WithBumpMajor() As %IPM.General.SemanticVersion +{ + Set tVer = ..%New() + Set tVer.Major = ..Major + 1 + Set tVer.Minor = 0 + Set tVer.Patch = 0 + Set tVer.Prerelease = "" + Set tVer.Build = "" + Quit tVer +} + +Method WithBumpMinor() As %IPM.General.SemanticVersion +{ + Set tVer = ..%New() + Set tVer.Major = ..Major + Set tVer.Minor = ..Minor + 1 + Set tVer.Patch = 0 + Set tVer.Prerelease = "" + Set tVer.Build = "" + Quit tVer +} + +Method WithBumpPatch() As %IPM.General.SemanticVersion +{ + Set tVer = ..%New() + Set tVer.Major = ..Major + Set tVer.Minor = ..Minor + Set tVer.Patch = ..Patch + 1 + Set tVer.Prerelease = "" + Set tVer.Build = "" + Quit tVer +} + +Method WithPrerelease(pPrerelease As %String) As %IPM.General.SemanticVersion +{ + Set tVer = ..%New() + Set tVer.Major = ..Major + Set tVer.Minor = ..Minor + Set tVer.Patch = ..Patch + Set tVer.Prerelease = pPrerelease + Set tVer.Build = ..Build + Quit tVer +} + +Method WithBuild(pBuild As %String) As %IPM.General.SemanticVersion +{ + Set tVer = ..%New() + Set tVer.Major = ..Major + Set tVer.Minor = ..Minor + Set tVer.Patch = ..Patch + Set tVer.Prerelease = ..Prerelease + Set tVer.Build = pBuild + Quit tVer +} + +Method IsLowerThan(pVersion As %IPM.General.SemanticVersion) As %Boolean +{ + Quit (..Major < pVersion.Major) || + ((..Major = pVersion.Major) && (..Minor < pVersion.Minor)) || + ((..Major = pVersion.Major) && (..Minor = pVersion.Minor) && (..Patch < pVersion.Patch)) +} + Storage Default { diff --git a/src/cls/IPM/Main.cls b/src/cls/IPM/Main.cls index 23f98bde..40ef2365 100644 --- a/src/cls/IPM/Main.cls +++ b/src/cls/IPM/Main.cls @@ -714,6 +714,32 @@ generate /my/path -export 00000,PacketName2,IgnorePacket2^00000,PacketName3,Igno + + + Updates the version of the module in the current namespace. + + + + + + + + + + + module-version HS.JSON 1.2.3 + + + module-version HS.JSON major + + + module-version HS.JSON minor -prerelease alpha -build xyz + + + module-version HS.JSON 1.2.3 -permit-downgrade + + + } @@ -890,6 +916,8 @@ ClassMethod ShellInternal(pCommand As %String, Output pException As %Exception.A Do ..EnableIPM(.tCommandInfo) } ElseIf (tCommandInfo = "unmap") { Do ..UnmapIPM(.tCommandInfo) + } ElseIf (tCommandInfo = "module-version") { + Do ..ModuleVersion(.tCommandInfo) } } Catch pException { If (pException.Code = $$$ERCTRLC) { @@ -3258,6 +3286,61 @@ ClassMethod UnmapIPM(ByRef pCommandInfo) } } +ClassMethod ModuleVersion(ByRef pCommandInfo) +{ + Set modName = $Get(pCommandInfo("parameters","module")) + Set quiet = $$$HasModifier(pCommandInfo,"quiet") + Set permitDowngrade = $$$HasModifier(pCommandInfo,"permit-downgrade") + If (modName = "") { + $$$ThrowOnError($$$ERROR($$$GeneralError,"No module name specified.")) + } + Set mod = ##class(%IPM.Storage.Module).NameOpen(modName,.sc) + If mod = "" { + $$$ThrowOnError($$$ERROR($$$GeneralError,"Module "_modName_" not found.")) + } + $$$ThrowOnError(sc) + If 'quiet { + Write !,$$$FormatText("Current version of module %1: %2", modName, mod.VersionString) + } + + // Compute the new semver + Set versionString = $Get(pCommandInfo("parameters","version")) + If versionString = "major" { + Set semver = mod.Version.WithBumpMajor() + } ElseIf versionString = "minor" { + Set semver = mod.Version.WithBumpMinor() + } ElseIf versionString = "patch" { + Set semver = mod.Version.WithBumpPatch() + } Else { + Set semver = ##class(%IPM.General.SemanticVersion).FromString(versionString) + } + + // Validate the semver + If 'semver.%ValidateObject() { + $$$ThrowOnError($$$ERROR($$$GeneralError,"Invalid version string: "_versionString)) + } + + If $$$HasModifier(pCommandInfo,"prerelease") { + Set semver = semver.WithPrerelease($$$GetModifier(pCommandInfo,"prerelease")) + } + If $$$HasModifier(pCommandInfo,"build") { + Set semver = semver.WithBuild($$$GetModifier(pCommandInfo,"build")) + } + + If 'quiet { + Write !,$$$FormatText("Setting version of module %1 to %2", modName, semver.ToString()) + } + + // Ensure semver is not lower than the current version, unless permit-downgrade is set + If ('permitDowngrade) && (semver.IsLowerThan(mod.Version)) { + $$$ThrowOnError($$$ERROR($$$GeneralError,"Cannot set version to "_semver.ToString()_" as it is lower than the current version "_mod.VersionString)) + } + + Set mod.Version = semver + Set mod.VersionString = semver.ToString() + $$$ThrowOnError(mod.%Save()) +} + /// Get the mapping relationship for %IPM package. Format: ///