diff --git a/server.js b/server.js index cfc2483327932..f27e4b1f6ca0b 100644 --- a/server.js +++ b/server.js @@ -3330,15 +3330,16 @@ mapGithubReleaseDate(camp, githubApiUrl, githubAuth); // GitHub commits since integration. mapGithubCommitsSince(camp, githubApiUrl ,githubAuth); -// GitHub release-download-count integration. -camp.route(/^\/github\/downloads\/([^\/]+)\/([^\/]+)(\/.+)?\/([^\/]+)\.(svg|png|gif|jpg|json)$/, +// GitHub release-download-count and pre-release-download-count integration. +camp.route(/^\/github\/(downloads|downloads-pre)\/([^\/]+)\/([^\/]+)(\/.+)?\/([^\/]+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { - var user = match[1]; // eg, qubyte/rubidium - var repo = match[2]; + const type = match[1]; // downloads or downloads-pre + var user = match[2]; // eg, qubyte/rubidium + var repo = match[3]; - var tag = match[3]; // eg, v0.190.0, latest, null if querying all releases - var asset_name = match[4].toLowerCase(); // eg. total, atom-amd64.deb, atom.x86_64.rpm - var format = match[5]; + var tag = match[4]; // eg, v0.190.0, latest, null if querying all releases + var asset_name = match[5].toLowerCase(); // eg. total, atom-amd64.deb, atom.x86_64.rpm + var format = match[6]; if (tag) { tag = tag.slice(1); } @@ -3349,8 +3350,10 @@ cache(function(data, match, sendBadge, request) { var apiUrl = githubApiUrl + '/repos/' + user + '/' + repo + '/releases'; if (!total) { - var release_path = tag !== 'latest' ? 'tags/' + tag : 'latest'; - apiUrl = apiUrl + '/' + release_path; + var release_path = tag === 'latest' ? (type === 'downloads' ? 'latest' : '') : 'tags/' + tag; + if (release_path) { + apiUrl = apiUrl + '/' + release_path; + } } var badgeData = getBadgeData('downloads', data); if (badgeData.template === 'social') { @@ -3363,9 +3366,12 @@ cache(function(data, match, sendBadge, request) { } try { var data = JSON.parse(buffer); + if (type === 'downloads-pre' && tag === 'latest') { + data = data[0]; + } var downloads = 0; - var label; + const labelWords = [metric(downloads)]; if (total) { data.forEach(function (tagData) { tagData.assets.forEach(function (asset) { @@ -3375,9 +3381,9 @@ cache(function(data, match, sendBadge, request) { }); }); - label = 'total'; + labelWords.push('total'); if (asset_name !== 'total') { - label += ' ' + '[' + asset_name + ']'; + labelWords.push(`[${asset_name}]`); } } else { data.assets.forEach(function (asset) { @@ -3386,12 +3392,14 @@ cache(function(data, match, sendBadge, request) { } }); - label = tag !== 'latest' ? tag : ''; + if (tag !== 'latest') { + labelWords.push(tag); + } if (asset_name !== 'total') { - label += ' ' + '[' + asset_name + ']'; + labelWords.push(`[${asset_name}]`); } } - badgeData.text[1] = metric(downloads) + ' ' + label; + badgeData.text[1] = labelWords.join(' '); badgeData.colorscheme = 'brightgreen'; sendBadge(format, badgeData); } catch(e) { diff --git a/service-tests/github.js b/service-tests/github.js index 674e3511e1876..c106587edb554 100644 --- a/service-tests/github.js +++ b/service-tests/github.js @@ -271,6 +271,14 @@ t.create('Downloads all releases') value: Joi.string().regex(/^\w+\s+total$/) })); +t.create('downloads for latest release') + .get('/downloads/photonstorm/phaser/latest/total.json') + .expectJSONTypes(Joi.object().keys({ name: 'downloads', value: isMetric })); + +t.create('downloads-pre for latest release') + .get('/downloads-pre/photonstorm/phaser/latest/total.json') + .expectJSONTypes(Joi.object().keys({ name: 'downloads', value: isMetric })); + t.create('downloads for release without slash') .get('/downloads/atom/atom/v0.190.0/total.json') .expectJSONTypes(Joi.object().keys({ @@ -285,6 +293,20 @@ t.create('downloads for specific asset without slash') value: Joi.string().regex(/^[0-9]+[kMGTPEZY]? v0\.190\.0 \[atom-amd64\.deb\]$/) })); +t.create('downloads for specific asset from latest release') + .get('/downloads/atom/atom/latest/atom-amd64.deb.json') + .expectJSONTypes(Joi.object().keys({ + name: 'downloads', + value: Joi.string().regex(/^[0-9]+[kMGTPEZY]? \[atom-amd64\.deb\]$/) + })); + +t.create('downloads-pre for specific asset from latest release') + .get('/downloads-pre/atom/atom/latest/atom-amd64.deb.json') + .expectJSONTypes(Joi.object().keys({ + name: 'downloads', + value: Joi.string().regex(/^[0-9]+[kMGTPEZY]? \[atom-amd64\.deb\]$/) + })); + t.create('downloads for release with slash') .get('/downloads/NHellFire/dban/stable/v2.2.8/total.json') .expectJSONTypes(Joi.object().keys({ diff --git a/try.html b/try.html index 07e3b4075c30b..96a9a53dde161 100644 --- a/try.html +++ b/try.html @@ -259,6 +259,11 @@

Downloads

https://img.shields.io/github/downloads/atom/atom/latest/total.svg + + Github Pre-Releases: + + https://img.shields.io/github/downloads-pre/atom/atom/latest/total.svg + Github Releases (by Release): https://img.shields.io/github/downloads/atom/atom/v0.190.0/total.svg @@ -267,6 +272,11 @@

Downloads

https://img.shields.io/github/downloads/atom/atom/latest/atom-amd64.deb.svg + + Github Pre-Releases (by Asset): + + https://img.shields.io/github/downloads-pre/atom/atom/latest/atom-amd64.deb.svg + npm: https://img.shields.io/npm/dw/localeval.svg