diff --git a/lib/versioning/maven/compare.ts b/lib/versioning/maven/compare.ts index af22f91bdabf94f7cce0c7d012558985025ad925..767661d93b1ca104277387847fafdc97098655e5 100644 --- a/lib/versioning/maven/compare.ts +++ b/lib/versioning/maven/compare.ts @@ -160,22 +160,32 @@ function commonOrder(token: Token): number { return 3; } -function qualifierOrder(token: Token): number { +export enum QualifierTypes { + Alpha = 1, + Beta, + Milestone, + RC, + Snapshot, + Release, + SP, +} + +export function qualifierType(token: Token): number { const val = token.val; if (val === 'alpha' || (token.isTransition && val === 'a')) { - return 1; + return QualifierTypes.Alpha; } if (val === 'beta' || (token.isTransition && val === 'b')) { - return 2; + return QualifierTypes.Beta; } if (val === 'milestone' || (token.isTransition && val === 'm')) { - return 3; + return QualifierTypes.Milestone; } if (val === 'rc' || val === 'cr') { - return 4; + return QualifierTypes.RC; } if (val === 'snapshot') { - return 5; + return QualifierTypes.Snapshot; } if ( val === '' || @@ -184,65 +194,45 @@ function qualifierOrder(token: Token): number { val === 'release' || val === 'latest' ) { - return 6; + return QualifierTypes.Release; } if (val === 'sp') { - return 7; + return QualifierTypes.SP; } return null; } function qualifierCmp(left: Token, right: Token): number { - const leftOrder = qualifierOrder(left); - const rightOrder = qualifierOrder(right); + const leftOrder = qualifierType(left); + const rightOrder = qualifierType(right); if (leftOrder && rightOrder) { - if (leftOrder === rightOrder) { - return 0; - } - if (leftOrder < rightOrder) { - return -1; - } - return 1; - } - if (left.val === right.val) { + if (leftOrder < rightOrder) return -1; + if (leftOrder > rightOrder) return 1; return 0; } - if (left.val < right.val) { - return -1; - } - // istanbul ignore next - return 1; + + if (leftOrder && leftOrder < QualifierTypes.Release) return -1; + if (rightOrder && rightOrder < QualifierTypes.Release) return 1; + + if (left.val < right.val) return -1; + if (left.val > right.val) return 1; + return 0; } function tokenCmp(left: Token, right: Token): number { - if (left.prefix === right.prefix) { - if (left.type === TYPE_NUMBER && right.type === TYPE_NUMBER) { - if (left.val === right.val) { - return 0; - } - if (left.val < right.val) { - return -1; - } - return 1; - } - if (left.type === TYPE_NUMBER) { - return 1; - } - if (right.type === TYPE_NUMBER) { - return -1; - } - return qualifierCmp(left, right); - } const leftOrder = commonOrder(left); const rightOrder = commonOrder(right); - // istanbul ignore if - if (leftOrder === rightOrder) { + + if (leftOrder < rightOrder) return -1; + if (leftOrder > rightOrder) return 1; + + if (left.type === TYPE_NUMBER && right.type === TYPE_NUMBER) { + if (left.val < right.val) return -1; + if (left.val > right.val) return 1; return 0; } - if (leftOrder < rightOrder) { - return -1; - } - return 1; + + return qualifierCmp(left, right); } function compare(left: string, right: string): number { diff --git a/lib/versioning/maven/index.ts b/lib/versioning/maven/index.ts index 4cf72ac3ce8a7d0b67cbcf108a607137b597ccde..9e4b8a88b1f0312803472efab06f0b66599061a3 100644 --- a/lib/versioning/maven/index.ts +++ b/lib/versioning/maven/index.ts @@ -9,6 +9,8 @@ import { autoExtendMavenRange, parseRange, EXCLUDING_POINT, + qualifierType, + QualifierTypes, } from './compare'; import { RangeStrategy, VersioningApi } from '../common'; @@ -88,21 +90,13 @@ const isGreaterThan = (a: string, b: string): boolean => compare(a, b) === 1; const isStable = (version: string): boolean | null => { if (isVersion(version)) { const tokens = tokenize(version); - const qualToken = tokens.find(token => token.type === TYPE_QUALIFIER); - if (qualToken) { - const val = qualToken.val; - // TODO: Can this if be removed, we never get here - // istanbul ignore if - if ( - val === 'final' || - val === 'ga' || - val === 'release' || - val === 'latest' - ) - return true; - - if (val === 'release' || val === 'sp') return true; - return false; + for (const token of tokens) { + if (token.type === TYPE_QUALIFIER) { + const qualType = qualifierType(token); + if (qualType && qualType < QualifierTypes.Release) { + return false; + } + } } return true; } diff --git a/test/versioning/maven.spec.ts b/test/versioning/maven.spec.ts index 74cb0ca4fd6028c5d2b1c9d56d92d5f20a46c41f..e40d3fc534425c4b7f5eb1dd465305ce8144b6e4 100644 --- a/test/versioning/maven.spec.ts +++ b/test/versioning/maven.spec.ts @@ -76,6 +76,8 @@ describe('versioning/maven/compare', () => { expect(compare('1-cr1', '1')).toEqual(-1); expect(compare('0.0-1552', '1.10.520')).toEqual(-1); expect(compare('0.0.1', '999')).toEqual(-1); + expect(compare('1.3-RC1-groovy-2.5', '1.3-groovy-2.5')).toEqual(-1); + expect(compare('1-abc', '1-xyz')).toEqual(-1); }); it('returns greater than', () => { expect(compare('1.1', '1')).toEqual(1); @@ -94,6 +96,8 @@ describe('versioning/maven/compare', () => { expect(compare('1', '1-cr1')).toEqual(1); expect(compare('1.10.520', '0.0-1552')).toEqual(1); expect(compare('999', '0.0.1')).toEqual(1); + expect(compare('1.3-groovy-2.5', '1.3-RC1-groovy-2.5')).toEqual(1); + expect(compare('1-xyz', '1-abc')).toEqual(1); }); const invalidRanges = [ @@ -275,7 +279,7 @@ describe('versioning/maven/index', () => { }); it('checks if version is stable', () => { expect(isStable('')).toBeNull(); - expect(isStable('foobar')).toBe(false); + expect(isStable('foobar')).toBe(true); expect(isStable('final')).toBe(true); expect(isStable('1')).toBe(true); expect(isStable('1.2')).toBe(true); @@ -284,13 +288,15 @@ describe('versioning/maven/index', () => { expect(isStable('v1.2.3.4')).toBe(true); expect(isStable('1-alpha-1')).toBe(false); expect(isStable('1-b1')).toBe(false); - expect(isStable('1-foo')).toBe(false); + expect(isStable('1-foo')).toBe(true); expect(isStable('1-final-1.0.0')).toBe(true); expect(isStable('1-release')).toBe(true); expect(isStable('1.final')).toBe(true); expect(isStable('1.0milestone1')).toBe(false); expect(isStable('1-sp')).toBe(true); expect(isStable('1-ga-1')).toBe(true); + expect(isStable('1.3-groovy-2.5')).toBe(true); + expect(isStable('1.3-RC1-groovy-2.5')).toBe(false); }); it('returns major version', () => { expect(getMajor('')).toBeNull();