From 65b34a85d9e6bf18ec80b36e6b0886064e0fc03e Mon Sep 17 00:00:00 2001 From: Tom Jenkinson Date: Tue, 11 Apr 2023 11:05:26 -0700 Subject: [PATCH 1/6] fix: diff giving wrong result when going prerelease => stable `0.0.2-1` => `0.0.3` should be `patch` not `prepatch` --- functions/diff.js | 5 ++++- test/functions/diff.js | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/functions/diff.js b/functions/diff.js index ce9004bd..84bc1ba6 100644 --- a/functions/diff.js +++ b/functions/diff.js @@ -1,5 +1,6 @@ const parse = require('./parse') const eq = require('./eq') +const gt = require('./gt') const diff = (version1, version2) => { const v1 = parse(version1) @@ -7,13 +8,15 @@ const diff = (version1, version2) => { if (eq(v1, v2)) { return null } else { - const hasPre = v1.prerelease.length || v2.prerelease.length + const highVersion = gt(v1, v2) ? v1 : v2 + const hasPre = highVersion.prerelease.length const prefix = hasPre ? 'pre' : '' const defaultResult = hasPre ? 'prerelease' : '' if (v1.major !== v2.major) { return prefix + 'major' } + if (v1.minor !== v2.minor) { return prefix + 'minor' } diff --git a/test/functions/diff.js b/test/functions/diff.js index 11663c95..2eb75fbc 100644 --- a/test/functions/diff.js +++ b/test/functions/diff.js @@ -20,6 +20,9 @@ test('diff versions test', (t) => { ['1.1.0-pre-1', '1.1.0-pre-2', 'prerelease'], ['1.0.0', '1.0.0', null], ['0.0.2-1', '0.0.2', 'patch'], + ['0.0.2-1', '0.0.3', 'patch'], + ['0.0.2-1', '0.1.0', 'minor'], + ['0.0.2-1', '1.0.0', 'major'], ['0.1.0-1', '0.1.0', 'minor'], ['1.0.0-1', '1.0.0', 'major'], ['0.0.0-1', '0.0.0', 'prerelease'], From 891b7dab49968768d88142c39778fa2427198ea0 Mon Sep 17 00:00:00 2001 From: Tom Jenkinson Date: Tue, 11 Apr 2023 14:45:15 -0700 Subject: [PATCH 2/6] fix: incorrect diff when going from 0.0.0 prerelease to 0.0.0 --- functions/diff.js | 59 ++++++++++++++++++++++++------------------ test/functions/diff.js | 5 +++- 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/functions/diff.js b/functions/diff.js index 84bc1ba6..cf49d0ed 100644 --- a/functions/diff.js +++ b/functions/diff.js @@ -7,36 +7,45 @@ const diff = (version1, version2) => { const v2 = parse(version2) if (eq(v1, v2)) { return null - } else { - const highVersion = gt(v1, v2) ? v1 : v2 - const hasPre = highVersion.prerelease.length - const prefix = hasPre ? 'pre' : '' - const defaultResult = hasPre ? 'prerelease' : '' - - if (v1.major !== v2.major) { - return prefix + 'major' - } + } - if (v1.minor !== v2.minor) { - return prefix + 'minor' - } + const v1Higher = gt(v1, v2) + const highVersion = v1Higher ? v1 : v2 + const lowVersion = v1Higher ? v2 : v1 + const highHasPre = !!highVersion.prerelease.length + const lowHasPre = !!lowVersion.prerelease.length + const prefix = highHasPre ? 'pre' : '' - if (v1.patch !== v2.patch) { - return prefix + 'patch' + if (v1.major !== v2.major) { + return prefix + 'major' + } + + if (v1.minor !== v2.minor) { + return prefix + 'minor' + } + + if (v1.patch !== v2.patch) { + return prefix + 'patch' + } + + if (lowHasPre && !highHasPre) { + if (lowVersion.patch) { + // anything higher than a patch bump would result in the wrong version + return 'patch' } - if (!v1.prerelease.length || !v2.prerelease.length) { - if (v1.patch) { - return 'patch' - } - if (v1.minor) { - return 'minor' - } - if (v1.major) { - return 'major' - } + if (lowVersion.minor) { + // anything higher than a minor bump would result in the wrong version + return 'minor' } - return defaultResult // may be undefined + + // bumping major/minor/patch all have same result + return 'major' } + + // at this point it must be that both are prereleases and + // prelease parts are different because we know the 2 versions + // are not equal + return 'prerelease' } module.exports = diff diff --git a/test/functions/diff.js b/test/functions/diff.js index 2eb75fbc..c93d55fb 100644 --- a/test/functions/diff.js +++ b/test/functions/diff.js @@ -19,13 +19,16 @@ test('diff versions test', (t) => { ['1.1.0', '1.1.0-pre', 'minor'], ['1.1.0-pre-1', '1.1.0-pre-2', 'prerelease'], ['1.0.0', '1.0.0', null], + ['1.0.0-1', '1.0.0-1', null], ['0.0.2-1', '0.0.2', 'patch'], ['0.0.2-1', '0.0.3', 'patch'], ['0.0.2-1', '0.1.0', 'minor'], ['0.0.2-1', '1.0.0', 'major'], ['0.1.0-1', '0.1.0', 'minor'], ['1.0.0-1', '1.0.0', 'major'], - ['0.0.0-1', '0.0.0', 'prerelease'], + ['1.0.1-1', '1.0.1', 'patch'], + ['0.0.0-1', '0.0.0', 'major'], + ['1.0.0-1', '2.0.0', 'major'], ].forEach((v) => { const version1 = v[0] const version2 = v[1] From f8c38e9b965a0289c9ce9f07891ee2ed7ef3a514 Mon Sep 17 00:00:00 2001 From: Tom Jenkinson Date: Tue, 11 Apr 2023 14:47:05 -0700 Subject: [PATCH 3/6] fix: diff not pre* when stable part of 2 prereleases changes I.e. `1.0.0-1` => `2.0.0-1` should be `major` not `premajor`, because the biggest change is the major version --- functions/diff.js | 2 +- test/functions/diff.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/functions/diff.js b/functions/diff.js index cf49d0ed..81f0867d 100644 --- a/functions/diff.js +++ b/functions/diff.js @@ -14,7 +14,7 @@ const diff = (version1, version2) => { const lowVersion = v1Higher ? v2 : v1 const highHasPre = !!highVersion.prerelease.length const lowHasPre = !!lowVersion.prerelease.length - const prefix = highHasPre ? 'pre' : '' + const prefix = highHasPre && !lowHasPre ? 'pre' : '' if (v1.major !== v2.major) { return prefix + 'major' diff --git a/test/functions/diff.js b/test/functions/diff.js index c93d55fb..b0e02d2d 100644 --- a/test/functions/diff.js +++ b/test/functions/diff.js @@ -29,6 +29,9 @@ test('diff versions test', (t) => { ['1.0.1-1', '1.0.1', 'patch'], ['0.0.0-1', '0.0.0', 'major'], ['1.0.0-1', '2.0.0', 'major'], + ['1.0.0-1', '2.0.0-1', 'major'], + ['1.0.0-1', '1.1.0-1', 'minor'], + ['1.0.0-1', '1.0.1-1', 'patch'], ].forEach((v) => { const version1 = v[0] const version2 = v[1] From 2c37998c8bdbb6b5fc4ba0253b62f71726f2b605 Mon Sep 17 00:00:00 2001 From: Tom Jenkinson Date: Tue, 11 Apr 2023 16:04:34 -0700 Subject: [PATCH 4/6] fix: refactor to remove level of nesting --- functions/diff.js | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/functions/diff.js b/functions/diff.js index 81f0867d..a27791c7 100644 --- a/functions/diff.js +++ b/functions/diff.js @@ -28,24 +28,26 @@ const diff = (version1, version2) => { return prefix + 'patch' } - if (lowHasPre && !highHasPre) { - if (lowVersion.patch) { - // anything higher than a patch bump would result in the wrong version - return 'patch' - } - - if (lowVersion.minor) { - // anything higher than a minor bump would result in the wrong version - return 'minor' - } - - // bumping major/minor/patch all have same result - return 'major' + // at this point we know stable versions match but overall versions are not equal, + // so either they are both prereleases, or the lower version is a prerelease + + if (highHasPre) { + // high and low are preleases + return 'prerelease' + } + + if (lowVersion.patch) { + // anything higher than a patch bump would result in the wrong version + return 'patch' } - // at this point it must be that both are prereleases and - // prelease parts are different because we know the 2 versions - // are not equal - return 'prerelease' + if (lowVersion.minor) { + // anything higher than a minor bump would result in the wrong version + return 'minor' + } + + // bumping major/minor/patch all have same result + return 'major' } + module.exports = diff From 89ae1fef1c6c4c36f3c4be27abc65481fa826017 Mon Sep 17 00:00:00 2001 From: Tom Jenkinson Date: Wed, 12 Apr 2023 15:12:55 -0700 Subject: [PATCH 5/6] add comment about prefix --- functions/diff.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/functions/diff.js b/functions/diff.js index 5ce47870..bd88d9b0 100644 --- a/functions/diff.js +++ b/functions/diff.js @@ -14,6 +14,9 @@ const diff = (version1, version2) => { const lowVersion = v1Higher ? v2 : v1 const highHasPre = !!highVersion.prerelease.length const lowHasPre = !!lowVersion.prerelease.length + + // add the `pre` prefix if we are going from a stable version + // to a prerelease one const prefix = highHasPre && !lowHasPre ? 'pre' : '' if (v1.major !== v2.major) { From f3fd4db918be960d6dd2334b1482dfa8d44a0091 Mon Sep 17 00:00:00 2001 From: Tom Jenkinson Date: Wed, 12 Apr 2023 17:38:55 -0700 Subject: [PATCH 6/6] fix: make it `pre*` from diff if going to a prerelease version --- functions/diff.js | 6 ++---- test/functions/diff.js | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/functions/diff.js b/functions/diff.js index bd88d9b0..d15b1def 100644 --- a/functions/diff.js +++ b/functions/diff.js @@ -13,11 +13,9 @@ const diff = (version1, version2) => { const highVersion = v1Higher ? v1 : v2 const lowVersion = v1Higher ? v2 : v1 const highHasPre = !!highVersion.prerelease.length - const lowHasPre = !!lowVersion.prerelease.length - // add the `pre` prefix if we are going from a stable version - // to a prerelease one - const prefix = highHasPre && !lowHasPre ? 'pre' : '' + // add the `pre` prefix if we are going to a prerelease version + const prefix = highHasPre ? 'pre' : '' if (v1.major !== v2.major) { return prefix + 'major' diff --git a/test/functions/diff.js b/test/functions/diff.js index b0e02d2d..aa35c3d0 100644 --- a/test/functions/diff.js +++ b/test/functions/diff.js @@ -29,9 +29,9 @@ test('diff versions test', (t) => { ['1.0.1-1', '1.0.1', 'patch'], ['0.0.0-1', '0.0.0', 'major'], ['1.0.0-1', '2.0.0', 'major'], - ['1.0.0-1', '2.0.0-1', 'major'], - ['1.0.0-1', '1.1.0-1', 'minor'], - ['1.0.0-1', '1.0.1-1', 'patch'], + ['1.0.0-1', '2.0.0-1', 'premajor'], + ['1.0.0-1', '1.1.0-1', 'preminor'], + ['1.0.0-1', '1.0.1-1', 'prepatch'], ].forEach((v) => { const version1 = v[0] const version2 = v[1]