From beaf7a6c5d6019811bf376a0c233c049a242b9d2 Mon Sep 17 00:00:00 2001 From: Danial Nickford Date: Sat, 31 Mar 2018 16:11:48 +1300 Subject: [PATCH 01/13] loosely detect semver versions --- lib/version.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/version.js b/lib/version.js index be4b7a7c78241..a7cc5723a3077 100644 --- a/lib/version.js +++ b/lib/version.js @@ -18,7 +18,7 @@ function latest(versions) { return (/[0-9]/).test(version); }); try { - version = semver.maxSatisfying(versions, ''); + version = semver.maxSatisfying(versions, '', true); } catch(e) { version = latestDottedVersion(versions); } From ec574143e03222043beeafe22a70e235d3b40706 Mon Sep 17 00:00:00 2001 From: Danial Nickford Date: Sat, 31 Mar 2018 16:23:22 +1300 Subject: [PATCH 02/13] semver loose validity --- lib/version.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/version.js b/lib/version.js index a7cc5723a3077..f30a60007ae14 100644 --- a/lib/version.js +++ b/lib/version.js @@ -83,14 +83,14 @@ function compareDottedVersion(v1, v2) { // Slice the specified number of dotted parts from the given semver version. // e.g. slice('2.4.7', 'minor') -> '2.4' function slice(v, releaseType) { - if (! semver.valid(v)) { + if (! semver.valid(v, true)) { return null; } - const major = semver.major(v); - const minor = semver.minor(v); - const patch = semver.patch(v); - const prerelease = semver.prerelease(v); + const major = semver.major(v, true); + const minor = semver.minor(v, true); + const patch = semver.patch(v, true); + const prerelease = semver.prerelease(v, true); const dottedParts = { major: [major], @@ -115,7 +115,7 @@ function minor(v) { } function rangeStart(v) { - const range = new semver.Range(v); + const range = new semver.Range(v, true); return range.set[0][0].semver.version; } From b6da4723bd04467a7c50f7d9cfce2cd7777edfcc Mon Sep 17 00:00:00 2001 From: Danial Nickford Date: Sat, 31 Mar 2018 16:32:51 +1300 Subject: [PATCH 03/13] add test --- lib/version.spec.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/version.spec.js b/lib/version.spec.js index f51e28a94693c..961457af8f444 100644 --- a/lib/version.spec.js +++ b/lib/version.spec.js @@ -9,6 +9,11 @@ describe('Version helpers', function () { given(['1.0.0', '1.0.2', '1.0.1']).expect('1.0.2'); given(['1.0.0', '2.0.0', '3.0.0']).expect('3.0.0'); given(['0.0.1', '0.0.10', '0.0.2', '0.0.20']).expect('0.0.20'); + + // "not-quite-valid" semver versions + given(['1.0.00', '1.0.02', '1.0.01']).expect('1.0.02'); + given(['1.0.05', '2.0.05', '3.0.05']).expect('3.0.05'); + given(['0.0.01', '0.0.010', '0.0.02', '0.0.020']).expect('0.0.020'); // Simple dotted versions. given(['1.0.0', 'v1.0.2', 'r1.0.1', 'release-2.0.0']).expect('release-2.0.0'); @@ -36,6 +41,9 @@ describe('Version helpers', function () { given('2.4.7', 'major').expect('2'); given('2.4.7', 'minor').expect('2.4'); given('2.4.7', 'patch').expect('2.4.7'); + given('02.4.7', 'major').expect('2'); + given('2.04.7', 'minor').expect('2.4'); + given('2.4.07', 'patch').expect('2.4.7'); given('2.4.7-alpha.1', 'major').expect('2-alpha.1'); given('2.4.7-alpha.1', 'minor').expect('2.4-alpha.1'); given('2.4.7-alpha.1', 'patch').expect('2.4.7-alpha.1'); From bce5909d586e13e3dd937814cb6f6be84da170b8 Mon Sep 17 00:00:00 2001 From: Danial Nickford Date: Sat, 31 Mar 2018 16:53:47 +1300 Subject: [PATCH 04/13] semver compare versions when null --- lib/version.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/version.js b/lib/version.js index f30a60007ae14..cda940961cc12 100644 --- a/lib/version.js +++ b/lib/version.js @@ -18,11 +18,13 @@ function latest(versions) { return (/[0-9]/).test(version); }); try { - version = semver.maxSatisfying(versions, '', true); + version = semver.maxSatisfying(versions, '', true) || versions.sort((a, b) => { + semver.compare(a, b, true); + })[0]; } catch(e) { version = latestDottedVersion(versions); } - if (version === undefined) { + if (version === undefined || version === null) { origVersions = origVersions.sort(); version = origVersions[origVersions.length - 1]; } From f75b381bde483b1e7e452ce8fe380fb835428b8c Mon Sep 17 00:00:00 2001 From: Danial Nickford Date: Thu, 5 Apr 2018 10:09:35 +1200 Subject: [PATCH 05/13] add comments for loose --- lib/version.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/version.js b/lib/version.js index cda940961cc12..61a51cf2e2cd4 100644 --- a/lib/version.js +++ b/lib/version.js @@ -18,12 +18,13 @@ function latest(versions) { return (/[0-9]/).test(version); }); try { - version = semver.maxSatisfying(versions, '', true) || versions.sort((a, b) => { - semver.compare(a, b, true); + version = semver.maxSatisfying(versions, /* range */ '', /* loose */ true) || versions.sort((a, b) => { + semver.compare(a, b, /* loose */ true); })[0]; } catch(e) { version = latestDottedVersion(versions); } + console.log(versions); if (version === undefined || version === null) { origVersions = origVersions.sort(); version = origVersions[origVersions.length - 1]; @@ -85,14 +86,14 @@ function compareDottedVersion(v1, v2) { // Slice the specified number of dotted parts from the given semver version. // e.g. slice('2.4.7', 'minor') -> '2.4' function slice(v, releaseType) { - if (! semver.valid(v, true)) { + if (! semver.valid(v, /* loose */ true)) { return null; } - const major = semver.major(v, true); - const minor = semver.minor(v, true); - const patch = semver.patch(v, true); - const prerelease = semver.prerelease(v, true); + const major = semver.major(v, /* loose */ true); + const minor = semver.minor(v, /* loose */ true); + const patch = semver.patch(v, /* loose */ true); + const prerelease = semver.prerelease(v, /* loose */ true); const dottedParts = { major: [major], @@ -117,7 +118,7 @@ function minor(v) { } function rangeStart(v) { - const range = new semver.Range(v, true); + const range = new semver.Range(v, /* loose */ true); return range.set[0][0].semver.version; } From 4240fa6147103bfaf100728b066670344b886c5a Mon Sep 17 00:00:00 2001 From: Danial Nickford Date: Thu, 19 Apr 2018 13:44:57 +1200 Subject: [PATCH 06/13] remove console.log, only match semver scheme --- lib/version.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/version.js b/lib/version.js index 61a51cf2e2cd4..a1e8fd693aa45 100644 --- a/lib/version.js +++ b/lib/version.js @@ -15,7 +15,7 @@ function latest(versions) { let version = ''; let origVersions = versions; versions = versions.filter(function(version) { - return (/[0-9]/).test(version); + return (/\d+\.\d+\.\d+/).test(version); }); try { version = semver.maxSatisfying(versions, /* range */ '', /* loose */ true) || versions.sort((a, b) => { @@ -24,7 +24,6 @@ function latest(versions) { } catch(e) { version = latestDottedVersion(versions); } - console.log(versions); if (version === undefined || version === null) { origVersions = origVersions.sort(); version = origVersions[origVersions.length - 1]; From 5f3a55e0be9bc1a88f2696672ab3648e274f2418 Mon Sep 17 00:00:00 2001 From: Danial Nickford Date: Thu, 19 Apr 2018 14:10:09 +1200 Subject: [PATCH 07/13] looser version restrictions --- lib/version.js | 9 +++++++-- lib/version.spec.js | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/version.js b/lib/version.js index a1e8fd693aa45..72b10fbf85738 100644 --- a/lib/version.js +++ b/lib/version.js @@ -14,9 +14,14 @@ const semver = require('semver'); function latest(versions) { let version = ''; let origVersions = versions; - versions = versions.filter(function(version) { - return (/\d+\.\d+\.\d+/).test(version); + versions = origVersions.filter(function(version) { + return (/\d+\.\d+/).test(version); }); + if (!versions.length){ + versions = origVersions.filter(function(version) { + return (/\d+/).test(version); + }); + } try { version = semver.maxSatisfying(versions, /* range */ '', /* loose */ true) || versions.sort((a, b) => { semver.compare(a, b, /* loose */ true); diff --git a/lib/version.spec.js b/lib/version.spec.js index 961457af8f444..906f959f092ca 100644 --- a/lib/version.spec.js +++ b/lib/version.spec.js @@ -35,6 +35,9 @@ describe('Version helpers', function () { // Simple (one-number) versions given(['2', '10', '1']).expect('10'); + + // Semver mixed with old non semver versions + given(['1.0.0', '1.0.2', '1.1', '1.0', 'notaversion2', '12bcde4']).expect('1.1'); }); test(slice, () => { From ec318420b486099c5a473f7db1d8b54cc3f89b68 Mon Sep 17 00:00:00 2001 From: RedSparr0w Date: Fri, 11 May 2018 18:33:35 +1200 Subject: [PATCH 08/13] re-sort version tests comments refered to incorrect test --- lib/version.spec.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/version.spec.js b/lib/version.spec.js index 906f959f092ca..4b643ac4b0f85 100644 --- a/lib/version.spec.js +++ b/lib/version.spec.js @@ -15,28 +15,28 @@ describe('Version helpers', function () { given(['1.0.05', '2.0.05', '3.0.05']).expect('3.0.05'); given(['0.0.01', '0.0.010', '0.0.02', '0.0.020']).expect('0.0.020'); - // Simple dotted versions. + // Mixed style versions. given(['1.0.0', 'v1.0.2', 'r1.0.1', 'release-2.0.0']).expect('release-2.0.0'); given(['1.0.0', 'v2.0.0', 'r1.0.1', 'release-1.0.3']).expect('v2.0.0'); given(['2.0.0', 'v1.0.3', 'r1.0.1', 'release-1.0.3']).expect('2.0.0'); given(['1.0.0', 'v1.0.2', 'r2.0.0', 'release-1.0.3']).expect('r2.0.0'); // Versions with 'v' prefix. - given(['0.1', '0.3', '0.2']).expect('0.3'); - given(['0.1', '0.5', '0.12', '0.21']).expect('0.21'); - given(['1.0', '2.0', '3.0']).expect('3.0'); - - // Versions with '-release' prefix given(['v1.0.0', 'v1.0.2', 'v1.0.1']).expect('v1.0.2'); given(['v1.0.0', 'v3.0.0', 'v2.0.0']).expect('v3.0.0'); - // Versions with '-release' prefix - given(['release-1.0.0', 'release-1.0.2', 'release-1.0.20', 'release-1.0.3']).expect('release-1.0.20'); + // Simple (2 number) versions. + given(['0.1', '0.3', '0.2']).expect('0.3'); + given(['0.1', '0.5', '0.12', '0.21']).expect('0.21'); + given(['1.0', '2.0', '3.0']).expect('3.0'); // Simple (one-number) versions given(['2', '10', '1']).expect('10'); - // Semver mixed with old non semver versions + // Versions with 'release-' prefix + given(['release-1.0.0', 'release-1.0.2', 'release-1.0.20', 'release-1.0.3']).expect('release-1.0.20'); + + // Semver mixed with non semver versions given(['1.0.0', '1.0.2', '1.1', '1.0', 'notaversion2', '12bcde4']).expect('1.1'); }); From e2aea5d4cd493b908c62e97527babdac8cbdb085 Mon Sep 17 00:00:00 2001 From: RedSparr0w Date: Fri, 11 May 2018 18:46:20 +1200 Subject: [PATCH 09/13] add support for pre-release tags #1682 --- lib/version.js | 4 ++-- lib/version.spec.js | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/version.js b/lib/version.js index 72b10fbf85738..44ae1f4aa777d 100644 --- a/lib/version.js +++ b/lib/version.js @@ -23,8 +23,8 @@ function latest(versions) { }); } try { - version = semver.maxSatisfying(versions, /* range */ '', /* loose */ true) || versions.sort((a, b) => { - semver.compare(a, b, /* loose */ true); + version = versions.sort((a, b) => { + return semver.ltr(a, b, /* loose */ true); })[0]; } catch(e) { version = latestDottedVersion(versions); diff --git a/lib/version.spec.js b/lib/version.spec.js index 4b643ac4b0f85..103da1778f389 100644 --- a/lib/version.spec.js +++ b/lib/version.spec.js @@ -16,10 +16,11 @@ describe('Version helpers', function () { given(['0.0.01', '0.0.010', '0.0.02', '0.0.020']).expect('0.0.020'); // Mixed style versions. - given(['1.0.0', 'v1.0.2', 'r1.0.1', 'release-2.0.0']).expect('release-2.0.0'); - given(['1.0.0', 'v2.0.0', 'r1.0.1', 'release-1.0.3']).expect('v2.0.0'); - given(['2.0.0', 'v1.0.3', 'r1.0.1', 'release-1.0.3']).expect('2.0.0'); - given(['1.0.0', 'v1.0.2', 'r2.0.0', 'release-1.0.3']).expect('r2.0.0'); + given(['1.0.0', 'v1.0.2', 'r1.0.1', 'release-2.0.0', 'v1.0.1-alpha.1']).expect('release-2.0.0'); + given(['1.0.0', 'v2.0.0', 'r1.0.1', 'release-1.0.3', 'v1.0.1-alpha.1']).expect('v2.0.0'); + given(['2.0.0', 'v1.0.3', 'r1.0.1', 'release-1.0.3', 'v1.0.1-alpha.1']).expect('2.0.0'); + given(['1.0.0', 'v1.0.2', 'r2.0.0', 'release-1.0.3', 'v1.0.1-alpha.1']).expect('r2.0.0'); + given(['1.0.0', 'v1.0.2', 'r2.0.0', 'release-1.0.3', 'v2.0.1-alpha.1']).expect('v2.0.1-alpha.1'); // Versions with 'v' prefix. given(['v1.0.0', 'v1.0.2', 'v1.0.1']).expect('v1.0.2'); @@ -32,6 +33,10 @@ describe('Version helpers', function () { // Simple (one-number) versions given(['2', '10', '1']).expect('10'); + + // Pre-release tags + given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.0']).expect('v1.0.1-beta.3'); + given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1']).expect('v1.0.1'); // Versions with 'release-' prefix given(['release-1.0.0', 'release-1.0.2', 'release-1.0.20', 'release-1.0.3']).expect('release-1.0.20'); From c09fa8eee65cefa3b0b3bff8af5da27ab8e1a84b Mon Sep 17 00:00:00 2001 From: Danial Nickford Date: Tue, 5 Jun 2018 10:12:35 +1200 Subject: [PATCH 10/13] support uppercase, lowercase mixed --- lib/version.js | 3 ++- lib/version.spec.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/version.js b/lib/version.js index 44ae1f4aa777d..9c865d74bf5f0 100644 --- a/lib/version.js +++ b/lib/version.js @@ -24,7 +24,8 @@ function latest(versions) { } try { version = versions.sort((a, b) => { - return semver.ltr(a, b, /* loose */ true); + // coerce to string then lowercase otherwise alpha > RC + return semver.rcompare((''+a).toLowerCase(), (''+b).toLowerCase(), /* loose */ true); })[0]; } catch(e) { version = latestDottedVersion(versions); diff --git a/lib/version.spec.js b/lib/version.spec.js index 103da1778f389..97a57f275dfb3 100644 --- a/lib/version.spec.js +++ b/lib/version.spec.js @@ -35,8 +35,8 @@ describe('Version helpers', function () { given(['2', '10', '1']).expect('10'); // Pre-release tags - given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.0']).expect('v1.0.1-beta.3'); - given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1']).expect('v1.0.1'); + given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2', 'v1.0.0']).expect('v1.0.1-RC.2'); + given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2','v1.0.1']).expect('v1.0.1'); // Versions with 'release-' prefix given(['release-1.0.0', 'release-1.0.2', 'release-1.0.20', 'release-1.0.3']).expect('release-1.0.20'); From 19192b5ce9a1cbc2dac7af3e223c8acd7b5bc6dc Mon Sep 17 00:00:00 2001 From: Danial Nickford Date: Mon, 18 Jun 2018 11:22:52 +1200 Subject: [PATCH 11/13] make pre-release opt in --- lib/version.js | 7 ++++++- lib/version.spec.js | 24 ++++++++++++++---------- server.js | 28 +++++++++++++++------------- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/lib/version.js b/lib/version.js index 9c865d74bf5f0..515d7be10e955 100644 --- a/lib/version.js +++ b/lib/version.js @@ -11,7 +11,7 @@ const semver = require('semver'); // Given a list of versions (as strings), return the latest version. // Return undefined if no version could be found. -function latest(versions) { +function latest(versions, pre = false) { let version = ''; let origVersions = versions; versions = origVersions.filter(function(version) { @@ -22,6 +22,11 @@ function latest(versions) { return (/\d+/).test(version); }); } + if (!pre){ + versions = versions.filter(function(version) { + return !(/\d+-\w+/).test(version); + }); + } try { version = versions.sort((a, b) => { // coerce to string then lowercase otherwise alpha > RC diff --git a/lib/version.spec.js b/lib/version.spec.js index 97a57f275dfb3..c5bee55a2b4ba 100644 --- a/lib/version.spec.js +++ b/lib/version.spec.js @@ -2,6 +2,7 @@ const { test, given } = require('sazerac'); const { latest, slice, rangeStart } = require('./version'); +const includePre = true; describe('Version helpers', function () { test(latest, () => { @@ -9,18 +10,18 @@ describe('Version helpers', function () { given(['1.0.0', '1.0.2', '1.0.1']).expect('1.0.2'); given(['1.0.0', '2.0.0', '3.0.0']).expect('3.0.0'); given(['0.0.1', '0.0.10', '0.0.2', '0.0.20']).expect('0.0.20'); - + // "not-quite-valid" semver versions given(['1.0.00', '1.0.02', '1.0.01']).expect('1.0.02'); given(['1.0.05', '2.0.05', '3.0.05']).expect('3.0.05'); given(['0.0.01', '0.0.010', '0.0.02', '0.0.020']).expect('0.0.020'); - // Mixed style versions. - given(['1.0.0', 'v1.0.2', 'r1.0.1', 'release-2.0.0', 'v1.0.1-alpha.1']).expect('release-2.0.0'); - given(['1.0.0', 'v2.0.0', 'r1.0.1', 'release-1.0.3', 'v1.0.1-alpha.1']).expect('v2.0.0'); - given(['2.0.0', 'v1.0.3', 'r1.0.1', 'release-1.0.3', 'v1.0.1-alpha.1']).expect('2.0.0'); - given(['1.0.0', 'v1.0.2', 'r2.0.0', 'release-1.0.3', 'v1.0.1-alpha.1']).expect('r2.0.0'); - given(['1.0.0', 'v1.0.2', 'r2.0.0', 'release-1.0.3', 'v2.0.1-alpha.1']).expect('v2.0.1-alpha.1'); + // Mixed style versions. - include pre-releases + given(['1.0.0', 'v1.0.2', 'r1.0.1', 'release-2.0.0', 'v1.0.1-alpha.1'], includePre).expect('release-2.0.0'); + given(['1.0.0', 'v2.0.0', 'r1.0.1', 'release-1.0.3', 'v1.0.1-alpha.1'], includePre).expect('v2.0.0'); + given(['2.0.0', 'v1.0.3', 'r1.0.1', 'release-1.0.3', 'v1.0.1-alpha.1'], includePre).expect('2.0.0'); + given(['1.0.0', 'v1.0.2', 'r2.0.0', 'release-1.0.3', 'v1.0.1-alpha.1'], includePre).expect('r2.0.0'); + given(['1.0.0', 'v1.0.2', 'r2.0.0', 'release-1.0.3', 'v2.0.1-alpha.1'], includePre).expect('v2.0.1-alpha.1'); // Versions with 'v' prefix. given(['v1.0.0', 'v1.0.2', 'v1.0.1']).expect('v1.0.2'); @@ -34,10 +35,13 @@ describe('Version helpers', function () { // Simple (one-number) versions given(['2', '10', '1']).expect('10'); - // Pre-release tags - given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2', 'v1.0.0']).expect('v1.0.1-RC.2'); + // Include pre-releases + given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2', 'v1.0.0'], includePre).expect('v1.0.1-RC.2'); + given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2','v1.0.1'], includePre).expect('v1.0.1'); + // Exclude pre-releases + given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2', 'v1.0.0']).expect('v1.0.0'); given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2','v1.0.1']).expect('v1.0.1'); - + // Versions with 'release-' prefix given(['release-1.0.0', 'release-1.0.2', 'release-1.0.20', 'release-1.0.3']).expect('release-1.0.20'); diff --git a/server.js b/server.js index 7d45012c3658f..2b8d5fa3acba4 100644 --- a/server.js +++ b/server.js @@ -2489,12 +2489,13 @@ cache(function(data, match, sendBadge, request) { })); // Dart's pub version integration. -camp.route(/^\/pub\/v\/(.*)\.(svg|png|gif|jpg|json)$/, +camp.route(/^\/pub\/v(pre)?\/(.*)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { - var userRepo = match[1]; // eg, "box2d" - var format = match[2]; - var apiUrl = 'https://pub.dartlang.org/packages/' + userRepo + '.json'; - var badgeData = getBadgeData('pub', data); + const includePre = Boolean(match[1]); + const userRepo = match[2]; // eg, "box2d" + const format = match[3]; + const apiUrl = 'https://pub.dartlang.org/packages/' + userRepo + '.json'; + let badgeData = getBadgeData('pub', data); request(apiUrl, function(err, res, buffer) { if (err != null) { badgeData.text[1] = 'inaccessible'; @@ -2505,7 +2506,7 @@ cache(function(data, match, sendBadge, request) { var data = JSON.parse(buffer); // Grab the latest stable version, or an unstable var versions = data.versions; - var version = latestVersion(versions); + var version = latestVersion(versions, includePre); badgeData.text[1] = versionText(version); badgeData.colorscheme = versionColor(version); sendBadge(format, badgeData); @@ -3570,13 +3571,14 @@ cache(function (data, match, sendBadge, request) { })); // GitHub tag integration. -camp.route(/^\/github\/tag\/([^/]+)\/([^/]+)\.(svg|png|gif|jpg|json)$/, +camp.route(/^\/github\/tag(-?pre)?\/([^/]+)\/([^/]+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { - var user = match[1]; // eg, expressjs/express - var repo = match[2]; - var format = match[3]; - var apiUrl = githubApiUrl + '/repos/' + user + '/' + repo + '/tags'; - var badgeData = getBadgeData('tag', data); + const includePre = Boolean(match[1]); + const user = match[2]; // eg, expressjs/express + const repo = match[3]; + const format = match[4]; + const apiUrl = githubApiUrl + '/repos/' + user + '/' + repo + '/tags'; + let badgeData = getBadgeData('tag', data); if (badgeData.template === 'social') { badgeData.logo = getLogo('github', data); } @@ -3589,7 +3591,7 @@ cache(function(data, match, sendBadge, request) { try { var data = JSON.parse(buffer); var versions = data.map(function(e) { return e.name; }); - var tag = latestVersion(versions); + var tag = latestVersion(versions, includePre); badgeData.text[1] = versionText(tag); badgeData.colorscheme = versionColor(tag); sendBadge(format, badgeData); From 1051cd1fea03cea8dffe8dd9a79576ed4061780f Mon Sep 17 00:00:00 2001 From: Danial Nickford Date: Tue, 24 Jul 2018 13:30:52 +1200 Subject: [PATCH 12/13] change pre param to object --- lib/version.js | 2 +- lib/version.spec.js | 14 +++++++------- server.js | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/version.js b/lib/version.js index 515d7be10e955..b6f12653b03c8 100644 --- a/lib/version.js +++ b/lib/version.js @@ -11,7 +11,7 @@ const semver = require('semver'); // Given a list of versions (as strings), return the latest version. // Return undefined if no version could be found. -function latest(versions, pre = false) { +function latest(versions, { pre = false } = {}) { let version = ''; let origVersions = versions; versions = origVersions.filter(function(version) { diff --git a/lib/version.spec.js b/lib/version.spec.js index c5bee55a2b4ba..831a9852ab453 100644 --- a/lib/version.spec.js +++ b/lib/version.spec.js @@ -17,11 +17,11 @@ describe('Version helpers', function () { given(['0.0.01', '0.0.010', '0.0.02', '0.0.020']).expect('0.0.020'); // Mixed style versions. - include pre-releases - given(['1.0.0', 'v1.0.2', 'r1.0.1', 'release-2.0.0', 'v1.0.1-alpha.1'], includePre).expect('release-2.0.0'); - given(['1.0.0', 'v2.0.0', 'r1.0.1', 'release-1.0.3', 'v1.0.1-alpha.1'], includePre).expect('v2.0.0'); - given(['2.0.0', 'v1.0.3', 'r1.0.1', 'release-1.0.3', 'v1.0.1-alpha.1'], includePre).expect('2.0.0'); - given(['1.0.0', 'v1.0.2', 'r2.0.0', 'release-1.0.3', 'v1.0.1-alpha.1'], includePre).expect('r2.0.0'); - given(['1.0.0', 'v1.0.2', 'r2.0.0', 'release-1.0.3', 'v2.0.1-alpha.1'], includePre).expect('v2.0.1-alpha.1'); + given(['1.0.0', 'v1.0.2', 'r1.0.1', 'release-2.0.0', 'v1.0.1-alpha.1'], { pre: includePre }).expect('release-2.0.0'); + given(['1.0.0', 'v2.0.0', 'r1.0.1', 'release-1.0.3', 'v1.0.1-alpha.1'], { pre: includePre }).expect('v2.0.0'); + given(['2.0.0', 'v1.0.3', 'r1.0.1', 'release-1.0.3', 'v1.0.1-alpha.1'], { pre: includePre }).expect('2.0.0'); + given(['1.0.0', 'v1.0.2', 'r2.0.0', 'release-1.0.3', 'v1.0.1-alpha.1'], { pre: includePre }).expect('r2.0.0'); + given(['1.0.0', 'v1.0.2', 'r2.0.0', 'release-1.0.3', 'v2.0.1-alpha.1'], { pre: includePre }).expect('v2.0.1-alpha.1'); // Versions with 'v' prefix. given(['v1.0.0', 'v1.0.2', 'v1.0.1']).expect('v1.0.2'); @@ -36,8 +36,8 @@ describe('Version helpers', function () { given(['2', '10', '1']).expect('10'); // Include pre-releases - given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2', 'v1.0.0'], includePre).expect('v1.0.1-RC.2'); - given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2','v1.0.1'], includePre).expect('v1.0.1'); + given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2', 'v1.0.0'], { pre: includePre }).expect('v1.0.1-RC.2'); + given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2','v1.0.1'], { pre: includePre }).expect('v1.0.1'); // Exclude pre-releases given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2', 'v1.0.0']).expect('v1.0.0'); given(['v1.0.1-alpha.2', 'v1.0.1-alpha.1', 'v1.0.1-beta.3', 'v1.0.1-beta.1', 'v1.0.1-RC.1', 'v1.0.1-RC.2','v1.0.1']).expect('v1.0.1'); diff --git a/server.js b/server.js index 2b8d5fa3acba4..5d59e364129b9 100644 --- a/server.js +++ b/server.js @@ -2506,7 +2506,7 @@ cache(function(data, match, sendBadge, request) { var data = JSON.parse(buffer); // Grab the latest stable version, or an unstable var versions = data.versions; - var version = latestVersion(versions, includePre); + var version = latestVersion(versions, { pre: includePre }); badgeData.text[1] = versionText(version); badgeData.colorscheme = versionColor(version); sendBadge(format, badgeData); @@ -3591,7 +3591,7 @@ cache(function(data, match, sendBadge, request) { try { var data = JSON.parse(buffer); var versions = data.map(function(e) { return e.name; }); - var tag = latestVersion(versions, includePre); + var tag = latestVersion(versions, { pre: includePre }); badgeData.text[1] = versionText(tag); badgeData.colorscheme = versionColor(tag); sendBadge(format, badgeData); From f333934d6ca5d6a2dda01b3d5e4daf9bac014b1c Mon Sep 17 00:00:00 2001 From: Danial Nickford Date: Tue, 24 Jul 2018 13:42:50 +1200 Subject: [PATCH 13/13] add notes --- lib/version.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/version.js b/lib/version.js index b6f12653b03c8..1c83e068e13ae 100644 --- a/lib/version.js +++ b/lib/version.js @@ -14,15 +14,18 @@ const semver = require('semver'); function latest(versions, { pre = false } = {}) { let version = ''; let origVersions = versions; + // return all results that are likely semver compatible versions versions = origVersions.filter(function(version) { return (/\d+\.\d+/).test(version); }); + // If no semver versions then look for single numbered versions if (!versions.length){ versions = origVersions.filter(function(version) { return (/\d+/).test(version); }); } if (!pre){ + // remove pre-releases from array versions = versions.filter(function(version) { return !(/\d+-\w+/).test(version); });