Skip to content

Commit fc2f3df

Browse files
authoredApr 13, 2023
fix: incorrect results from diff sometimes with prerelease versions (#546)
1 parent 2781767 commit fc2f3df

File tree

2 files changed

+55
-30
lines changed

2 files changed

+55
-30
lines changed
 

‎functions/diff.js

+45-29
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,52 @@ const parse = require('./parse')
33
const diff = (version1, version2) => {
44
const v1 = parse(version1)
55
const v2 = parse(version2)
6-
if (v1.compare(v2) === 0) {
6+
const comparison = v1.compare(v2)
7+
8+
if (comparison === 0) {
79
return null
8-
} else {
9-
const hasPre = v1.prerelease.length || v2.prerelease.length
10-
const prefix = hasPre ? 'pre' : ''
11-
const defaultResult = hasPre ? 'prerelease' : ''
12-
13-
if (v1.major !== v2.major) {
14-
return prefix + 'major'
15-
}
16-
if (v1.minor !== v2.minor) {
17-
return prefix + 'minor'
18-
}
19-
20-
if (v1.patch !== v2.patch) {
21-
return prefix + 'patch'
22-
}
23-
24-
if (!v1.prerelease.length || !v2.prerelease.length) {
25-
if (v1.patch) {
26-
return 'patch'
27-
}
28-
if (v1.minor) {
29-
return 'minor'
30-
}
31-
if (v1.major) {
32-
return 'major'
33-
}
34-
}
35-
return defaultResult // may be undefined
3610
}
11+
12+
const v1Higher = comparison > 0
13+
const highVersion = v1Higher ? v1 : v2
14+
const lowVersion = v1Higher ? v2 : v1
15+
const highHasPre = !!highVersion.prerelease.length
16+
17+
// add the `pre` prefix if we are going to a prerelease version
18+
const prefix = highHasPre ? 'pre' : ''
19+
20+
if (v1.major !== v2.major) {
21+
return prefix + 'major'
22+
}
23+
24+
if (v1.minor !== v2.minor) {
25+
return prefix + 'minor'
26+
}
27+
28+
if (v1.patch !== v2.patch) {
29+
return prefix + 'patch'
30+
}
31+
32+
// at this point we know stable versions match but overall versions are not equal,
33+
// so either they are both prereleases, or the lower version is a prerelease
34+
35+
if (highHasPre) {
36+
// high and low are preleases
37+
return 'prerelease'
38+
}
39+
40+
if (lowVersion.patch) {
41+
// anything higher than a patch bump would result in the wrong version
42+
return 'patch'
43+
}
44+
45+
if (lowVersion.minor) {
46+
// anything higher than a minor bump would result in the wrong version
47+
return 'minor'
48+
}
49+
50+
// bumping major/minor/patch all have same result
51+
return 'major'
3752
}
53+
3854
module.exports = diff

‎test/functions/diff.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,19 @@ test('diff versions test', (t) => {
1919
['1.1.0', '1.1.0-pre', 'minor'],
2020
['1.1.0-pre-1', '1.1.0-pre-2', 'prerelease'],
2121
['1.0.0', '1.0.0', null],
22+
['1.0.0-1', '1.0.0-1', null],
2223
['0.0.2-1', '0.0.2', 'patch'],
24+
['0.0.2-1', '0.0.3', 'patch'],
25+
['0.0.2-1', '0.1.0', 'minor'],
26+
['0.0.2-1', '1.0.0', 'major'],
2327
['0.1.0-1', '0.1.0', 'minor'],
2428
['1.0.0-1', '1.0.0', 'major'],
25-
['0.0.0-1', '0.0.0', 'prerelease'],
29+
['1.0.1-1', '1.0.1', 'patch'],
30+
['0.0.0-1', '0.0.0', 'major'],
31+
['1.0.0-1', '2.0.0', 'major'],
32+
['1.0.0-1', '2.0.0-1', 'premajor'],
33+
['1.0.0-1', '1.1.0-1', 'preminor'],
34+
['1.0.0-1', '1.0.1-1', 'prepatch'],
2635
].forEach((v) => {
2736
const version1 = v[0]
2837
const version2 = v[1]

0 commit comments

Comments
 (0)
Please sign in to comment.