]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Fix semver comparison
authorChocobozzz <me@florianbigard.com>
Thu, 19 Jan 2023 12:53:24 +0000 (13:53 +0100)
committerChocobozzz <me@florianbigard.com>
Thu, 19 Jan 2023 12:54:53 +0000 (13:54 +0100)
server/tests/helpers/index.ts
server/tests/helpers/version.ts [new file with mode: 0644]
shared/core-utils/common/version.ts

index 1b5c6d15b90258b7eedb1b3b98998ff57caa6025..073ae64551ef8baecdd6da78fbad08ea078e3f07 100644 (file)
@@ -6,3 +6,4 @@ import './image'
 import './markdown'
 import './request'
 import './validator'
+import './version'
diff --git a/server/tests/helpers/version.ts b/server/tests/helpers/version.ts
new file mode 100644 (file)
index 0000000..7d56007
--- /dev/null
@@ -0,0 +1,31 @@
+/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
+
+import { expect } from 'chai'
+import { compareSemVer } from '@shared/core-utils'
+
+describe('Version', function () {
+
+  it('Should correctly compare two stable versions', async function () {
+    expect(compareSemVer('3.4.0', '3.5.0')).to.be.below(0)
+    expect(compareSemVer('3.5.0', '3.4.0')).to.be.above(0)
+
+    expect(compareSemVer('3.4.0', '4.1.0')).to.be.below(0)
+    expect(compareSemVer('4.1.0', '3.4.0')).to.be.above(0)
+
+    expect(compareSemVer('3.4.0', '3.4.1')).to.be.below(0)
+    expect(compareSemVer('3.4.1', '3.4.0')).to.be.above(0)
+  })
+
+  it('Should correctly compare two unstable version', async function () {
+    expect(compareSemVer('3.4.0-alpha', '3.4.0-beta.1')).to.be.below(0)
+    expect(compareSemVer('3.4.0-alpha.1', '3.4.0-beta.1')).to.be.below(0)
+    expect(compareSemVer('3.4.0-beta.1', '3.4.0-beta.2')).to.be.below(0)
+    expect(compareSemVer('3.4.0-beta.1', '3.5.0-alpha.1')).to.be.below(0)
+  })
+
+  it('Should correctly compare a stable and unstable versions', async function () {
+    expect(compareSemVer('3.4.0', '3.4.1-beta.1')).to.be.below(0)
+    expect(compareSemVer('3.4.0-beta.1', '3.4.0-beta.2')).to.be.below(0)
+    expect(compareSemVer('3.4.0-beta.1', '3.4.0')).to.be.below(0)
+  })
+})
index 8a64f8c4d02d4c145c138d0379432191baa36f35..3052872338b1dcd13f8745ff2cc3ca9dd0f9fcae 100644 (file)
@@ -1,18 +1,9 @@
-// Thanks https://stackoverflow.com/a/16187766
+// Thanks https://gist.github.com/iwill/a83038623ba4fef6abb9efca87ae9ccb
 function compareSemVer (a: string, b: string) {
-  const regExStrip0 = /(\.0+)+$/
-  const segmentsA = a.replace(regExStrip0, '').split('.')
-  const segmentsB = b.replace(regExStrip0, '').split('.')
+  if (a.startsWith(b + '-')) return -1
+  if (b.startsWith(a + '-')) return 1
 
-  const l = Math.min(segmentsA.length, segmentsB.length)
-
-  for (let i = 0; i < l; i++) {
-    const diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10)
-
-    if (diff) return diff
-  }
-
-  return segmentsA.length - segmentsB.length
+  return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'case', caseFirst: 'upper' })
 }
 
 export {