diff --git a/src/releaseStats.ts b/src/releaseStats.ts index ce1128c..f81d94c 100644 --- a/src/releaseStats.ts +++ b/src/releaseStats.ts @@ -195,6 +195,9 @@ export function resolveReleaseStats( const installedIsPreRelease = installedVersion && isPreRelease(installedVersion); let latestVersionIs: ReleaseStats['latestVersionIs']; + const latestPreReleaseSamePatchAsLatestStable = + !!latestStableReleaseVersion && + isSamePatchVersion(latestStableReleaseVersion, latestPreReleaseVersion); if (installedVersion) { latestVersionIs = 'installed'; if (canUpdateToStable && !latestPreReleaseIsNewerThanStable) { @@ -228,18 +231,26 @@ export function resolveReleaseStats( } if (options.allowPreRelease && preReleaseAsset && latestPreReleaseVersion) { if (!installedVersion) { - actions.push({ - type: 'install-pre-release', - asset: preReleaseAsset, - to: latestPreReleaseVersion, - }); + if (latestPreReleaseSamePatchAsLatestStable) { + // do not offer pre-release with same patch version as stable + } else { + actions.push({ + type: 'install-pre-release', + asset: preReleaseAsset, + to: latestPreReleaseVersion, + }); + } } else if (canUpdateToPreRelease) { - actions.push({ - type: 'update-pre-release', - asset: preReleaseAsset, - to: latestPreReleaseVersion, - from: installedVersion, - }); + if (latestPreReleaseSamePatchAsLatestStable) { + // do not offer pre-release with same patch version as stable + } else { + actions.push({ + type: 'update-pre-release', + asset: preReleaseAsset, + to: latestPreReleaseVersion, + from: installedVersion, + }); + } } } diff --git a/src/releaseStats.unit.test.ts b/src/releaseStats.unit.test.ts index 0498ba4..a6b7254 100644 --- a/src/releaseStats.unit.test.ts +++ b/src/releaseStats.unit.test.ts @@ -430,7 +430,7 @@ describe('resolveReleaseStats', () => { }, ], [ - 'Pre→stable (newer pre available)', + 'Pre→stable (newer pre available + stable same patch version)', { installed: '1.0.0-beta.1', stableRelease: '1.0.0-release.0', @@ -446,12 +446,6 @@ describe('resolveReleaseStats', () => { from: '1.0.0-beta.1', to: '1.0.0-release.0', }, - { - type: 'update-pre-release', - asset: preAsset, - from: '1.0.0-beta.1', - to: '1.0.0-beta.2', - }, { type: 'uninstall-pre-release', from: '1.0.0-beta.1', @@ -751,6 +745,87 @@ describe('resolveReleaseStats', () => { latestStableRelease: release('1.2.0-release.0', 'stable'), }, ], + [ + 'Latest pre same version as stable, nothing installed', + { + installed: undefined, + stableRelease: '0.96.1-release.12', + preRelease: '0.96.1-beta.1', + allowPreRelease: true, + removeable: true, + }, + { + actions: [ + { + type: 'install-stable', + asset: stableAsset, + to: '0.96.1-release.12', + }, + ], + latestVersionIs: 'stable', + installedVersion: undefined, + latestPreRelease: release('0.96.1-beta.1', 'pre-release'), + latestStableRelease: release('0.96.1-release.12', 'stable'), + }, + ], + [ + 'Latest pre same version as stable, older stable installed', + { + installed: '0.96.0-release.0', + stableRelease: '0.96.1-release.12', + preRelease: '0.96.1-beta.1', + allowPreRelease: true, + removeable: true, + }, + { + actions: [ + { + type: 'update-stable', + asset: stableAsset, + from: '0.96.0-release.0', + to: '0.96.1-release.12', + }, + { + type: 'uninstall', + from: '0.96.0-release.0', + moduleId: 'jaspAcceptanceSampling', + }, + ], + latestVersionIs: 'stable', + installedVersion: '0.96.0-release.0', + latestPreRelease: release('0.96.1-beta.1', 'pre-release'), + latestStableRelease: release('0.96.1-release.12', 'stable'), + }, + ], + [ + 'Latest pre same version as stable, older beta installed', + { + installed: '0.96.0-beta.0', + stableRelease: '0.96.1-release.12', + preRelease: '0.96.1-beta.1', + allowPreRelease: true, + removeable: true, + }, + { + actions: [ + { + type: 'update-stable', + asset: stableAsset, + from: '0.96.0-beta.0', + to: '0.96.1-release.12', + }, + { + type: 'uninstall-pre-release', + from: '0.96.0-beta.0', + moduleId: 'jaspAcceptanceSampling', + }, + ], + latestVersionIs: 'stable', + installedVersion: '0.96.0-beta.0', + latestPreRelease: release('0.96.1-beta.1', 'pre-release'), + latestStableRelease: release('0.96.1-release.12', 'stable'), + }, + ], ])('$0', ([_summary, given, expected]) => { const repo: Repository = { id: 'jaspAcceptanceSampling',