From e2fbb584c7e42ae2637e92c2e66671ecfb7ac52f Mon Sep 17 00:00:00 2001
From: ForbesLindesay
Date: Tue, 21 Jul 2015 11:31:27 +0100
Subject: [PATCH 001/207] Use pdfkit instead of canvas
---
badge.js | 17 +++--------------
measure-text.js | 13 +++++++++++++
package.json | 2 +-
3 files changed, 17 insertions(+), 15 deletions(-)
create mode 100644 measure-text.js
diff --git a/badge.js b/badge.js
index a2c435f..37206e7 100644
--- a/badge.js
+++ b/badge.js
@@ -2,18 +2,7 @@ var fs = require('fs');
var path = require('path');
var SVGO = require('svgo');
var dot = require('dot');
-
-// Initialize what will be used for automatic text measurement.
-var Canvas = require('canvas');
-var canvasElement = new Canvas(0, 0); // Width and height are irrelevant.
-var canvasContext = canvasElement.getContext('2d');
-var CanvasFont = Canvas.Font;
-try {
- var opensans = new CanvasFont('Verdana',
- path.join(__dirname, 'Verdana.ttf'));
- canvasContext.addFont(opensans);
-} catch(e) {}
-canvasContext.font = '11px Verdana, "DejaVu Sans"';
+var measureTextWidth = require('./measure-text');
// cache templates.
var templates = {};
@@ -75,9 +64,9 @@ function makeImage(data, cb) {
data.logoPadding = 0;
}
data.widths = [
- (canvasContext.measureText(data.text[0]).width|0) + 10
+ (measureTextWidth(data.text[0])|0) + 10
+ data.logoWidth + data.logoPadding,
- (canvasContext.measureText(data.text[1]).width|0) + 10,
+ (measureTextWidth(data.text[1])|0) + 10,
];
if (data.links === undefined) {
data.links = ['', ''];
diff --git a/measure-text.js b/measure-text.js
new file mode 100644
index 0000000..0aeb920
--- /dev/null
+++ b/measure-text.js
@@ -0,0 +1,13 @@
+'use strict';
+
+var path = require('path');
+var PDFDocument = require('pdfkit');
+
+var doc = (new PDFDocument({size:'A4', layout:'landscape'}))
+ .font(path.join(__dirname, 'Verdana.ttf'))
+ .fontSize(11);
+
+module.exports = measure;
+function measure(str) {
+ return doc.widthOfString(str);
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index 884e7e3..43f294e 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,7 @@
"dependencies": {
"dot": "~1.0.3",
"svgo": "~0.5.1",
- "canvas": "~1.1.2",
+ "pdfkit": "~0.7.1",
"phantomjs": "~1.9.2-6",
"es6-promise": "~2.1.0",
"request": "~2.55.0",
From 36b664fc45ae2bdffaa6d1becc6d97d078e0b4b8 Mon Sep 17 00:00:00 2001
From: ForbesLindesay
Date: Wed, 22 Jul 2015 17:31:24 +0100
Subject: [PATCH 002/207] Support fallback font when Verdana isn't available
---
measure-text.js | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/measure-text.js b/measure-text.js
index 0aeb920..f96c204 100644
--- a/measure-text.js
+++ b/measure-text.js
@@ -1,11 +1,17 @@
'use strict';
var path = require('path');
+var fs = require('fs');
var PDFDocument = require('pdfkit');
-var doc = (new PDFDocument({size:'A4', layout:'landscape'}))
- .font(path.join(__dirname, 'Verdana.ttf'))
- .fontSize(11);
+var doc = (new PDFDocument({size:'A4', layout:'landscape'}));
+try {
+ doc = doc.font(path.join(__dirname, 'Verdana.ttf'));
+} catch (ex) {
+ doc = doc.font('Helvetica-Bold')
+ console.warn('Could not load font file "Verdana.ttf", text widths will therefore be approximate', ex);
+}
+doc = doc.fontSize(11);
module.exports = measure;
function measure(str) {
From 18cd0c15b970afead3628dd60a65a88add304f33 Mon Sep 17 00:00:00 2001
From: Greg Cochard
Date: Wed, 7 Oct 2015 18:28:28 -0700
Subject: [PATCH 003/207] Add twitter follow badge. Fixes #527
This adds a twitter follow badge. It also updates the social template
to include a `nobubble` option which will ignore the data in text[1]
and not draw the bubble to the right of the badge. Simply add
&nobubble=true to the URL of your badge.
---
server.js | 87 +++++++++++++++++++++++++++++++++++
templates/social-template.svg | 4 ++
try.html | 8 ++++
3 files changed, 99 insertions(+)
diff --git a/server.js b/server.js
index 6b2d2a7..4ae4535 100644
--- a/server.js
+++ b/server.js
@@ -4197,6 +4197,54 @@ cache(function(data, match, sendBadge, request) {
});
}));
+// Twitter follow badge.
+camp.route(/^\/twitter\/follow\/@?([^\/]+)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var user = match[1]; // eg, shields_io
+ var format = match[2];
+ var options = {
+ url: 'http://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=' + user
+ };
+ var badgeData = getBadgeData('Follow', data);
+ badgeData.text[0] = 'Follow ' + user;
+ badgeData.colorscheme = '55ACEE';
+ badgeData.logo = badgeData.logo || logos.twitter;
+ badgeData.links = [
+ 'https://twitter.com/intent/follow?screen_name=' + user
+ ];
+ if (data.nobubble) {
+ badgeData.nobubble = data.nobubble;
+ sendBadge(format, badgeData);
+ return;
+ }
+ if (badgeData.template === 'social') {
+ badgeData.links[1] = 'https://twitter.com/' + user + '/followers';
+ badgeData.text[1] = '';
+ request(options, function(err, res, buffer) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ try {
+ var data = JSON.parse(buffer);
+ // the data is formatted as an array
+ data = data[0];
+ // data.followers_count could be zero...don't just check if falsey
+ if(!data.hasOwnProperty('followers_count')){
+ badgeData.text[1] = 'invalid';
+ } else {
+ badgeData.text[1] = metric(data.followers_count);
+ }
+ } catch(e) {
+ console.error(e);
+ badgeData.text[1] = 'invalid';
+ }
+ sendBadge(format, badgeData);
+ });
+ }
+}));
+
// Snap CI build integration.
// https://snap-ci.com/snap-ci/snap-deploy/branch/master/build_image
camp.route(/^\/snap(-ci?)\/([^\/]+\/[^\/]+)(?:\/(.+))\.(svg|png|gif|jpg|json)$/,
@@ -4709,3 +4757,42 @@ function phpStableVersion(version) {
// normal or patch
return (versionData.modifier === 3) || (versionData.modifier === 4);
}
+
+// This searches the serverSecrets for a twitter consumer key
+// and secret, and exchanges them for a bearer token to use for all requests.
+function fetchTwitterToken() {
+ if(serverSecrets.twitter_consumer_key && serverSecrets.twitter_consumer_secret){
+ // fetch a bearer token good for this app session
+ // construct this bearer request with a base64 encoding of key:secret
+ // docs for this are here: https://dev.twitter.com/oauth/application-only
+ var twitter_bearer_credentials = escape(serverSecrets.twitter_consumer_key) + ':' + escape(serverSecrets.twitter_consumer_secret);
+ var options = {
+ url: 'https://api.twitter.com/oauth2/token',
+ headers: {
+ // is this the best way to base 64 encode a string?
+ Authorization: 'Basic '+(new Buffer(twitter_bearer_credentials)).toString('base64'),
+ 'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'
+ },
+ form: 'grant_type=client_credentials',
+ method: 'POST'
+ };
+ console.log('Fetching twitter bearer token...');
+ request(options,function(err,res,buffer){
+ if(err){
+ console.error('Error fetching twitter bearer token, error: ', err);
+ return;
+ }
+ try{
+ var data = JSON.parse(buffer);
+ if(data.token_type === 'bearer'){
+ serverSecrets.twitter_bearer_token = data.access_token;
+ console.log('Fetched twitter bearer token');
+ return;
+ }
+ console.error('Error fetching twitter bearer token, data: %j', data);
+ } catch(e) {
+ console.error('Error fetching twitter bearer token, buffer: %s, ', buffer, e);
+ }
+ });
+ }
+}
diff --git a/templates/social-template.svg b/templates/social-template.svg
index 442187f..21c5c4b 100644
--- a/templates/social-template.svg
+++ b/templates/social-template.svg
@@ -14,9 +14,11 @@
+ {{?!it.nobubble}}
+ {{?}}
{{?it.logo}}
@@ -24,10 +26,12 @@
{{=it.escapeXml(it.capitalize(it.text[0]))}}
{{=it.escapeXml(it.capitalize(it.text[0]))}}
+ {{?!it.nobubble}}
{{=it.escapeXml(it.text[1])}}
{{=it.escapeXml(it.text[1])}}
+ {{?}}
diff --git a/try.html b/try.html
index 96b036a..932ee90 100644
--- a/try.html
+++ b/try.html
@@ -498,6 +498,14 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/twitter/url/http/shields.io.svg?style=social
+ Twitter Follow:
+
+ https://img.shields.io/twitter/follow/shields_io.svg?style=social
+
+ Twitter Follow (with no count):
+
+ https://img.shields.io/twitter/follow/shields_io.svg?style=social&nobubble=true
+
Miscellaneous
From 155dcaa6d4b48f33a4921fe65e766a92b71cc550 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 22 Nov 2015 17:25:36 +0100
Subject: [PATCH 004/207] Fix codeclimate's incorrect Content-Disposition
Solves #567
---
server.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/server.js b/server.js
index 6773e08..72d0151 100644
--- a/server.js
+++ b/server.js
@@ -1999,7 +1999,7 @@ cache(function(data, match, sendBadge, request) {
}
try {
var score = res.headers['content-disposition']
- .match(/filename="coverage_(.+)\.png"/)[1];
+ .match(/filename=".*coverage_(.+)\.png"/)[1];
if (!score) {
badgeData.text[1] = 'malformed';
sendBadge(format, badgeData);
@@ -2040,7 +2040,7 @@ cache(function(data, match, sendBadge, request) {
}
try {
var statusMatch = res.headers['content-disposition']
- .match(/filename="code_climate-(.+)\.png"/);
+ .match(/filename=".*code_climate-(.+)\.png"/);
if (!statusMatch) {
badgeData.text[1] = 'unknown';
sendBadge(format, badgeData);
From 44b0c871d06ae8225bdabafab02023d9be21ddcf Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 22 Nov 2015 14:21:27 +0100
Subject: [PATCH 005/207] VersionEye add "dependencies: none"
Fixes https://github.com/badges/shields/issues/531#issuecomment-158363415
---
server.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/server.js b/server.js
index 72d0151..fc0da9e 100644
--- a/server.js
+++ b/server.js
@@ -2306,7 +2306,9 @@ cache(function(data, match, sendBadge, request) {
badgeData.text[1] = res;
if (res === 'up to date') {
badgeData.colorscheme = 'brightgreen';
- } else if (statusMatch === 'out of date') {
+ } else if (res === 'none') {
+ badgeData.colorscheme = 'green';
+ } else if (res === 'out of date') {
badgeData.colorscheme = 'yellow';
} else {
badgeData.colorscheme = 'red';
From c986df7882a434d6389f4b1616f349c88f99a197 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Mon, 23 Nov 2015 08:54:47 +0100
Subject: [PATCH 006/207] Libscore API update
What used to be an integer score is now a list.
---
server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server.js b/server.js
index fc0da9e..a17ce68 100644
--- a/server.js
+++ b/server.js
@@ -884,7 +884,7 @@ cache(function(data, match, sendBadge, request) {
}
try {
var data = JSON.parse(buffer);
- badgeData.text[1] = metric(+data.count);
+ badgeData.text[1] = metric(+data.count[data.count.length-1]);
badgeData.colorscheme = 'blue';
sendBadge(format, badgeData);
} catch(e) {
From 784de4a8eca090355d50f7b539613fe03234f6e8 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 24 Nov 2015 20:12:54 +0100
Subject: [PATCH 007/207] Ground design rules for large modifications
---
CONTRIBUTING.md | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 6a72fd1..2bf3dca 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -16,6 +16,14 @@ For testing purposes, you can go to `http://localhost/try.html`.
You should modify that file. The "real" root, `http://localhost/index.html`,
gets generated from the `try.html` file.
+## Ground rules
+
+- The left-hand side of a badge should not advertize. It should be a noun
+ describing succinctly the meaning of the right-hand-side data.
+- New query parameters (such as `?label=` or `?style=`) should apply to any
+ requested badge. They must be registered in the cache (see `LruCache` in
+ `server.js`).
+
## Implementations
The main implementation, available at , has its code located in this repository.
From 13389ed1b3fc6ed527298c63adced7218a3dabed Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Wed, 25 Nov 2015 23:19:23 +0100
Subject: [PATCH 008/207] Avoid confusing constructs
---
server.js | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/server.js b/server.js
index a17ce68..1bfcd84 100644
--- a/server.js
+++ b/server.js
@@ -191,7 +191,6 @@ function cache(f) {
var cachedVersionSent = false;
if (cached !== undefined) {
// A request was made not long ago.
- var interval = 30000; // In milliseconds.
var tooSoon = (+reqTime - cached.time) < cached.interval;
if (tooSoon || (cached.dataChange / cached.reqs <= freqRatioMax)) {
badge(cached.data.badgeData, makeSend(cached.data.format, ask.res, end));
@@ -308,15 +307,15 @@ cache(function(data, match, sendBadge, request) {
return;
}
try {
- var res = res.headers['content-disposition']
- .match(/filename="(.+)\.svg"/)[1];
- badgeData.text[1] = res;
- if (res === 'passing') {
+ var state = res.headers['content-disposition']
+ .match(/filename="(.+)\.svg"/)[1];
+ badgeData.text[1] = state;
+ if (state === 'passing') {
badgeData.colorscheme = 'brightgreen';
- } else if (res === 'failing') {
+ } else if (state === 'failing') {
badgeData.colorscheme = 'red';
} else {
- badgeData.text[1] = res;
+ badgeData.text[1] = state;
}
sendBadge(format, badgeData);
From b6e92b87129bd69e4a5659dd167452c39bf1f8aa Mon Sep 17 00:00:00 2001
From: Yannick Galatol
Date: Sun, 29 Nov 2015 13:04:39 +0100
Subject: [PATCH 009/207] Allow HTTP authentication on Jenkins
---
server.js | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/server.js b/server.js
index 1bfcd84..1630a50 100644
--- a/server.js
+++ b/server.js
@@ -3277,6 +3277,13 @@ cache(function(data, match, sendBadge, request) {
uri: scheme + '://' + host + '/job/' + job + '/api/json?tree=color'
};
+ if (serverSecrets && serverSecrets.jenkins_user) {
+ options.auth = {
+ user: serverSecrets.jenkins_user,
+ pass: serverSecrets.jenkins_pass
+ };
+ }
+
var badgeData = getBadgeData('build', data);
request(options, function(err, res, json) {
if (err !== null) {
@@ -3324,6 +3331,13 @@ cache(function(data, match, sendBadge, request) {
+ '/lastBuild/api/json?tree=actions[failCount,skipCount,totalCount]'
};
+ if (serverSecrets && serverSecrets.jenkins_user) {
+ options.auth = {
+ user: serverSecrets.jenkins_user,
+ pass: serverSecrets.jenkins_pass
+ };
+ }
+
var badgeData = getBadgeData('tests', data);
request(options, function(err, res, json) {
if (err !== null) {
From 89fa5f256bf8a6954e6e14bc9b2888806812e872 Mon Sep 17 00:00:00 2001
From: Patrick Samson
Date: Sun, 29 Nov 2015 17:48:41 -0500
Subject: [PATCH 010/207] Add Package Control support
---
server.js | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/server.js b/server.js
index 1bfcd84..fe76ca0 100644
--- a/server.js
+++ b/server.js
@@ -1210,6 +1210,38 @@ cache(function(data, match, sendBadge, request) {
});
}));
+// Package Control integration.
+camp.route(/^\/packagecontrol\/(.*)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var userRepo = match[1]; // eg, `Package%20Control`.
+ var format = match[2];
+ var apiUrl = 'https://packagecontrol.io/packages/' + userRepo + '.json';
+ var badgeData = getBadgeData('downloads', data);
+ if (userRepo.substr(-14) === '/:package_name') {
+ badgeData.text[1] = 'invalid';
+ return sendBadge(format, badgeData);
+ }
+ request(apiUrl, function(err, res, buffer) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ }
+ try {
+ var data = JSON.parse(buffer);
+
+ var downloads = data.package.installs.total;
+ badgeData.text[1] = metric(downloads) + ' total';
+ break;
+
+ badgeData.colorscheme = downloadCountColor(downloads);
+ sendBadge(format, badgeData);
+ } catch(e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
+
// npm download integration.
camp.route(/^\/npm\/dm\/(.*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
From 6ac1ee40d853e153eee16654aa755e3e6191f88a Mon Sep 17 00:00:00 2001
From: Patrick Samson
Date: Sun, 29 Nov 2015 18:05:08 -0500
Subject: [PATCH 011/207] Oops, typo
---
server.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/server.js b/server.js
index fe76ca0..df27fdc 100644
--- a/server.js
+++ b/server.js
@@ -1231,7 +1231,6 @@ cache(function(data, match, sendBadge, request) {
var downloads = data.package.installs.total;
badgeData.text[1] = metric(downloads) + ' total';
- break;
badgeData.colorscheme = downloadCountColor(downloads);
sendBadge(format, badgeData);
From 5cba0f05805cb82e2c9de768cd80b194453711cd Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 1 Dec 2015 13:31:31 +0100
Subject: [PATCH 012/207] website: sensiolabs, gitter
---
index.html | 88 ++++++++++++++++++++++++++++--------------------------
1 file changed, 46 insertions(+), 42 deletions(-)
diff --git a/index.html b/index.html
index ba96ce2..2825296 100644
--- a/index.html
+++ b/index.html
@@ -206,8 +206,8 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/hhvm/symfony/symfony/master.svg
SensioLabs Insight:
-
- https://img.shields.io/sensiolabs/i/45afb680-d4e6-4e66-93ea-bcfa79eb8a87.svg
+
+ https://img.shields.io/sensiolabs/i/45afb680-d4e6-4e66-93ea-bcfa79eb8a87.svg
Downloads
@@ -604,80 +604,84 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/wheelmap/a/2323004600.svg
GitHub issues:
-
- https://img.shields.io/github/issues/badges/shields.svg
+
+ https://img.shields.io/github/issues/badges/shields.svg
-
- https://img.shields.io/github/issues-raw/badges/shields.svg
+
+ https://img.shields.io/github/issues-raw/badges/shields.svg
GitHub license:
-
- https://img.shields.io/github/license/mashape/apistatus.svg
+
+ https://img.shields.io/github/license/mashape/apistatus.svg
WordPress rating:
-
- https://img.shields.io/wordpress/plugin/r/akismet.svg
+
+ https://img.shields.io/wordpress/plugin/r/akismet.svg
Codacy:
-
- https://img.shields.io/codacy/e27821fb6289410b8f58338c7e0bc686.svg
+
+ https://img.shields.io/codacy/e27821fb6289410b8f58338c7e0bc686.svg
Libscore:
-
- https://img.shields.io/libscore/s/jQuery.svg
+
+ https://img.shields.io/libscore/s/jQuery.svg
Talk.ai:
-
- https://img.shields.io/talk/t/9c81ff703b.svg
+
+ https://img.shields.io/talk/t/9c81ff703b.svg
Puppet Forge:
-
- https://img.shields.io/puppetforge/e/camptocamp/openssl.svg
+
+ https://img.shields.io/puppetforge/e/camptocamp/openssl.svg
Puppet Forge:
-
- https://img.shields.io/puppetforge/f/camptocamp/openssl.svg
+
+ https://img.shields.io/puppetforge/f/camptocamp/openssl.svg
Puppet Forge:
-
- https://img.shields.io/puppetforge/rc/camptocamp.svg
+
+ https://img.shields.io/puppetforge/rc/camptocamp.svg
Puppet Forge:
-
- https://img.shields.io/puppetforge/mc/camptocamp.svg
- Gems:
-
- https://img.shields.io/gem/u/raphink.svg
+
+ https://img.shields.io/puppetforge/mc/camptocamp.svg
Gems:
-
- https://img.shields.io/gem/rt/puppet.svg
+
+ https://img.shields.io/gem/u/raphink.svg
Gems:
-
- https://img.shields.io/gem/rd/facter.svg
+
+ https://img.shields.io/gem/rt/puppet.svg
+
+ Gems:
+
+ https://img.shields.io/gem/rd/facter.svg
DUB:
-
- https://img.shields.io/dub/l/vibe-d.svg
+
+ https://img.shields.io/dub/l/vibe-d.svg
Docker Stars:
-
- https://img.shields.io/docker/stars/_/ubuntu.svg
+
+ https://img.shields.io/docker/stars/_/ubuntu.svg
Docker Pulls:
-
- https://img.shields.io/docker/pulls/mashape/kong.svg
+
+ https://img.shields.io/docker/pulls/mashape/kong.svg
ImageLayers Size:
-
- https://img.shields.io/imagelayers/image-size/_/ubuntu/latest.svg
-
+
+ https://img.shields.io/imagelayers/image-size/_/ubuntu/latest.svg
ImageLayers Layers:
-
- https://img.shields.io/imagelayers/layers/_/ubuntu/latest.svg
+
+ https://img.shields.io/imagelayers/layers/_/ubuntu/latest.svg
+
+ Gitter:
+
+ https://img.shields.io/gitter/room/nwjs/nw.js.svg
From fbdb5239fa36d29cd81224c261c22e362d7094cc Mon Sep 17 00:00:00 2001
From: USAMI Kenta
Date: Wed, 2 Dec 2015 03:03:04 +0900
Subject: [PATCH 013/207] Fix Apache License pattern
---
suggest.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/suggest.js b/suggest.js
index 35a5c25..2f6db79 100644
--- a/suggest.js
+++ b/suggest.js
@@ -185,8 +185,8 @@ var githubLicense = function(user, repo) {
// Key phrases for common licenses
var licensePhrases = {
- 'Apache 1.1': 'apache (software)? license,? (version)? 1\\.1',
- 'Apache 2': 'apache (software)? license,? (version)? 2',
+ 'Apache 1.1': 'apache (software )?license,? (version)? 1\\.1',
+ 'Apache 2': 'apache (software )?license,? (version)? 2',
'Original BSD': 'all advertising materials mentioning features or use of this software must display the following acknowledgement',
'New BSD': 'may be used to endorse or promote products derived from this software without specific prior written permission',
'BSD': 'redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met',
From 79ccfef467683f02494e42a07120da9c37fa9da4 Mon Sep 17 00:00:00 2001
From: Greg Cochard
Date: Tue, 1 Dec 2015 10:33:50 -0800
Subject: [PATCH 014/207] Comments
---
server.js | 53 +++++++++++++++--------------------
templates/social-template.svg | 4 +--
try.html | 4 ---
3 files changed, 24 insertions(+), 37 deletions(-)
diff --git a/server.js b/server.js
index 4ae4535..fb499d3 100644
--- a/server.js
+++ b/server.js
@@ -4210,39 +4210,30 @@ cache(function(data, match, sendBadge, request) {
badgeData.colorscheme = '55ACEE';
badgeData.logo = badgeData.logo || logos.twitter;
badgeData.links = [
- 'https://twitter.com/intent/follow?screen_name=' + user
+ 'https://twitter.com/intent/follow?screen_name=' + user,
+ 'https://twitter.com/' + user + '/followers'
];
- if (data.nobubble) {
- badgeData.nobubble = data.nobubble;
- sendBadge(format, badgeData);
- return;
- }
- if (badgeData.template === 'social') {
- badgeData.links[1] = 'https://twitter.com/' + user + '/followers';
- badgeData.text[1] = '';
- request(options, function(err, res, buffer) {
- if (err != null) {
- badgeData.text[1] = 'inaccessible';
- sendBadge(format, badgeData);
- return;
- }
- try {
- var data = JSON.parse(buffer);
- // the data is formatted as an array
- data = data[0];
- // data.followers_count could be zero...don't just check if falsey
- if(!data.hasOwnProperty('followers_count')){
- badgeData.text[1] = 'invalid';
- } else {
- badgeData.text[1] = metric(data.followers_count);
- }
- } catch(e) {
- console.error(e);
- badgeData.text[1] = 'invalid';
- }
+ badgeData.text[1] = '';
+ request(options, function(err, res, buffer) {
+ if (err != null) {
sendBadge(format, badgeData);
- });
- }
+ return;
+ }
+ try {
+ var data = JSON.parse(buffer);
+ // the data is formatted as an array
+ data = data[0];
+ // data.followers_count could be zero...don't just check if falsey
+ if(!data.hasOwnProperty('followers_count')){
+ badgeData.text[1] = '';
+ } else {
+ badgeData.text[1] = metric(data.followers_count);
+ }
+ } catch(e) {
+ console.error(e);
+ }
+ sendBadge(format, badgeData);
+ });
}));
// Snap CI build integration.
diff --git a/templates/social-template.svg b/templates/social-template.svg
index 21c5c4b..386236e 100644
--- a/templates/social-template.svg
+++ b/templates/social-template.svg
@@ -14,7 +14,7 @@
- {{?!it.nobubble}}
+ {{?(it.text[1] && it.text[1].length)}}
@@ -26,7 +26,7 @@
{{=it.escapeXml(it.capitalize(it.text[0]))}}
{{=it.escapeXml(it.capitalize(it.text[0]))}}
- {{?!it.nobubble}}
+ {{?(it.text[1] && it.text[1].length)}}
{{=it.escapeXml(it.text[1])}}
{{=it.escapeXml(it.text[1])}}
diff --git a/try.html b/try.html
index 932ee90..df131b9 100644
--- a/try.html
+++ b/try.html
@@ -502,10 +502,6 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/twitter/follow/shields_io.svg?style=social
- Twitter Follow (with no count):
-
- https://img.shields.io/twitter/follow/shields_io.svg?style=social&nobubble=true
-
Miscellaneous
From f4375efe5154f1b5dbf41127aa2cbda93609b9a8 Mon Sep 17 00:00:00 2001
From: Lars Brinkhoff
Date: Wed, 2 Dec 2015 13:19:29 +0100
Subject: [PATCH 015/207] Consistently use "passing".
---
server.js | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/server.js b/server.js
index 1bfcd84..d2eae53 100644
--- a/server.js
+++ b/server.js
@@ -347,6 +347,7 @@ cache(function(data, match, sendBadge, request) {
badgeData.text[1] = res;
if (res === 'shippable') {
badgeData.colorscheme = 'brightgreen';
+ badgeData.text[1] = 'passing';
} else if (res === 'unshippable') {
badgeData.colorscheme = 'red';
} else {
@@ -384,7 +385,7 @@ cache(function(data, match, sendBadge, request) {
if (build.status === 'finished') {
if (build.result === 'passed') {
badgeData.colorscheme = 'brightgreen';
- badgeData.text[1] = build.result;
+ badgeData.text[1] = 'passing';
} else {
badgeData.colorscheme = 'red';
badgeData.text[1] = build.result;
@@ -425,7 +426,7 @@ cache(function(data, match, sendBadge, request) {
if (build.status === 'finished') {
if (build.result === 'passed') {
badgeData.colorscheme = 'brightgreen';
- badgeData.text[1] = build.result;
+ badgeData.text[1] = 'passing';
} else {
badgeData.colorscheme = 'red';
badgeData.text[1] = build.result;
@@ -565,6 +566,7 @@ function teamcity_badge(url, buildId, advanced, format, data, sendBadge) {
badgeData.text[1] = (data.status || '').toLowerCase();
if (data.status === 'SUCCESS') {
badgeData.colorscheme = 'brightgreen';
+ badgeData.text[1] = 'passing';
} else {
badgeData.colorscheme = 'red';
}
@@ -2137,6 +2139,7 @@ cache(function(data, match, sendBadge, request) {
badgeData.text[1] = res;
if (res === 'passed') {
badgeData.colorscheme = 'brightgreen';
+ badgeData.text[1] = 'passing';
} else if (res === 'failed' || res === 'error') {
badgeData.colorscheme = 'red';
} else if (res === 'pending') {
@@ -3421,7 +3424,7 @@ cache(function(data, match, sendBadge, request) {
switch (statusMatch[1]) {
case 'success':
- badgeData.text[1] = 'passed';
+ badgeData.text[1] = 'passing';
badgeData.colorscheme = 'brightgreen';
break;
case 'projectnotfound':
@@ -4275,6 +4278,7 @@ cache(function(data, match, sendBadge, request) {
badgeData.text[1] = res.toLowerCase();
if (res === 'Passed') {
badgeData.colorscheme = 'brightgreen';
+ badgeData.text[1] = 'passing';
} else if (res === 'Failed') {
badgeData.colorscheme = 'red';
}
From 8c8b2080883f1e2e55bba0ea3fe2abc1e3305522 Mon Sep 17 00:00:00 2001
From: Yannick Galatol
Date: Sun, 29 Nov 2015 13:06:48 +0100
Subject: [PATCH 016/207] Add route for Jenkins code coverage The route looks
like
http://img.shields.io/jenkins/c/https/jenkins.qa.ubuntu.com/precise-desktop-amd64_default.svg
---
server.js | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
try.html | 4 ++++
2 files changed, 57 insertions(+)
diff --git a/server.js b/server.js
index 1bfcd84..d5d43ed 100644
--- a/server.js
+++ b/server.js
@@ -3360,6 +3360,59 @@ cache(function(data, match, sendBadge, request) {
});
}));
+// Jenkins coverage integration
+camp.route(/^\/jenkins(-ci)?\/c\/(http(s)?)\/((?:[^\/]+)(?:\/.+?)?)\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var scheme = match[2]; // http(s)
+ var host = match[4]; // jenkins.qa.ubuntu.com
+ var job = match[5]; // precise-desktop-amd64_default
+ var format = match[6];
+ var options = {
+ json: true,
+ uri: scheme + '://' + host + '/job/' + job
+ + '/lastBuild/cobertura/api/json?tree=results[elements[name,denominator,numerator,ratio]]'
+ };
+
+ if (serverSecrets && serverSecrets.jenkins_user) {
+ options.auth = {
+ user: serverSecrets.jenkins_user,
+ pass: serverSecrets.jenkins_pass
+ };
+ }
+
+ var badgeData = getBadgeData('coverage', data);
+ request(options, function(err, res, json) {
+ if (err !== null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+
+ try {
+ var coverageObject = json.results.elements.filter(function (obj) {
+ return obj.name === 'Lines';
+ })[0];
+ if (coverageObject === undefined) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ var coverage = coverageObject.ratio;
+ if (+coverage !== +coverage) {
+ badgeData.text[1] = 'unknown';
+ sendBadge(format, badgeData);
+ return;
+ }
+ badgeData.text[1] = coverage.toFixed(0) + '%';
+ badgeData.colorscheme = coveragePercentageColor(coverage);
+ sendBadge(format, badgeData);
+ } catch(e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
+
// Ansible integration
camp.route(/^\/ansible\/(role)\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
diff --git a/try.html b/try.html
index ac79fd1..68ef27c 100644
--- a/try.html
+++ b/try.html
@@ -136,6 +136,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/jenkins/t/https/jenkins.qa.ubuntu.com/precise-desktop-amd64_default.svg
+ Jenkins coverage:
+
+ https://img.shields.io/jenkins/c/https/jenkins.qa.ubuntu.com/address-book-service-utopic-i386-ci.svg
+
Coveralls:
https://img.shields.io/coveralls/jekyll/jekyll.svg
From 92f2f322db72c14567eee3a5af4b70c3b36b7fd8 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Fri, 4 Dec 2015 21:04:07 +0100
Subject: [PATCH 017/207] Kill off the Twitter URL API
Fixes #568
---
server.js | 22 +++++-----------------
1 file changed, 5 insertions(+), 17 deletions(-)
diff --git a/server.js b/server.js
index c7bb46a..936161e 100644
--- a/server.js
+++ b/server.js
@@ -4228,7 +4228,8 @@ cache(function(data, match, sendBadge, request) {
var path = match[2]; // eg, shields.io
var format = match[3];
var page = encodeURIComponent(scheme + '://' + path);
- var url = 'http://cdn.api.twitter.com/1/urls/count.json?url=' + page;
+ // The URL API died: #568.
+ //var url = 'http://cdn.api.twitter.com/1/urls/count.json?url=' + page;
var badgeData = getBadgeData('tweet', data);
if (badgeData.template === 'social') {
badgeData.logo = badgeData.logo || logos.twitter;
@@ -4237,22 +4238,9 @@ cache(function(data, match, sendBadge, request) {
'https://twitter.com/search?q=' + page,
];
}
- request(url, function(err, res, buffer) {
- if (err != null) {
- badgeData.text[1] = 'inaccessible';
- sendBadge(format, badgeData);
- return;
- }
- try {
- var data = JSON.parse(buffer);
- badgeData.text[1] = metric(data.count);
- badgeData.colorscheme = '55ACEE';
- sendBadge(format, badgeData);
- } catch(e) {
- badgeData.text[1] = 'invalid';
- sendBadge(format, badgeData);
- }
- });
+ badgeData.text[1] = '';
+ badgeData.colorscheme = '55ACEE';
+ sendBadge(format, badgeData);
}));
// Twitter follow badge.
From 5bc3fd64e3c4921eda788a56921b44669bc6f1f1 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sat, 5 Dec 2015 23:42:06 +0100
Subject: [PATCH 018/207] Cleanup style on #545's PR
---
server.js | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/server.js b/server.js
index 936161e..985ef59 100644
--- a/server.js
+++ b/server.js
@@ -4266,13 +4266,10 @@ cache(function(data, match, sendBadge, request) {
return;
}
try {
- var data = JSON.parse(buffer);
- // the data is formatted as an array
- data = data[0];
- // data.followers_count could be zero...don't just check if falsey
- if(!data.hasOwnProperty('followers_count')){
- badgeData.text[1] = '';
- } else {
+ // The data is formatted as an array.
+ var data = JSON.parse(buffer)[0];
+ // data.followers_count could be zero… don't just check if falsey.
+ if (data.followers_count != null){
badgeData.text[1] = metric(data.followers_count);
}
} catch(e) {
From b4da2cd2b5b30fb099fe4fdddd2f43494a142fbe Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 6 Dec 2015 15:30:27 +0100
Subject: [PATCH 019/207] Only show the Twitter logo with a social badge
---
server.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/server.js b/server.js
index 985ef59..aa08045 100644
--- a/server.js
+++ b/server.js
@@ -4254,7 +4254,9 @@ cache(function(data, match, sendBadge, request) {
var badgeData = getBadgeData('Follow', data);
badgeData.text[0] = 'Follow ' + user;
badgeData.colorscheme = '55ACEE';
- badgeData.logo = badgeData.logo || logos.twitter;
+ if (badgeData.template === 'social') {
+ badgeData.logo = badgeData.logo || logos.twitter;
+ }
badgeData.links = [
'https://twitter.com/intent/follow?screen_name=' + user,
'https://twitter.com/' + user + '/followers'
From 4534a8e506230fe4f6a1c82aeb80754163507b95 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 6 Dec 2015 15:30:58 +0100
Subject: [PATCH 020/207] website: Twitter Follow badge
---
index.html | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/index.html b/index.html
index 2825296..75b73bd 100644
--- a/index.html
+++ b/index.html
@@ -503,6 +503,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/twitter/url/http/shields.io.svg?style=social
+ Twitter Follow:
+
+ https://img.shields.io/twitter/follow/shields_io.svg?style=social
+
Miscellaneous
From 2925658c584f8805f63d221e52a4395ffe02fcf2 Mon Sep 17 00:00:00 2001
From: coderaiser
Date: Fri, 11 Dec 2015 10:35:43 +0200
Subject: [PATCH 021/207] fix server gemnasium: update! -> up-to-date
---
server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server.js b/server.js
index acf870e..0f71571 100644
--- a/server.js
+++ b/server.js
@@ -2275,7 +2275,7 @@ cache(function(data, match, sendBadge, request) {
badgeData.colorscheme = 'brightgreen';
} else if (statusMatch === 'out-of-date') {
badgeData.colorscheme = 'yellow';
- } else if (statusMatch === 'update!') {
+ } else if (statusMatch === 'up-to-date') {
badgeData.colorscheme = 'red';
} else if (statusMatch === 'none') {
badgeData.colorscheme = 'brightgreen';
From c38fd61a9056560bb13a94c7384a80ad0f971606 Mon Sep 17 00:00:00 2001
From: geert olaerts
Date: Fri, 11 Dec 2015 23:57:41 +0100
Subject: [PATCH 022/207] added codacy branch support
---
server.js | 11 +++++++++--
try.html | 4 ++++
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/server.js b/server.js
index acf870e..58a0bcc 100644
--- a/server.js
+++ b/server.js
@@ -2325,11 +2325,18 @@ cache(function(data, match, sendBadge, request) {
}));
// Codacy integration
-camp.route(/^\/codacy\/(.+)\.(svg|png|gif|jpg|json)$/,
+camp.route(/^\/codacy?\/([^\/]+)(?:\/(.+))?\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
var projectId = match[1]; // eg. e27821fb6289410b8f58338c7e0bc686
- var format = match[2];
+ var branch = match[2];
+ var format = match[3];
+
+ queryParams = {};
+ if (branch) {
+ queryParams.branch = branch;
+ }
var url = 'https://www.codacy.com/project/badge/' + projectId;
+ url += '?' + querystring.stringify(queryParams);
var badgeData = getBadgeData('code quality', data);
fetchFromSvg(request, url, function(err, res) {
if (err != null) {
diff --git a/try.html b/try.html
index 0f8efff..bb15991 100644
--- a/try.html
+++ b/try.html
@@ -626,6 +626,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/codacy/e27821fb6289410b8f58338c7e0bc686.svg
+ Codacy branch:
+
+ https://img.shields.io/codacy/e27821fb6289410b8f58338c7e0bc686/master.svg
+
Libscore:
https://img.shields.io/libscore/s/jQuery.svg
From 1a25e1d606762b0a230175c01a07ec3cec8001a7 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 13 Dec 2015 22:44:07 +0100
Subject: [PATCH 023/207] Gemnasium: parse indented SVG badge
---
server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server.js b/server.js
index c285d05..cffdd4d 100644
--- a/server.js
+++ b/server.js
@@ -2268,7 +2268,7 @@ cache(function(data, match, sendBadge, request) {
}
try {
var nameMatch = buffer.match(/(devD|d)ependencies/)[0];
- var statusMatch = buffer.match(/'14'>(.+)<\/text>\n<\/g>/)[1];
+ var statusMatch = buffer.match(/'14'>(.+)<\/text>\n *<\/g>/)[1];
badgeData.text[0] = nameMatch;
badgeData.text[1] = statusMatch;
if (statusMatch === 'up-to-date') {
From f35c86d5dc971593445b11f89d87c6614caef40a Mon Sep 17 00:00:00 2001
From: Patrick Samson
Date: Sun, 13 Dec 2015 16:55:11 -0500
Subject: [PATCH 024/207] Fixed Package Control downloads support
---
server.js | 56 ++++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 45 insertions(+), 11 deletions(-)
diff --git a/server.js b/server.js
index df27fdc..f68190b 100644
--- a/server.js
+++ b/server.js
@@ -1211,16 +1211,13 @@ cache(function(data, match, sendBadge, request) {
}));
// Package Control integration.
-camp.route(/^\/packagecontrol\/(.*)\.(svg|png|gif|jpg|json)$/,
+camp.route(/^\/packagecontrol\/(dm|dw|dd|dt)\/(.*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
- var userRepo = match[1]; // eg, `Package%20Control`.
- var format = match[2];
+ var info = match[1]; // either `dm`, `dw`, `dd` or dt`.
+ var userRepo = match[2]; // eg, `Package%20Control`.
+ var format = match[3];
var apiUrl = 'https://packagecontrol.io/packages/' + userRepo + '.json';
var badgeData = getBadgeData('downloads', data);
- if (userRepo.substr(-14) === '/:package_name') {
- badgeData.text[1] = 'invalid';
- return sendBadge(format, badgeData);
- }
request(apiUrl, function(err, res, buffer) {
if (err != null) {
badgeData.text[1] = 'inaccessible';
@@ -1228,10 +1225,47 @@ cache(function(data, match, sendBadge, request) {
}
try {
var data = JSON.parse(buffer);
-
- var downloads = data.package.installs.total;
- badgeData.text[1] = metric(downloads) + ' total';
-
+ var downloads = 0;
+ switch (info.charAt(1)) {
+ case 'm':
+ // daily downloads are separated by Operating System
+ var platforms = data.installs.daily.data;
+ platforms.forEach(function(platform) {
+ // loop through the first 30 days or 1 month
+ for (var i = 0; i < 30; i++) {
+ // add the downloads for that day for that platform
+ downloads += platform.totals[i];
+ }
+ });
+ badgeData.text[1] = metric(downloads) + '/month';
+ break;
+ case 'w':
+ // daily downloads are separated by Operating System
+ var platforms = data.installs.daily.data;
+ platforms.forEach(function(platform) {
+ // loop through the first 7 days or 1 week
+ for (var i = 0; i < 7; i++) {
+ // add the downloads for that day for that platform
+ downloads += platform.totals[i];
+ }
+ });
+ badgeData.text[1] = metric(downloads) + '/week';
+ break;
+ case 'd':
+ // daily downloads are separated by Operating System
+ var platforms = data.installs.daily.data;
+ platforms.forEach(function(platform) {
+ // use the downloads from yesterday
+ downloads += platform.totals[1];
+ });
+ badgeData.text[1] = metric(downloads) + '/day';
+ break;
+ case 't':
+ // all-time downloads are already compiled
+ downloads = data.installs.total;
+ badgeData.text[1] = metric(downloads) + ' total';
+ break;
+ }
badgeData.colorscheme = downloadCountColor(downloads);
sendBadge(format, badgeData);
} catch(e) {
From 8ca790253dd6e9fe757268ca1ef13b439067df0f Mon Sep 17 00:00:00 2001
From: Patrick Samson
Date: Sun, 13 Dec 2015 17:05:16 -0500
Subject: [PATCH 025/207] Added Package Control to the front page
---
try.html | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/try.html b/try.html
index ac79fd1..cb2c407 100644
--- a/try.html
+++ b/try.html
@@ -351,6 +351,22 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/dub/dt/vibe-d/0.7.23.svg
+ Package Control:
+
+ https://img.shields.io/packagecontrol/dm/Package%20Control.svg
+
+ Package Control:
+
+ https://img.shields.io/packagecontrol/dw/Package%20Control.svg
+
+ Package Control:
+
+ https://img.shields.io/packagecontrol/dd/Package%20Control.svg
+
+ Package Control:
+
+ https://img.shields.io/packagecontrol/dt/Package%20Control.svg
+
Version
From 3ad1b37d93d98855531f058476dc77e268516ddb Mon Sep 17 00:00:00 2001
From: Patrick Samson
Date: Sun, 13 Dec 2015 17:09:05 -0500
Subject: [PATCH 026/207] Remove 'total' from badge
---
server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server.js b/server.js
index f68190b..2d88bb4 100644
--- a/server.js
+++ b/server.js
@@ -1263,7 +1263,7 @@ cache(function(data, match, sendBadge, request) {
case 't':
// all-time downloads are already compiled
downloads = data.installs.total;
- badgeData.text[1] = metric(downloads) + ' total';
+ badgeData.text[1] = metric(downloads);
break;
}
badgeData.colorscheme = downloadCountColor(downloads);
From 495eee166082ed270ddb332b19bac4ad95247db0 Mon Sep 17 00:00:00 2001
From: Tom Chen
Date: Wed, 9 Dec 2015 23:11:02 +0800
Subject: [PATCH 027/207] fix(server.js): Gemnasium svg regex update
---
server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server.js b/server.js
index ea4f800..b8351bf 100644
--- a/server.js
+++ b/server.js
@@ -2333,7 +2333,7 @@ cache(function(data, match, sendBadge, request) {
}
try {
var nameMatch = buffer.match(/(devD|d)ependencies/)[0];
- var statusMatch = buffer.match(/'14'>(.+)<\/text>\n *<\/g>/)[1];
+ var statusMatch = buffer.match(/'14'>(.+)<\/text>\s*<\/g>/)[1];
badgeData.text[0] = nameMatch;
badgeData.text[1] = statusMatch;
if (statusMatch === 'up-to-date') {
From 7aad792fb522bdbb44f15246105cc79d4463af3a Mon Sep 17 00:00:00 2001
From: Lars Brinkhoff
Date: Tue, 8 Dec 2015 07:05:04 +0100
Subject: [PATCH 028/207] Coverity also consistently uses "passing".
---
server.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/server.js b/server.js
index ea4f800..0fd23bd 100644
--- a/server.js
+++ b/server.js
@@ -766,6 +766,7 @@ cache(function(data, match, sendBadge, request) {
if (data.message === 'passed') {
badgeData.colorscheme = 'brightgreen'
+ badgeData.text[1] = 'passing';
} else if (/^passed .* new defects$/.test(data.message)) {
badgeData.colorscheme = 'yellow';
} else if (data.message === 'pending') {
From 5d3d477100839eee7d9900be32050de12effda24 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Mon, 14 Dec 2015 23:44:32 +0100
Subject: [PATCH 029/207] website: Jenkins, PackageControl
---
index.html | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/index.html b/index.html
index 75b73bd..50a51e8 100644
--- a/index.html
+++ b/index.html
@@ -137,6 +137,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/jenkins/t/https/jenkins.qa.ubuntu.com/precise-desktop-amd64_default.svg
+ Jenkins coverage:
+
+ https://img.shields.io/jenkins/c/https/jenkins.qa.ubuntu.com/address-book-service-utopic-i386-ci.svg
+
Coveralls:
https://img.shields.io/coveralls/jekyll/jekyll.svg
@@ -352,6 +356,22 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/dub/dt/vibe-d/0.7.23.svg
+ Package Control:
+
+ https://img.shields.io/packagecontrol/dm/Package%20Control.svg
+
+ Package Control:
+
+ https://img.shields.io/packagecontrol/dw/Package%20Control.svg
+
+ Package Control:
+
+ https://img.shields.io/packagecontrol/dd/Package%20Control.svg
+
+ Package Control:
+
+ https://img.shields.io/packagecontrol/dt/Package%20Control.svg
+
Version
From 699687917369f6d1afa494494344f742bf547c46 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 15 Dec 2015 23:52:22 +0100
Subject: [PATCH 030/207] Scrutinizer code quality: support branches with /
Fixes #561.
---
server.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/server.js b/server.js
index 0fd23bd..43aadd0 100644
--- a/server.js
+++ b/server.js
@@ -2234,8 +2234,8 @@ cache(function(data, match, sendBadge, request) {
var slashesInRepo = 2;
if (repoParts[0] === 'gp') { slashesInRepo = 1; }
if ((repoParts.length - 1) > slashesInRepo) {
- branch = repoParts[repoParts.length - 1];
- repo = repoParts.slice(0, -1).join('/');
+ branch = repoParts.slice(slashesInRepo + 1).join('/');
+ repo = repoParts.slice(0, slashesInRepo + 1).join('/');
}
var apiUrl = 'https://scrutinizer-ci.com/api/repositories/' + repo;
var badgeData = getBadgeData('code quality', data);
From a1597955d66f95d8a7726d296e8710c945b41ade Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Wed, 16 Dec 2015 00:00:29 +0100
Subject: [PATCH 031/207] Scrutinizer: allow / in branches everywhere
Part of #561.
---
server.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/server.js b/server.js
index 43aadd0..3ed38d5 100644
--- a/server.js
+++ b/server.js
@@ -2147,8 +2147,8 @@ cache(function(data, match, sendBadge, request) {
var slashesInRepo = 2;
if (repoParts[0] === 'gp') { slashesInRepo = 1; }
if ((repoParts.length - 1) > slashesInRepo) {
- branch = repoParts[repoParts.length - 1];
- repo = repoParts.slice(0, -1).join('/');
+ branch = repoParts.slice(slashesInRepo + 1).join('/');
+ repo = repoParts.slice(0, slashesInRepo + 1).join('/');
}
var apiUrl = 'https://scrutinizer-ci.com/api/repositories/' + repo;
var badgeData = getBadgeData('coverage', data);
@@ -2186,8 +2186,8 @@ cache(function(data, match, sendBadge, request) {
var slashesInRepo = 2;
if (repoParts[0] === 'gp') { slashesInRepo = 1; }
if ((repoParts.length - 1) > slashesInRepo) {
- branch = repoParts[repoParts.length - 1];
- repo = repoParts.slice(0, -1).join('/');
+ branch = repoParts.slice(slashesInRepo + 1).join('/');
+ repo = repoParts.slice(0, slashesInRepo + 1).join('/');
}
var apiUrl = 'https://scrutinizer-ci.com/api/repositories/' + repo;
var badgeData = getBadgeData('build', data);
From 2de997602d6c51f2d39399231529d055fe0c1c47 Mon Sep 17 00:00:00 2001
From: Lars Brinkhoff
Date: Thu, 17 Dec 2015 09:13:54 +0100
Subject: [PATCH 032/207] Run apt-get update before installing packages.
---
.travis.yml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index 3a844f8..70bfd2d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,6 @@
-before_install: sudo apt-get install libcairo2-dev libjpeg8-dev libpango1.0-dev libgif-dev build-essential g++
+before_install:
+ - sudo apt-get update -myqq
+ - sudo apt-get install libcairo2-dev libjpeg8-dev libpango1.0-dev libgif-dev build-essential g++
language: node_js
node_js:
- 0.10
From 2fb5c72ec663ad34a53c2a28059e53d30a3af6bd Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Thu, 17 Dec 2015 23:04:54 +0100
Subject: [PATCH 033/207] Codacy code cleanup
---
server.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/server.js b/server.js
index 22fddb3..49f7c89 100644
--- a/server.js
+++ b/server.js
@@ -2401,8 +2401,8 @@ cache(function(data, match, sendBadge, request) {
if (branch) {
queryParams.branch = branch;
}
- var url = 'https://www.codacy.com/project/badge/' + projectId;
- url += '?' + querystring.stringify(queryParams);
+ var query = querystring.stringify(queryParams);
+ var url = 'https://www.codacy.com/project/badge/' + projectId + '?' + query;
var badgeData = getBadgeData('code quality', data);
fetchFromSvg(request, url, function(err, res) {
if (err != null) {
From 900b482915232f68fbd3f5417f985c4b9097debc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?=
Date: Mon, 9 Mar 2015 14:31:57 +0100
Subject: [PATCH 034/207] Add StackExchange integration
---
server.js | 47 +++++++++++++++++++++++++++++++++++++++++++++++
try.html | 4 ++++
2 files changed, 51 insertions(+)
diff --git a/server.js b/server.js
index 49f7c89..f840ebd 100644
--- a/server.js
+++ b/server.js
@@ -14,6 +14,7 @@ console.log('http://[::1]:' + serverPort + '/try.html');
var domain = require('domain');
var request = require('request');
var fs = require('fs');
+var zlib = require('zlib');
var LruCache = require('./lru-cache.js');
var badge = require('./badge.js');
var svg2img = require('./svg-to-img.js');
@@ -4518,6 +4519,52 @@ cache(function(data, match, sendBadge, request) {
sendBadge(format, badgeData);
}));
+// StackExchange integration.
+camp.route(/^\/stackexchange\/([^\/]+)\/([^\/])\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var site = match[1]; // eg, stackoverflow
+ var info = match[2]; // either `r`
+ var user = match[3]; // eg, 232250
+ var format = match[4];
+ var options = {
+ method: 'GET',
+ uri: 'https://api.stackexchange.com/2.2/users/'+user+'?site='+site,
+ encoding: null
+ }
+ var badgeData = getBadgeData(site, data);
+ request(options, function (err, res, buffer) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(badgeData, format);
+ }
+ zlib.gunzip(buffer, function (err, body) {
+ try {
+ var data = JSON.parse(body.toString());
+
+ if (info === 'r') {
+ var reputation = data.items[0].reputation;
+ badgeData.text[1] = metric(reputation);
+ if (reputation === 0) {
+ badgeData.colorscheme = 'red';
+ } else if (reputation < 1000) {
+ badgeData.colorscheme = 'yellow';
+ } else if (reputation < 10000) {
+ badgeData.colorscheme = 'yellowgreen';
+ } else if (reputation < 20000) {
+ badgeData.colorscheme = 'green';
+ } else {
+ badgeData.colorscheme = 'brightgreen';
+ }
+ sendBadge(format, badgeData);
+ }
+ } catch (e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+ })}
+));
+
// Any badge.
camp.route(/^\/(:|badge\/)(([^-]|--)*?)-(([^-]|--)*)-(([^-]|--)+)\.(svg|png|gif|jpg)$/,
function(data, match, end, ask) {
diff --git a/try.html b/try.html
index ea26273..cc5a9fe 100644
--- a/try.html
+++ b/try.html
@@ -742,6 +742,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/ansible/role/3078.svg
+ StackExchange:
+
+ https://img.shields.io/stackexchange/tex/r/951.svg
+
Your Badge
From 1bfabb9ed78b8a787e7488f8a00868d76cf68e44 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?=
Date: Mon, 9 Mar 2015 15:41:19 +0100
Subject: [PATCH 035/207] Add tag badges for StackExchange
---
server.js | 26 +++++++++++++++++++++++---
try.html | 4 ++++
2 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/server.js b/server.js
index f840ebd..93bbe82 100644
--- a/server.js
+++ b/server.js
@@ -4524,11 +4524,17 @@ camp.route(/^\/stackexchange\/([^\/]+)\/([^\/])\/([^\/]+)\.(svg|png|gif|jpg|json
cache(function(data, match, sendBadge, request) {
var site = match[1]; // eg, stackoverflow
var info = match[2]; // either `r`
- var user = match[3]; // eg, 232250
+ var item = match[3]; // eg, 232250
var format = match[4];
+ var path;
+ if (info === 'r') {
+ path = 'users/'+item;
+ } else if (info === 't') {
+ path = 'tags/'+item+'/info';
+ }
var options = {
method: 'GET',
- uri: 'https://api.stackexchange.com/2.2/users/'+user+'?site='+site,
+ uri: 'https://api.stackexchange.com/2.2/'+path+'?site='+site,
encoding: null
}
var badgeData = getBadgeData(site, data);
@@ -4555,8 +4561,22 @@ cache(function(data, match, sendBadge, request) {
} else {
badgeData.colorscheme = 'brightgreen';
}
- sendBadge(format, badgeData);
+ } else if (info === 't') {
+ var count = data.items[0].count;
+ badgeData.text[1] = metric(count)+' questions';
+ if (count === 0) {
+ badgeData.colorscheme = 'red';
+ } else if (count < 1000) {
+ badgeData.colorscheme = 'yellow';
+ } else if (count < 10000) {
+ badgeData.colorscheme = 'yellowgreen';
+ } else if (count < 20000) {
+ badgeData.colorscheme = 'green';
+ } else {
+ badgeData.colorscheme = 'brightgreen';
+ }
}
+ sendBadge(format, badgeData);
} catch (e) {
badgeData.text[1] = 'invalid';
sendBadge(format, badgeData);
diff --git a/try.html b/try.html
index cc5a9fe..47235d6 100644
--- a/try.html
+++ b/try.html
@@ -746,6 +746,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/stackexchange/tex/r/951.svg
+ StackExchange:
+
+ https://img.shields.io/stackexchange/stackoverflow/t/augeas.svg
+
Your Badge
From 449210e80fe637ee25f59b31d35114874115d207 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?=
Date: Sun, 22 Mar 2015 23:11:42 +0100
Subject: [PATCH 036/207] Use floorCountColor() for stackexchange badge
---
server.js | 24 ++----------------------
1 file changed, 2 insertions(+), 22 deletions(-)
diff --git a/server.js b/server.js
index 93bbe82..10cab9b 100644
--- a/server.js
+++ b/server.js
@@ -4550,31 +4550,11 @@ cache(function(data, match, sendBadge, request) {
if (info === 'r') {
var reputation = data.items[0].reputation;
badgeData.text[1] = metric(reputation);
- if (reputation === 0) {
- badgeData.colorscheme = 'red';
- } else if (reputation < 1000) {
- badgeData.colorscheme = 'yellow';
- } else if (reputation < 10000) {
- badgeData.colorscheme = 'yellowgreen';
- } else if (reputation < 20000) {
- badgeData.colorscheme = 'green';
- } else {
- badgeData.colorscheme = 'brightgreen';
- }
+ badgeData.colorscheme = floorCountColor(1000, 10000, 20000);
} else if (info === 't') {
var count = data.items[0].count;
badgeData.text[1] = metric(count)+' questions';
- if (count === 0) {
- badgeData.colorscheme = 'red';
- } else if (count < 1000) {
- badgeData.colorscheme = 'yellow';
- } else if (count < 10000) {
- badgeData.colorscheme = 'yellowgreen';
- } else if (count < 20000) {
- badgeData.colorscheme = 'green';
- } else {
- badgeData.colorscheme = 'brightgreen';
- }
+ badgeData.colorscheme = floorCountColor(1000, 10000, 20000);
}
sendBadge(format, badgeData);
} catch (e) {
From edf80a5560c3e9f8bd1399abbb6d7aeb3257a372 Mon Sep 17 00:00:00 2001
From: Lars Brinkhoff
Date: Wed, 16 Dec 2015 11:46:31 +0100
Subject: [PATCH 037/207] Fixes according to code review.
---
server.js | 36 +++++++++++++++++-------------------
1 file changed, 17 insertions(+), 19 deletions(-)
diff --git a/server.js b/server.js
index 10cab9b..0e2896c 100644
--- a/server.js
+++ b/server.js
@@ -14,7 +14,6 @@ console.log('http://[::1]:' + serverPort + '/try.html');
var domain = require('domain');
var request = require('request');
var fs = require('fs');
-var zlib = require('zlib');
var LruCache = require('./lru-cache.js');
var badge = require('./badge.js');
var svg2img = require('./svg-to-img.js');
@@ -4535,33 +4534,32 @@ cache(function(data, match, sendBadge, request) {
var options = {
method: 'GET',
uri: 'https://api.stackexchange.com/2.2/'+path+'?site='+site,
- encoding: null
+ gzip: true
}
var badgeData = getBadgeData(site, data);
request(options, function (err, res, buffer) {
if (err != null) {
badgeData.text[1] = 'inaccessible';
sendBadge(badgeData, format);
+ return;
}
- zlib.gunzip(buffer, function (err, body) {
- try {
- var data = JSON.parse(body.toString());
+ try {
+ var data = JSON.parse(buffer.toString());
- if (info === 'r') {
- var reputation = data.items[0].reputation;
- badgeData.text[1] = metric(reputation);
- badgeData.colorscheme = floorCountColor(1000, 10000, 20000);
- } else if (info === 't') {
- var count = data.items[0].count;
- badgeData.text[1] = metric(count)+' questions';
- badgeData.colorscheme = floorCountColor(1000, 10000, 20000);
- }
- sendBadge(format, badgeData);
- } catch (e) {
- badgeData.text[1] = 'invalid';
- sendBadge(format, badgeData);
+ if (info === 'r') {
+ var reputation = data.items[0].reputation;
+ badgeData.text[1] = metric(reputation);
+ badgeData.colorscheme = floorCountColor(1000, 10000, 20000);
+ } else if (info === 't') {
+ var count = data.items[0].count;
+ badgeData.text[1] = metric(count)+' questions';
+ badgeData.colorscheme = floorCountColor(1000, 10000, 20000);
}
- });
+ sendBadge(format, badgeData);
+ } catch (e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
})}
));
From 58e6a1f20ec572eefb3cf9deffdbaee2d7d37389 Mon Sep 17 00:00:00 2001
From: Benoit Ruiz
Date: Thu, 3 Dec 2015 21:24:11 +0100
Subject: [PATCH 038/207] Add JIRA issue vendor
---
server.js | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
try.html | 4 ++++
2 files changed, 61 insertions(+)
diff --git a/server.js b/server.js
index 1bfcd84..167efc1 100644
--- a/server.js
+++ b/server.js
@@ -284,6 +284,63 @@ camp.notfound(/.*/, function(query, match, end, request) {
// Vendors.
+// JIRA issue integration
+camp.route(/^\/jira\/issue\/(http(?:s)?)\/(.+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
+cache(function (data, match, sendBadge, request) {
+ var protocol = match[1];
+ var host = match[2];
+ var issueKey = match[3];
+ var format = match[4];
+
+ var options = {
+ method: 'GET',
+ json: true,
+ uri: protocol + '://' + host + '/rest/api/2/issue/' + issueKey
+ };
+ if (serverSecrets && serverSecrets.jira_username) {
+ options.auth = {
+ user: serverSecrets.jira_username,
+ pass: serverSecrets.jira_password
+ };
+ }
+
+ // map JIRA color names to closest shields color schemes
+ var colorMap = {
+ 'medium-gray': 'lightgrey',
+ 'green': 'green',
+ 'yellow': 'yellow',
+ 'brown': 'orange',
+ 'warm-red': 'red',
+ 'blue-gray': 'blue'
+ };
+
+ var badgeData = getBadgeData(issueKey, data);
+ request(options, function (err, res, json) {
+ if (err !== null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ try {
+ var jiraIssue = json;
+ if (jiraIssue.fields && jiraIssue.fields.status) {
+ if (jiraIssue.fields.status.name) {
+ badgeData.text[1] = jiraIssue.fields.status.name; // e.g. "In Development"
+ }
+ if (jiraIssue.fields.status.statusCategory) {
+ badgeData.colorscheme = colorMap[jiraIssue.fields.status.statusCategory.colorName] || 'lightgrey';
+ }
+ } else {
+ badgeData.text[1] = 'invalid';
+ }
+ sendBadge(format, badgeData);
+ } catch (e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
+
// Travis integration
camp.route(/^\/travis(-ci)?\/([^\/]+\/[^\/]+)(?:\/(.+))?\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
diff --git a/try.html b/try.html
index ac79fd1..ebc9141 100644
--- a/try.html
+++ b/try.html
@@ -682,6 +682,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/gitter/room/nwjs/nw.js.svg
+ JIRA issue:
+
+ https://img.shields.io/jira/issue/https/issues.apache.org/jira/KAFKA-2896.svg
+
Longer Miscellaneous
From 2d1fe44d9e88807f5b4cda0de0f7020dcb7ed4a1 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sat, 19 Dec 2015 19:57:01 +0100
Subject: [PATCH 039/207] website: codacy branch
---
index.html | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/index.html b/index.html
index 50a51e8..ab0106b 100644
--- a/index.html
+++ b/index.html
@@ -647,6 +647,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/codacy/e27821fb6289410b8f58338c7e0bc686.svg
+ Codacy branch:
+
+ https://img.shields.io/codacy/e27821fb6289410b8f58338c7e0bc686/master.svg
+
Libscore:
https://img.shields.io/libscore/s/jQuery.svg
From 33d95aeffffe67ab3b32f5f7951ed0732fbfc7fa Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Mon, 21 Dec 2015 20:14:00 +0100
Subject: [PATCH 040/207] Remove "total" from total downloads badges
As mentionned here:
https://github.com/badges/shields/pull/582#issuecomment-164302758.
---
server.js | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/server.js b/server.js
index 49f7c89..892ea80 100644
--- a/server.js
+++ b/server.js
@@ -457,7 +457,7 @@ cache(function (data, match, sendBadge, request) {
process: function (data, badgeData) {
downloads = data.crate? data.crate.downloads: data.version.downloads;
version = data.version && data.version.num;
- badgeData.text[1] = metric(downloads) + (version? ' version ' + version: ' total');
+ badgeData.text[1] = metric(downloads) + (version? ' version ' + version: '');
badgeData.colorscheme = downloadCountColor(downloads);
}
},
@@ -1072,7 +1072,7 @@ cache(function(data, match, sendBadge, request) {
break;
case 't':
var downloads = data.package.downloads.total;
- badgeData.text[1] = metric(downloads) + ' total';
+ badgeData.text[1] = metric(downloads);
break;
}
badgeData.colorscheme = downloadCountColor(downloads);
@@ -1336,7 +1336,7 @@ cache(function (data, match, sendBadge, request) {
totalDownloads = totalDownloads + downloads[index].downloads;
}
- badgeData.text[1] = metric(totalDownloads) + ' total';
+ badgeData.text[1] = metric(totalDownloads);
if (totalDownloads === 0) {
badgeData.colorscheme = 'red';
} else {
@@ -1917,7 +1917,7 @@ cache(function(data, match, sendBadge, request) {
break;
case 't':
var downloads = data.downloads.all;
- badgeData.text[1] = metric(downloads) + ' total';
+ badgeData.text[1] = metric(downloads);
break;
}
badgeData.colorscheme = downloadCountColor(downloads);
@@ -3207,7 +3207,7 @@ function mapNugetFeed(pattern, offset, getInfo) {
}
try {
var downloads = data.DownloadCount;
- badgeData.text[1] = metric(downloads) + ' total';
+ badgeData.text[1] = metric(downloads);
badgeData.colorscheme = downloadCountColor(downloads);
sendBadge(format, badgeData);
} catch(e) {
@@ -3268,7 +3268,7 @@ cache(function(data, match, sendBadge, request) {
var total = json.downloads;
badgeData.colorscheme = downloadCountColor(total);
badgeData.text[0] = 'downloads';
- badgeData.text[1] = metric(total) + ' total';
+ badgeData.text[1] = metric(total);
} else if (info === 'e') {
var endorsement = json.endorsement;
if (endorsement === 'approved') {
@@ -3752,7 +3752,7 @@ cache(function(data, match, sendBadge, request) {
}
try {
var total = JSON.parse(buffer).downloaded;
- badgeData.text[1] = metric(total) + ' total';
+ badgeData.text[1] = metric(total);
if (total === 0) {
badgeData.colorscheme = 'red';
} else if (total < 100) {
@@ -3979,7 +3979,7 @@ cache(function(data, match, sendBadge, request) {
sendBadge(format, badgeData);
return;
}
- badgeData.text[1] = metric(dls) + ' total';
+ badgeData.text[1] = metric(dls);
badgeData.colorscheme = 'green';
sendBadge(format, badgeData);
});
From ca1cb86d6c56bec82edfabea319951cab244c064 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 22 Dec 2015 18:59:34 +0100
Subject: [PATCH 041/207] Gratipay badge for teams
Fixes #520.
Related to https://github.com/gratipay/gratipay.com/commit/42d7ea17b5a2a6e506231a535e1a444426f6f062
---
server.js | 20 +++++++++++---------
try.html | 10 +++++++---
2 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/server.js b/server.js
index 892ea80..12939f2 100644
--- a/server.js
+++ b/server.js
@@ -829,11 +829,14 @@ cache(function(data, match, sendBadge, request) {
}));
// Gratipay integration.
-camp.route(/^\/(?:gittip|gratipay(?:\/user)?)\/(.*)\.(svg|png|gif|jpg|json)$/,
+camp.route(/^\/(?:gittip|gratipay(\/user|\/team)?)\/(.*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
- var user = match[1]; // eg, `dougwilson`.
- var format = match[2];
- var apiUrl = 'https://www.gratipay.com/~' + user + '/public.json';
+ var type = match[1]; // eg, `user`.
+ var user = match[2]; // eg, `dougwilson`.
+ var format = match[3];
+ if (type === '') { type = '/user'; }
+ if (type === '/user') { user = '~' + user; }
+ var apiUrl = 'https://gratipay.com/' + user + '/public.json';
var badgeData = getBadgeData('tips', data);
if (badgeData.template === 'social') {
badgeData.logo = badgeData.logo || logos.gratipay;
@@ -848,13 +851,12 @@ cache(function(data, match, sendBadge, request) {
var data = JSON.parse(buffer);
var receiving = data.receiving || data.taking;
if (receiving) {
- var money = parseInt(receiving);
- badgeData.text[1] = '$' + metric(money) + '/week';
- if (money === 0) {
+ badgeData.text[1] = '$' + metric(receiving) + '/week';
+ if (receiving === 0) {
badgeData.colorscheme = 'red';
- } else if (money < 10) {
+ } else if (receiving < 10) {
badgeData.colorscheme = 'yellow';
- } else if (money < 100) {
+ } else if (receiving < 100) {
badgeData.colorscheme = 'green';
} else {
badgeData.colorscheme = 'brightgreen';
diff --git a/try.html b/try.html
index ea26273..d864aad 100644
--- a/try.html
+++ b/try.html
@@ -530,9 +530,13 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
Miscellaneous
- Gratipay:
-
- https://img.shields.io/gratipay/JSFiddle.svg
+ Gratipay User:
+
+ https://img.shields.io/gratipay/user/dougwilson.svg
+
+ Gratipay Team:
+
+ https://img.shields.io/gratipay/team/shields.svg
Bountysource:
From 215a59728c9bc1dc2313ef084e06f45e3f29974c Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 22 Dec 2015 19:02:34 +0100
Subject: [PATCH 042/207] Shields Gratipay badge
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 6a86565..227ba2a 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
-
From 7ab838b6480ded7caff73a1590fa1389049b1172 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Wed, 23 Dec 2015 22:15:46 +0100
Subject: [PATCH 043/207] website: new gratipay API
---
index.html | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/index.html b/index.html
index ab0106b..20da4ae 100644
--- a/index.html
+++ b/index.html
@@ -531,9 +531,13 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
Miscellaneous
- Gratipay:
-
- https://img.shields.io/gratipay/JSFiddle.svg
+ Gratipay User:
+
+ https://img.shields.io/gratipay/user/dougwilson.svg
+
+ Gratipay Team:
+
+ https://img.shields.io/gratipay/team/shields.svg
Bountysource:
From fa8a3f747f0b1fe1da23aad2cc15fb5690032517 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 27 Dec 2015 23:59:25 +0100
Subject: [PATCH 044/207] stackexchange: code cleanup, left-hand-side changes
Part of #600
---
server.js | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/server.js b/server.js
index d394eb8..c662f13 100644
--- a/server.js
+++ b/server.js
@@ -4529,13 +4529,13 @@ cache(function(data, match, sendBadge, request) {
var format = match[4];
var path;
if (info === 'r') {
- path = 'users/'+item;
+ path = 'users/' + item;
} else if (info === 't') {
- path = 'tags/'+item+'/info';
+ path = 'tags/' + item + '/info';
}
var options = {
method: 'GET',
- uri: 'https://api.stackexchange.com/2.2/'+path+'?site='+site,
+ uri: 'https://api.stackexchange.com/2.2/' + path + '?site=' + site,
gzip: true
}
var badgeData = getBadgeData(site, data);
@@ -4550,15 +4550,17 @@ cache(function(data, match, sendBadge, request) {
if (info === 'r') {
var reputation = data.items[0].reputation;
+ badgeData.text[0] = site + ' reputation';
badgeData.text[1] = metric(reputation);
badgeData.colorscheme = floorCountColor(1000, 10000, 20000);
} else if (info === 't') {
var count = data.items[0].count;
- badgeData.text[1] = metric(count)+' questions';
+ badgeData.text[0] = site + ' ' + item + ' questions';
+ badgeData.text[1] = metric(count);
badgeData.colorscheme = floorCountColor(1000, 10000, 20000);
}
sendBadge(format, badgeData);
- } catch (e) {
+ } catch(e) {
badgeData.text[1] = 'invalid';
sendBadge(format, badgeData);
}
From 53272c6a944fe292a13bba1b94c50434986cbe37 Mon Sep 17 00:00:00 2001
From: Josh Taylor
Date: Sun, 27 Dec 2015 22:10:53 -0800
Subject: [PATCH 045/207] fix npm version badge for scoped packages
---
server.js | 4 ++--
try.html | 4 ++++
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/server.js b/server.js
index c662f13..be17a8d 100644
--- a/server.js
+++ b/server.js
@@ -1357,7 +1357,7 @@ camp.route(/^\/npm\/v\/(.*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
var repo = encodeURIComponent(match[1]); // eg, "express" or "@user/express"
var format = match[2];
- var apiUrl = 'https://registry.npmjs.org/' + repo + '/latest';
+ var apiUrl = 'https://registry.npmjs.org/-/package/' + repo + '/dist-tags';
var badgeData = getBadgeData('npm', data);
// Using the Accept header because of this bug:
//
@@ -1369,7 +1369,7 @@ cache(function(data, match, sendBadge, request) {
}
try {
var data = JSON.parse(buffer);
- var version = data.version;
+ var version = data.latest;
var vdata = versionColor(version);
badgeData.text[1] = vdata.version;
badgeData.colorscheme = vdata.color;
diff --git a/try.html b/try.html
index 2a80513..4d1d378 100644
--- a/try.html
+++ b/try.html
@@ -378,6 +378,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/npm/v/npm.svg
+ npm (scoped):
+
+ https://img.shields.io/npm/v/@cycle/core.svg
+
node:
https://img.shields.io/node/v/gh-badges.svg
From 3901d15cb5b43322f1abc95b37b3921eca134799 Mon Sep 17 00:00:00 2001
From: Lars Brinkhoff
Date: Wed, 2 Dec 2015 09:18:58 +0100
Subject: [PATCH 046/207] New vendor: Magnum CI.
---
server.js | 47 +++++++++++++++++++++++++++++++++++++++++++++++
try.html | 8 ++++++++
2 files changed, 55 insertions(+)
diff --git a/server.js b/server.js
index c662f13..6f162a9 100644
--- a/server.js
+++ b/server.js
@@ -3594,6 +3594,53 @@ cache(function(data, match, sendBadge, request) {
}
});
}));
+// Magnum CI integration
+camp.route(/^\/magnumci\/([^\/]+)(?:\/(.+))?\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var projectId = match[1];
+ var format = match[3];
+ var branch = match[2];
+ var options = {
+ method: 'GET',
+ uri: 'https://magnum-ci.com/status/' + projectId + '.png'
+ };
+ if (branch != null) {
+ options.uri += '?branch=' + branch;
+ }
+ var badgeData = getBadgeData('build', data);
+ request(options, function(err, res) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ try {
+ var statusMatch = res.headers['content-disposition']
+ .match(/filename="(.+)\.png"/);
+ if (!statusMatch) {
+ badgeData.text[1] = 'unknown';
+ sendBadge(format, badgeData);
+ return;
+ }
+
+ switch (statusMatch[1]) {
+ case 'pass':
+ badgeData.text[1] = 'passing';
+ badgeData.colorscheme = 'brightgreen';
+ break;
+ break;
+ case 'fail':
+ badgeData.text[1] = 'failing';
+ badgeData.colorscheme = 'red';
+ break;
+ }
+ sendBadge(format, badgeData);
+ } catch(e) {
+ badgeData.text[1] = 'not found';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
// Maven-Central artifact version integration
// API documentation: http://search.maven.org/#api
diff --git a/try.html b/try.html
index 2a80513..f67973c 100644
--- a/try.html
+++ b/try.html
@@ -104,6 +104,14 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/codeship/d6c1ddd0-16a3-0132-5f85-2e35c05e22b1/master.svg
+ Magnum CI:
+
+ https://img.shields.io/magnumci/96ffb83fa700f069024921b0702e76ff.svg
+
+ Magnum CI:
+
+ https://img.shields.io/magnumci/96ffb83fa700f069024921b0702e76ff/new-meta.svg'
+
CircleCI:
https://img.shields.io/circleci/project/BrightFlair/PHP.Gt.svg
From aae1a0c30a99fbbb4aab02931340e9aeac8d2bfe Mon Sep 17 00:00:00 2001
From: Lars Brinkhoff
Date: Mon, 14 Dec 2015 08:44:10 +0100
Subject: [PATCH 047/207] Magnum CI fixes after code review.
---
server.js | 7 ++++---
try.html | 8 ++++----
2 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/server.js b/server.js
index 6f162a9..fb18da6 100644
--- a/server.js
+++ b/server.js
@@ -3594,12 +3594,13 @@ cache(function(data, match, sendBadge, request) {
}
});
}));
+
// Magnum CI integration
-camp.route(/^\/magnumci\/([^\/]+)(?:\/(.+))?\.(svg|png|gif|jpg|json)$/,
+camp.route(/^\/magnumci\/ci\/([^\/]+)(?:\/(.+))?\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
- var projectId = match[1];
+ var projectId = match[1]; // E.g. 96ffb83fa700f069024921b0702e76ff
+ var branch = match[2]; // E.g. master
var format = match[3];
- var branch = match[2];
var options = {
method: 'GET',
uri: 'https://magnum-ci.com/status/' + projectId + '.png'
diff --git a/try.html b/try.html
index f67973c..745d331 100644
--- a/try.html
+++ b/try.html
@@ -105,12 +105,12 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/codeship/d6c1ddd0-16a3-0132-5f85-2e35c05e22b1/master.svg
Magnum CI:
-
- https://img.shields.io/magnumci/96ffb83fa700f069024921b0702e76ff.svg
+
+ https://img.shields.io/magnumci/ci/96ffb83fa700f069024921b0702e76ff.svg
Magnum CI:
-
- https://img.shields.io/magnumci/96ffb83fa700f069024921b0702e76ff/new-meta.svg'
+
+ https://img.shields.io/magnumci/ci/96ffb83fa700f069024921b0702e76ff/new-meta.svg
CircleCI:
From c9999ca46cae0833b71f487bbc9fcff096e15aad Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 29 Dec 2015 22:46:50 +0100
Subject: [PATCH 048/207] Jenkins 'green' means the build passed
Fixes #586.
---
server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server.js b/server.js
index 64f43e1..23c2a5f 100644
--- a/server.js
+++ b/server.js
@@ -3371,7 +3371,7 @@ cache(function(data, match, sendBadge, request) {
}
try {
- if (json.color === 'blue') {
+ if (json.color === 'blue' || json.color === 'green') {
badgeData.colorscheme = 'brightgreen';
badgeData.text[1] = 'passing';
} else if (json.color === 'red') {
From 8ddc3cced705b3e02228af1e88a6d83533cfb683 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 29 Dec 2015 23:06:48 +0100
Subject: [PATCH 049/207] JIRA issue badge: URL protection, input examples,
nits
Part of #587.
---
server.js | 9 +++++----
try.html | 2 +-
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/server.js b/server.js
index f877dc5..e073a04 100644
--- a/server.js
+++ b/server.js
@@ -287,15 +287,16 @@ camp.notfound(/.*/, function(query, match, end, request) {
// JIRA issue integration
camp.route(/^\/jira\/issue\/(http(?:s)?)\/(.+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
cache(function (data, match, sendBadge, request) {
- var protocol = match[1];
- var host = match[2];
- var issueKey = match[3];
+ var protocol = match[1]; // eg, https
+ var host = match[2]; // eg, issues.apache.org/jira
+ var issueKey = match[3]; // eg, KAFKA-2896
var format = match[4];
var options = {
method: 'GET',
json: true,
- uri: protocol + '://' + host + '/rest/api/2/issue/' + issueKey
+ uri: protocol + '://' + host + '/rest/api/2/issue/' +
+ encodeURIComponent(issueKey)
};
if (serverSecrets && serverSecrets.jira_username) {
options.auth = {
diff --git a/try.html b/try.html
index b1ff637..4015452 100644
--- a/try.html
+++ b/try.html
@@ -723,7 +723,7 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/gitter/room/nwjs/nw.js.svg
JIRA issue:
-
+
https://img.shields.io/jira/issue/https/issues.apache.org/jira/KAFKA-2896.svg
From abcd9d6decc44ee3681829817446870d1a680ee9 Mon Sep 17 00:00:00 2001
From: Carlos Perez
Date: Fri, 18 Dec 2015 13:21:09 -0500
Subject: [PATCH 050/207] Add bitHound integration.
---
logo/bithound.svg | 1 +
server.js | 29 +++++++++++++++++++++++++++++
try.html | 12 ++++++++++++
3 files changed, 42 insertions(+)
create mode 100644 logo/bithound.svg
diff --git a/logo/bithound.svg b/logo/bithound.svg
new file mode 100644
index 0000000..7fb554d
--- /dev/null
+++ b/logo/bithound.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/server.js b/server.js
index e073a04..7283851 100644
--- a/server.js
+++ b/server.js
@@ -4673,6 +4673,35 @@ cache(function(data, match, sendBadge, request) {
})}
));
+// bitHound integration
+camp.route(/^\/bithound\/(code\/|dependencies\/|devDependencies\/)?(.+?)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var type = match[1];
+ var userRepo = match[2]; // eg, `github/rexxars/sse-channel`.
+ var format = match[3];
+ var url = 'https://www.bithound.io/api/' + userRepo + '/badge/' + type;
+ var badgeData = getBadgeData(type === 'devDependencies' ? 'dev dependencies' : type, data);
+
+ request(url, function(err, res) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ try {
+ badgeData.text[1] = res.label;
+ badgeData.logo = logos['bithound'];
+ badgeData.logoWidth = 15;
+ badgeData.colorscheme = res.color;
+ sendBadge(format, badgeData);
+
+ } catch(e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
+
// Any badge.
camp.route(/^\/(:|badge\/)(([^-]|--)*?)-(([^-]|--)*)-(([^-]|--)+)\.(svg|png|gif|jpg)$/,
function(data, match, end, ask) {
diff --git a/try.html b/try.html
index 4015452..4365c11 100644
--- a/try.html
+++ b/try.html
@@ -558,6 +558,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/codeclimate/coverage/github/triAGENS/ashikawa-core.svg
+ bitHound Code:
+
+ https://img.shields.io/bithound/code/github/rexxars/sse-channel.svg
+
Gemnasium:
https://img.shields.io/gemnasium/mathiasbynens/he.svg
@@ -746,6 +750,14 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/david/peer/webcomponents/generator-element.svg
+ bitHound:
+
+ https://img.shields.io/bithound/dependencies/github/rexxars/sse-channel.svg
+
+ bitHound:
+
+ https://img.shields.io/bithound/devDependencies/github/rexxars/sse-channel.svg
+
CocoaPods:
https://img.shields.io/cocoapods/p/AFNetworking.svg
From 40740b925ac07997791c04f0f561a95f1a21c8bc Mon Sep 17 00:00:00 2001
From: Carlos Perez
Date: Fri, 18 Dec 2015 21:10:19 -0600
Subject: [PATCH 051/207] Proper handling of request to bithound badge api.
---
server.js | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/server.js b/server.js
index 7283851..fdd36e1 100644
--- a/server.js
+++ b/server.js
@@ -4676,23 +4676,20 @@ cache(function(data, match, sendBadge, request) {
// bitHound integration
camp.route(/^\/bithound\/(code\/|dependencies\/|devDependencies\/)?(.+?)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
- var type = match[1];
+ var type = match[1].slice(0, -1);
var userRepo = match[2]; // eg, `github/rexxars/sse-channel`.
var format = match[3];
- var url = 'https://www.bithound.io/api/' + userRepo + '/badge/' + type;
+ var apiUrl = 'https://www.bithound.io/api/' + userRepo + '/badge/' + type;
var badgeData = getBadgeData(type === 'devDependencies' ? 'dev dependencies' : type, data);
- request(url, function(err, res) {
- if (err != null) {
- badgeData.text[1] = 'inaccessible';
- sendBadge(format, badgeData);
- return;
- }
+ request(apiUrl, { headers: { 'Accept': 'application/json' } }, function(err, res, buffer) {
try {
- badgeData.text[1] = res.label;
+ var data = JSON.parse(buffer);
+ badgeData.text[1] = data.label;
badgeData.logo = logos['bithound'];
badgeData.logoWidth = 15;
- badgeData.colorscheme = res.color;
+ badgeData.colorscheme = null;
+ badgeData.colorB = '#' + data.color;
sendBadge(format, badgeData);
} catch(e) {
From 33e56749c0be50e6c4d3d792955a883412aab2ba Mon Sep 17 00:00:00 2001
From: Carlos Perez
Date: Fri, 18 Dec 2015 21:11:54 -0600
Subject: [PATCH 052/207] Simplify name of bitHound label on examples.
---
try.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/try.html b/try.html
index 4365c11..b620068 100644
--- a/try.html
+++ b/try.html
@@ -558,7 +558,7 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/codeclimate/coverage/github/triAGENS/ashikawa-core.svg
- bitHound Code:
+ bitHound:
https://img.shields.io/bithound/code/github/rexxars/sse-channel.svg
From a0a6e363e58c838714778739bfee0e3b5230e0c4 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sat, 2 Jan 2016 23:34:19 +0100
Subject: [PATCH 053/207] website: Magnum CI + JIRA issues
---
index.html | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/index.html b/index.html
index 20da4ae..b143ec6 100644
--- a/index.html
+++ b/index.html
@@ -105,6 +105,14 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/codeship/d6c1ddd0-16a3-0132-5f85-2e35c05e22b1/master.svg
+ Magnum CI:
+
+ https://img.shields.io/magnumci/ci/96ffb83fa700f069024921b0702e76ff.svg
+
+ Magnum CI:
+
+ https://img.shields.io/magnumci/ci/96ffb83fa700f069024921b0702e76ff/new-meta.svg
+
CircleCI:
https://img.shields.io/circleci/project/BrightFlair/PHP.Gt.svg
@@ -715,6 +723,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/gitter/room/nwjs/nw.js.svg
+ JIRA issue:
+
+ https://img.shields.io/jira/issue/https/issues.apache.org/jira/KAFKA-2896.svg
+
Longer Miscellaneous
@@ -747,6 +759,14 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/ansible/role/3078.svg
+ StackExchange:
+
+ https://img.shields.io/stackexchange/tex/r/951.svg
+
+ StackExchange:
+
+ https://img.shields.io/stackexchange/stackoverflow/t/augeas.svg
+
Your Badge
From 0c692d25e03222fb5c786dda985dc734203ac486 Mon Sep 17 00:00:00 2001
From: Liu Xing
Date: Tue, 5 Jan 2016 11:11:26 +0800
Subject: [PATCH 054/207] Change CodeShip domain
---
server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server.js b/server.js
index e073a04..e2ccec9 100644
--- a/server.js
+++ b/server.js
@@ -3604,7 +3604,7 @@ cache(function(data, match, sendBadge, request) {
var branch = match[2];
var options = {
method: 'GET',
- uri: 'https://www.codeship.io/projects/' + projectId + '/status' + (branch != null ? '?branch=' + branch : '')
+ uri: 'https://codeship.com/projects/' + projectId + '/status' + (branch != null ? '?branch=' + branch : '')
};
var badgeData = getBadgeData('build', data);
request(options, function(err, res) {
From 0b5a8dd2b94c59bbf638f5c78ac24eb18ec5058e Mon Sep 17 00:00:00 2001
From: Lars Brinkhoff
Date: Tue, 8 Dec 2015 10:08:12 +0100
Subject: [PATCH 055/207] Visual Studio Online build integration.
---
server.js | 32 ++++++++++++++++++++++++++++++++
try.html | 4 ++++
2 files changed, 36 insertions(+)
diff --git a/server.js b/server.js
index e073a04..f7eb94a 100644
--- a/server.js
+++ b/server.js
@@ -4565,6 +4565,38 @@ cache(function(data, match, sendBadge, request) {
});
}));
+// Visual Studio Online build integration.
+camp.route(/^\/vso\/build\/([^\/]+)\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var name = match[1]; // User name
+ var project = match[2]; // Project ID, e.g. 953a34b9-5966-4923-a48a-c41874cfb5f5
+ var build = match[3]; // Build definition ID, e.g. 1
+ var format = match[4];
+ var url = 'https://' + name + '.visualstudio.com/DefaultCollection/_apis/public/build/definitions/' + project + '/' + build + '/badge';
+ var badgeData = getBadgeData('build', data);
+ fetchFromSvg(request, url, function(err, res) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ try {
+ badgeData.text[1] = res.toLowerCase();
+ if (res === 'succeeded') {
+ badgeData.colorscheme = 'brightgreen';
+ badgeData.text[1] = 'passing';
+ } else if (res === 'failed') {
+ badgeData.colorscheme = 'red';
+ badgeData.text[1] = 'failing';
+ }
+ sendBadge(format, badgeData);
+ } catch(e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
+
// ImageLayers.io integration.
camp.route(/^\/imagelayers\/(image\-size|layers)\/([^\/]+)\/([^\/]+)\/([^\/]*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
diff --git a/try.html b/try.html
index 4015452..eaab99a 100644
--- a/try.html
+++ b/try.html
@@ -124,6 +124,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/circleci/token/YOURTOKEN/project/BrightFlair/PHP.Gt/master.svg
+ Visual Studio Online:
+
+ https://img.shields.io/vso/build/larsbrinkhoff/953a34b9-5966-4923-a48a-c41874cfb5f5/1.svg
+
Shippable:
https://img.shields.io/shippable/54d119db5ab6cc13528ab183.svg
From f273b781807e187f81685a8acc03be16145edab7 Mon Sep 17 00:00:00 2001
From: Olivier Louvignes
Date: Sat, 16 Jan 2016 15:32:37 +0100
Subject: [PATCH 056/207] chore(docker): do not target a specific minor
---
Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index 3c5a563..4f05c1f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,3 +1,3 @@
-FROM node:0.12.7-onbuild
+FROM node:0.12-onbuild
ENV INFOSITE http://shields.io
EXPOSE 80
From 0536763b498b865e65db31243512356e7bcd2295 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 17 Jan 2016 19:59:17 +0100
Subject: [PATCH 057/207] website: allow documentation in badge dialog
Part of #589.
---
try.html | 38 ++++++++++++++++++++++++++++++++++++--
1 file changed, 36 insertions(+), 2 deletions(-)
diff --git a/try.html b/try.html
index eaab99a..e2211e7 100644
--- a/try.html
+++ b/try.html
@@ -37,7 +37,9 @@ hr.spacing { border: 0; display: block; height: 3mm; }
border: 0; background-color: rgba(50,50,55,0.7);
opacity: 0; transition: opacity 0.5s; }
#copyForm { background: #fafaff; position: fixed; width: 100%;
- top: 50%; left: 0; transform: translate(0, -80%);
+ top: 17%; left: 0;
+ overflow: auto;
+ max-height: 56%;
border-top: 15px solid #eaeaff;
border-bottom: 15px solid #eaeaff;
}
@@ -124,7 +126,7 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/circleci/token/YOURTOKEN/project/BrightFlair/PHP.Gt/master.svg
- Visual Studio Online:
+ Visual Studio Online:
https://img.shields.io/vso/build/larsbrinkhoff/953a34b9-5966-4923-a48a-c41874cfb5f5/1.svg
@@ -1020,9 +1022,33 @@ is where the current server got started.
reStructuredText
+
+
+
+
To obtain your own badge, you will first need to enable badges for your
+ project:
+
+
+
Then, click “Show url…” to reveal the URL of the default badge. In that
+ URL, you will need to extract three pieces of information:
+ TEAM_NAME
, PROJECT_ID
and
+ BUILD_DEFINITION_ID
.
+
+
+
Your badge will then have the form
+ https://img.shields.io/vso/build/TEAM_NAME/PROJECT_ID/BUILD_DEFINITION_ID
.
+
+
+
+
@@ -1169,6 +1195,14 @@ function markupDialog(tr) {
var link = th.dataset.link? th.dataset.link: '';
copyForm.img.value = trimg;
copyForm.url.value = link;
+ // Insert documentation.
+ var doc = th.dataset.doc? th.dataset.doc: '';
+ var docelt = document.getElementById(doc);
+ if (docelt != null) {
+ copyDoc.innerHTML = 'Documentation ' + docelt.innerHTML;
+ } else {
+ copyDoc.innerHTML = '';
+ }
// Set up the input listeners.
copyForm.url.removeEventListener('input', copyFormUrlEventListener);
copyForm.img.removeEventListener('input', copyFormUrlEventListener);
From 648bef473bb5657e5a546b3d97e825000a393fe2 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 17 Jan 2016 20:12:34 +0100
Subject: [PATCH 058/207] website: clicking on URL now shows the badge dialog
Instead of selecting the URL.
As suggested by @techtonik
https://github.com/badges/shields/issues/530#issuecomment-167277875.
---
try.html | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/try.html b/try.html
index e2211e7..08a52d5 100644
--- a/try.html
+++ b/try.html
@@ -44,7 +44,8 @@ hr.spacing { border: 0; display: block; height: 3mm; }
border-bottom: 15px solid #eaeaff;
}
#suggestButton { display: none; }
-table.badge > tbody > tr > td > img { cursor: pointer; }
+table.badge > tbody > tr > td > img,
+table.badge > tbody > tr > td > code { cursor: pointer; }
@@ -1156,14 +1157,6 @@ function selectNode(e) {
};
copyMarkdown.addEventListener('click', selectNode);
copyreStructuredText.addEventListener('click', selectNode);
-function autoselectCode() {
- var codes = document.querySelectorAll('table.badge code');
- for (var i = 0; i < codes.length; i++) {
- codes[i].addEventListener('click', selectNode);
- }
-}
-
-document.addEventListener('DOMContentLoaded', autoselectCode);
// Markup copier dialog
//
@@ -1173,9 +1166,11 @@ function markupDialogInit() {
for (var i = 0; i < trs.length; i++) {
var tr = trs[i];
var target = tr.querySelector('img');
- if (target) {
- target.addEventListener('click', makeMarkupDialogListener(tr));
- }
+ var code = tr.querySelector('code');
+ // Markup dialog listener.
+ var mdl = makeMarkupDialogListener(tr);
+ if (target != null) { target.addEventListener('click', mdl); }
+ if (code != null) { code.addEventListener('click', mdl); }
}
}
function makeMarkupDialogListener(tr) {
From d741b192e8be06fc6cf9a13e9709ebdf7c5e46be Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 17 Jan 2016 20:20:40 +0100
Subject: [PATCH 059/207] Detect Stack Exchange badge errors
---
server.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/server.js b/server.js
index f7eb94a..6a9d35b 100644
--- a/server.js
+++ b/server.js
@@ -4699,6 +4699,7 @@ cache(function(data, match, sendBadge, request) {
}
sendBadge(format, badgeData);
} catch(e) {
+ console.error('Stack Exchange badge error: ' + e.stack);
badgeData.text[1] = 'invalid';
sendBadge(format, badgeData);
}
From 41f4bf36d731b5962f00c35878fdeea5ca874a28 Mon Sep 17 00:00:00 2001
From: Yannick Galatol
Date: Sun, 29 Nov 2015 13:03:00 +0100
Subject: [PATCH 060/207] Allow token authentication on github
---
server.js | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/server.js b/server.js
index 1bfcd84..5ecddbe 100644
--- a/server.js
+++ b/server.js
@@ -4540,6 +4540,11 @@ var githubHeaders = {
'Accept': 'application/vnd.github.v3+json'
};
+// You can manage your personal github token at https://github.com/settings/tokens
+if (serverSecrets && serverSecrets.gh_token) {
+ githubHeaders['Authorization'] = 'token ' + serverSecrets.gh_token;
+}
+
// Given a number, string with appropriate unit in the metric system, SI.
// Note: numbers beyond the peta- cannot be represented as integers in JS.
var metricPrefix = ['k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];
From 2d24d18ff8515ef0ea61d0c3799121f61afb3bfc Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 17 Jan 2016 21:02:42 +0100
Subject: [PATCH 061/207] Mention purpose of GitHub private tokens
See #578.
---
server.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/server.js b/server.js
index 82bf3b1..09a0a50 100644
--- a/server.js
+++ b/server.js
@@ -4898,7 +4898,9 @@ var githubHeaders = {
'Accept': 'application/vnd.github.v3+json'
};
-// You can manage your personal github token at https://github.com/settings/tokens
+// Personal tokens allow access to GitHub private repositories.
+// You can manage your personal GitHub token at
+// .
if (serverSecrets && serverSecrets.gh_token) {
githubHeaders['Authorization'] = 'token ' + serverSecrets.gh_token;
}
From c8f444aa913ebc16f527e79f361c1efc7bb54875 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Mon, 18 Jan 2016 23:30:51 +0100
Subject: [PATCH 062/207] update website
---
index.html | 59 ++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 46 insertions(+), 13 deletions(-)
diff --git a/index.html b/index.html
index b143ec6..f65484c 100644
--- a/index.html
+++ b/index.html
@@ -38,12 +38,15 @@ hr.spacing { border: 0; display: block; height: 3mm; }
border: 0; background-color: rgba(50,50,55,0.7);
opacity: 0; transition: opacity 0.5s; }
#copyForm { background: #fafaff; position: fixed; width: 100%;
- top: 50%; left: 0; transform: translate(0, -80%);
+ top: 17%; left: 0;
+ overflow: auto;
+ max-height: 56%;
border-top: 15px solid #eaeaff;
border-bottom: 15px solid #eaeaff;
}
#suggestButton { display: none; }
-table.badge > tbody > tr > td > img { cursor: pointer; }
+table.badge > tbody > tr > td > img,
+table.badge > tbody > tr > td > code { cursor: pointer; }
@@ -125,6 +128,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/circleci/token/YOURTOKEN/project/BrightFlair/PHP.Gt/master.svg
+ Visual Studio Online:
+
+ https://img.shields.io/vso/build/larsbrinkhoff/953a34b9-5966-4923-a48a-c41874cfb5f5/1.svg
+
Shippable:
https://img.shields.io/shippable/54d119db5ab6cc13528ab183.svg
@@ -1017,9 +1024,33 @@ is where the current server got started.
reStructuredText
+
+
+
+
To obtain your own badge, you will first need to enable badges for your
+ project:
+
+
+
Then, click “Show url…” to reveal the URL of the default badge. In that
+ URL, you will need to extract three pieces of information:
+ TEAM_NAME
, PROJECT_ID
and
+ BUILD_DEFINITION_ID
.
+
+
+
Your badge will then have the form
+ https://img.shields.io/vso/build/TEAM_NAME/PROJECT_ID/BUILD_DEFINITION_ID
.
+
+
+
+
@@ -1127,14 +1158,6 @@ function selectNode(e) {
};
copyMarkdown.addEventListener('click', selectNode);
copyreStructuredText.addEventListener('click', selectNode);
-function autoselectCode() {
- var codes = document.querySelectorAll('table.badge code');
- for (var i = 0; i < codes.length; i++) {
- codes[i].addEventListener('click', selectNode);
- }
-}
-
-document.addEventListener('DOMContentLoaded', autoselectCode);
// Markup copier dialog
//
@@ -1144,9 +1167,11 @@ function markupDialogInit() {
for (var i = 0; i < trs.length; i++) {
var tr = trs[i];
var target = tr.querySelector('img');
- if (target) {
- target.addEventListener('click', makeMarkupDialogListener(tr));
- }
+ var code = tr.querySelector('code');
+ // Markup dialog listener.
+ var mdl = makeMarkupDialogListener(tr);
+ if (target != null) { target.addEventListener('click', mdl); }
+ if (code != null) { code.addEventListener('click', mdl); }
}
}
function makeMarkupDialogListener(tr) {
@@ -1166,6 +1191,14 @@ function markupDialog(tr) {
var link = th.dataset.link? th.dataset.link: '';
copyForm.img.value = trimg;
copyForm.url.value = link;
+ // Insert documentation.
+ var doc = th.dataset.doc? th.dataset.doc: '';
+ var docelt = document.getElementById(doc);
+ if (docelt != null) {
+ copyDoc.innerHTML = 'Documentation ' + docelt.innerHTML;
+ } else {
+ copyDoc.innerHTML = '';
+ }
// Set up the input listeners.
copyForm.url.removeEventListener('input', copyFormUrlEventListener);
copyForm.img.removeEventListener('input', copyFormUrlEventListener);
From b82435c3a87d71f981390370e9cd9fc139f3e1c0 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 19 Jan 2016 00:51:37 +0100
Subject: [PATCH 063/207] website update: npm scoped
---
index.html | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/index.html b/index.html
index f65484c..183ebed 100644
--- a/index.html
+++ b/index.html
@@ -394,6 +394,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/npm/v/npm.svg
+ npm (scoped):
+
+ https://img.shields.io/npm/v/@cycle/core.svg
+
node:
https://img.shields.io/node/v/gh-badges.svg
From 5a3b16cf07cf59a016d32a6b44bc8259f0db4138 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Fri, 22 Jan 2016 01:26:40 +0100
Subject: [PATCH 064/207] Convert single link to a one-element list
---
server.js | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/server.js b/server.js
index 8be5a5b..1ab8514 100644
--- a/server.js
+++ b/server.js
@@ -4817,6 +4817,13 @@ function getBadgeData(defaultLabel, data) {
if (data.style && validTemplates.indexOf(data.style) > -1) {
template = data.style;
};
+ if (!(Object(data.link) instanceof Array)) {
+ if (data.link === undefined) {
+ data.link = [];
+ } else {
+ data.link = [data.link];
+ }
+ }
if (data.logo !== undefined && !/^data:/.test(data.logo)) {
data.logo = 'data:' + data.logo;
From 1bc62fcca322c6f218b8ec8f19aed9b00d8ee571 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Fri, 22 Jan 2016 21:42:27 +0100
Subject: [PATCH 065/207] Maintenance badge
Solves #607.
---
server.js | 29 +++++++++++++++++++++++++++++
try.html | 4 ++++
2 files changed, 33 insertions(+)
diff --git a/server.js b/server.js
index 1ab8514..509e4e5 100644
--- a/server.js
+++ b/server.js
@@ -4706,6 +4706,35 @@ cache(function(data, match, sendBadge, request) {
})}
));
+// Maintenance integration.
+camp.route(/^\/maintenance\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var status = match[1]; // eg, yes
+ var year = +match[2]; // eg, 2016
+ var format = match[3];
+ var badgeData = getBadgeData('maintained?', data);
+ try {
+ var now = new Date();
+ var cy = now.getUTCFullYear(); // current year.
+ var m = now.getUTCMonth(); // month.
+ if (cy <= year) {
+ badgeData.text[1] = status;
+ badgeData.colorscheme = 'brightgreen';
+ } else if ((cy === year + 1) && (m < 3)) {
+ badgeData.text[1] = 'stale (as of ' + cy + ')';
+ } else {
+ badgeData.text[1] = 'no!';
+ badgeData.colorscheme = 'red';
+ }
+ sendBadge(format, badgeData);
+ } catch(e) {
+ console.error(e.stack);
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+}));
+
+
// Any badge.
camp.route(/^\/(:|badge\/)(([^-]|--)*?)-(([^-]|--)*)-(([^-]|--)+)\.(svg|png|gif|jpg)$/,
function(data, match, end, ask) {
diff --git a/try.html b/try.html
index d3ce4d6..e813741 100644
--- a/try.html
+++ b/try.html
@@ -737,6 +737,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/jira/issue/https/issues.apache.org/jira/KAFKA-2896.svg
+ Maintenance:
+
+ https://img.shields.io/maintenance/yes/2016.svg
+
Longer Miscellaneous
From a1c1a5e941efc10be6cc15a33312838c9424ac27 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 26 Jan 2016 20:25:08 +0100
Subject: [PATCH 066/207] website: maintenance badge
---
index.html | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/index.html b/index.html
index 183ebed..1f23778 100644
--- a/index.html
+++ b/index.html
@@ -738,6 +738,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/jira/issue/https/issues.apache.org/jira/KAFKA-2896.svg
+ Maintenance:
+
+ https://img.shields.io/maintenance/yes/2016.svg
+
Longer Miscellaneous
From 748cb8e346d1a1c2484f1fbd6f90f6f1e995dd21 Mon Sep 17 00:00:00 2001
From: anatoly techtonik
Date: Sat, 26 Dec 2015 10:11:18 +0300
Subject: [PATCH 067/207] try.html: Make shield label also clickable
---
try.html | 3 +++
1 file changed, 3 insertions(+)
diff --git a/try.html b/try.html
index e813741..c68f092 100644
--- a/try.html
+++ b/try.html
@@ -44,6 +44,7 @@ hr.spacing { border: 0; display: block; height: 3mm; }
border-bottom: 15px solid #eaeaff;
}
#suggestButton { display: none; }
+table.badge > tbody > tr > th,
table.badge > tbody > tr > td > img,
table.badge > tbody > tr > td > code { cursor: pointer; }
@@ -1173,10 +1174,12 @@ function markupDialogInit() {
var trs = document.querySelectorAll('table.badge tr');
for (var i = 0; i < trs.length; i++) {
var tr = trs[i];
+ var title = tr.querySelector('th');
var target = tr.querySelector('img');
var code = tr.querySelector('code');
// Markup dialog listener.
var mdl = makeMarkupDialogListener(tr);
+ if (title != null) { title.addEventListener('click', mdl); }
if (target != null) { target.addEventListener('click', mdl); }
if (code != null) { code.addEventListener('click', mdl); }
}
From 9facc08eec840d2701819c89256c3bf62f6fd7c0 Mon Sep 17 00:00:00 2001
From: AdrieanKhisbe
Date: Sun, 31 Jan 2016 17:15:55 +0100
Subject: [PATCH 068/207] Fix twitter scheme color
cf #620
---
server.js | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/server.js b/server.js
index 509e4e5..7b7f880 100644
--- a/server.js
+++ b/server.js
@@ -4490,7 +4490,8 @@ cache(function(data, match, sendBadge, request) {
];
}
badgeData.text[1] = '';
- badgeData.colorscheme = '55ACEE';
+ badgeData.colorscheme = null;
+ badgeData.colorB = '#55ACEE';
sendBadge(format, badgeData);
}));
@@ -4504,7 +4505,9 @@ cache(function(data, match, sendBadge, request) {
};
var badgeData = getBadgeData('Follow', data);
badgeData.text[0] = 'Follow ' + user;
- badgeData.colorscheme = '55ACEE';
+
+ badgeData.colorscheme = null;
+ badgeData.colorB = '#55ACEE';
if (badgeData.template === 'social') {
badgeData.logo = badgeData.logo || logos.twitter;
}
From a82db5359733cabd1b8ab99a706e6e1f6dba9331 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 31 Jan 2016 18:15:27 +0100
Subject: [PATCH 069/207] Describe the recipe for badge URLs
---
CONTRIBUTING.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 2bf3dca..6583260 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -23,6 +23,10 @@ gets generated from the `try.html` file.
- New query parameters (such as `?label=` or `?style=`) should apply to any
requested badge. They must be registered in the cache (see `LruCache` in
`server.js`).
+- The format of new badges should be of the form
+ `/VENDOR/SUBVENDOR-BADGE-SPECIFIC/PARAMETERS.format`. For instance,
+ `https://img.shields.io/gitter/room/nwjs/nw.js.svg`. The vendor is gitter, the
+ badge is for rooms, the parameter is nwjs/nw.js, and the format is svg.
## Implementations
From 9aced916d7ba197d41dc0e627cf7e0d201f3a7fa Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 31 Jan 2016 19:47:23 +0100
Subject: [PATCH 070/207] Twitter badge shouldn't override ?label=
Part of #620.
---
server.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/server.js b/server.js
index 7b7f880..f3c9794 100644
--- a/server.js
+++ b/server.js
@@ -4503,8 +4503,7 @@ cache(function(data, match, sendBadge, request) {
var options = {
url: 'http://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=' + user
};
- var badgeData = getBadgeData('Follow', data);
- badgeData.text[0] = 'Follow ' + user;
+ var badgeData = getBadgeData('Follow ' + user, data);
badgeData.colorscheme = null;
badgeData.colorB = '#55ACEE';
From cb0caafe82b8eafa7245109fd967dbebd76e526b Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 7 Feb 2016 19:04:20 +0100
Subject: [PATCH 071/207] camp v16
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index c4ce894..1925b33 100644
--- a/package.json
+++ b/package.json
@@ -23,7 +23,7 @@
"es6-promise": "~2.1.0",
"request": "~2.55.0",
"redis": "~1.0.0",
- "camp": "~15.5.5",
+ "camp": "~16.0.0",
"semver": "~4.3.3",
"bower": "~1.4.1",
"promise": "~7.0.0"
From d1a962152d31903f694aeeab385d6ee361ae04f6 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Mon, 8 Feb 2016 20:27:17 +0100
Subject: [PATCH 072/207] Support the new server
---
Makefile | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/Makefile b/Makefile
index 24bbfe8..c2abbce 100644
--- a/Makefile
+++ b/Makefile
@@ -9,12 +9,25 @@ website:
| sed "s,var origin = '';,var origin = 'https://img.shields.io';," \
| sed "s,
@@ -1174,10 +1175,12 @@ function markupDialogInit() {
var trs = document.querySelectorAll('table.badge tr');
for (var i = 0; i < trs.length; i++) {
var tr = trs[i];
+ var title = tr.querySelector('th');
var target = tr.querySelector('img');
var code = tr.querySelector('code');
// Markup dialog listener.
var mdl = makeMarkupDialogListener(tr);
+ if (title != null) { title.addEventListener('click', mdl); }
if (target != null) { target.addEventListener('click', mdl); }
if (code != null) { code.addEventListener('click', mdl); }
}
From 35dad91bf902d9937df80cabe6b8a04be42fbdcc Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 14 Feb 2016 18:37:50 +0100
Subject: [PATCH 078/207] Show 0 downloads for npm packages with no downloads
Fixes #635.
---
server.js | 31 +++++++++++++++----------------
1 file changed, 15 insertions(+), 16 deletions(-)
diff --git a/server.js b/server.js
index f3c9794..b4ffea5 100644
--- a/server.js
+++ b/server.js
@@ -1352,25 +1352,24 @@ cache(function(data, match, sendBadge, request) {
return;
}
try {
- var monthly = JSON.parse(buffer).downloads;
+ var monthly = JSON.parse(buffer).downloads || 0;
+ badgeData.text[1] = metric(monthly) + '/month';
+ if (monthly === 0) {
+ badgeData.colorscheme = 'red';
+ } else if (monthly < 10) {
+ badgeData.colorscheme = 'yellow';
+ } else if (monthly < 100) {
+ badgeData.colorscheme = 'yellowgreen';
+ } else if (monthly < 1000) {
+ badgeData.colorscheme = 'green';
+ } else {
+ badgeData.colorscheme = 'brightgreen';
+ }
+ sendBadge(format, badgeData);
} catch(e) {
badgeData.text[1] = 'invalid';
sendBadge(format, badgeData);
- return;
}
- badgeData.text[1] = metric(monthly) + '/month';
- if (monthly === 0) {
- badgeData.colorscheme = 'red';
- } else if (monthly < 10) {
- badgeData.colorscheme = 'yellow';
- } else if (monthly < 100) {
- badgeData.colorscheme = 'yellowgreen';
- } else if (monthly < 1000) {
- badgeData.colorscheme = 'green';
- } else {
- badgeData.colorscheme = 'brightgreen';
- }
- sendBadge(format, badgeData);
});
}));
@@ -1391,7 +1390,7 @@ cache(function (data, match, sendBadge, request) {
try {
var totalDownloads = 0;
- var downloads = JSON.parse(buffer).downloads;
+ var downloads = JSON.parse(buffer).downloads || 0;
for (var index = 0; index < downloads.length; index++) {
totalDownloads = totalDownloads + downloads[index].downloads;
}
From aac24d4be11e070af04f9ad238cdfbd90d74bbb1 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Wed, 17 Feb 2016 15:39:34 +0100
Subject: [PATCH 079/207] Stack exchange: Detect IP rate limiting
---
server.js | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/server.js b/server.js
index b4ffea5..b63884b 100644
--- a/server.js
+++ b/server.js
@@ -4687,6 +4687,11 @@ cache(function(data, match, sendBadge, request) {
try {
var data = JSON.parse(buffer.toString());
+ // IP rate limiting
+ if (data.error_name === 'throttle_violation') {
+ return; // Hope for the best in the cache.
+ }
+
if (info === 'r') {
var reputation = data.items[0].reputation;
badgeData.text[0] = site + ' reputation';
@@ -4700,7 +4705,6 @@ cache(function(data, match, sendBadge, request) {
}
sendBadge(format, badgeData);
} catch(e) {
- console.error('Stack Exchange badge error: ' + e.stack);
badgeData.text[1] = 'invalid';
sendBadge(format, badgeData);
}
From 85286649b6b09ce91689704267d0376297a3b57f Mon Sep 17 00:00:00 2001
From: Adam Dinwoodie
Date: Thu, 26 Nov 2015 20:49:39 +0000
Subject: [PATCH 080/207] Add support for Code Climate issues
Resolves #571.
---
server.js | 40 ++++++++++++++++++++++++++++++++++++++++
try.html | 4 ++++
2 files changed, 44 insertions(+)
diff --git a/server.js b/server.js
index e073a04..ef911b9 100644
--- a/server.js
+++ b/server.js
@@ -2149,6 +2149,46 @@ cache(function(data, match, sendBadge, request) {
});
}));
+// Code Climate issues integration
+camp.route(/^\/codeclimate\/issues\/(.+)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var userRepo = match[1]; // eg, `github/me-and/mdf`.
+ var format = match[2];
+ var options = 'https://codeclimate.com/' + userRepo + '/badges/issue_count.svg'
+ var badgeData = getBadgeData('issues', data);
+ request(options, function(err, res, buffer) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ try {
+ var count = buffer.match(/>([0-9]+) issues?/)[1];
+ if (!count) {
+ badgeData.text[1] = 'malformed';
+ sendBadge(format, badgeData);
+ return;
+ }
+ badgeData.text[1] = count;
+ if (count == 0) {
+ badgeData.colorscheme = 'brightgreen';
+ } else if (count < 5) {
+ badgeData.colorscheme = 'green';
+ } else if (count < 10) {
+ badgeData.colorscheme = 'yellowgreen';
+ } else if (count < 20) {
+ badgeData.colorscheme = 'yellow';
+ } else {
+ badgeData.colorscheme = 'red';
+ }
+ sendBadge(format, badgeData);
+ } catch(e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
+
// Code Climate integration
camp.route(/^\/codeclimate\/(.+)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
diff --git a/try.html b/try.html
index 4015452..b9bfabf 100644
--- a/try.html
+++ b/try.html
@@ -558,6 +558,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/codeclimate/coverage/github/triAGENS/ashikawa-core.svg
+ Code Climate:
+
+ https://img.shields.io/codeclimate/issues/github/me-and/mdf.svg
+
Gemnasium:
https://img.shields.io/gemnasium/mathiasbynens/he.svg
From d23eb63da118ec0554da3bd27cf1e4c07f5b03fc Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Mon, 22 Feb 2016 19:34:08 +0100
Subject: [PATCH 081/207] Coverity: avoid crashing the catch code
badgeData was set to undefined and crashed, causing the badgeData.text[1] reset
to crash as well.
---
server.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/server.js b/server.js
index b63884b..cf117ee 100644
--- a/server.js
+++ b/server.js
@@ -876,8 +876,8 @@ cache(function(data, match, sendBadge, request) {
return;
}
try {
- badgeData = JSON.parse(buffer);
- sendBadge(format, badgeData);
+ var data = JSON.parse(buffer);
+ sendBadge(format, data);
} catch(e) {
badgeData.text[1] = 'invalid';
sendBadge(format, badgeData);
From 5e4c71181372b5ec86b844aded99acb5f0270b28 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Mon, 22 Feb 2016 19:44:29 +0100
Subject: [PATCH 082/207] Twitter follow: verify that data is not undefined
---
server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server.js b/server.js
index cf117ee..acb8ab7 100644
--- a/server.js
+++ b/server.js
@@ -4523,7 +4523,7 @@ cache(function(data, match, sendBadge, request) {
// The data is formatted as an array.
var data = JSON.parse(buffer)[0];
// data.followers_count could be zero… don't just check if falsey.
- if (data.followers_count != null){
+ if (data !== undefined && data.followers_count != null){
badgeData.text[1] = metric(data.followers_count);
}
} catch(e) {
From ec1420649c73c97c3ac5e11fe571b6cb4b1d6201 Mon Sep 17 00:00:00 2001
From: Thomas
Date: Wed, 24 Feb 2016 11:08:54 +0100
Subject: [PATCH 083/207] Visual Studio Team Services
Visual Studio Online has been renamed Visual Studio Team Services
---
index.html | 4 ++--
server.js | 2 +-
try.html | 4 ++--
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/index.html b/index.html
index 3846d04..3dadba5 100644
--- a/index.html
+++ b/index.html
@@ -129,7 +129,7 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/circleci/token/YOURTOKEN/project/BrightFlair/PHP.Gt/master.svg
- Visual Studio Online:
+ Visual Studio Team Services:
https://img.shields.io/vso/build/larsbrinkhoff/953a34b9-5966-4923-a48a-c41874cfb5f5/1.svg
@@ -1038,7 +1038,7 @@ is where the current server got started.
-
+
To obtain your own badge, you will first need to enable badges for your
project:
diff --git a/server.js b/server.js
index acb8ab7..a009b7b 100644
--- a/server.js
+++ b/server.js
@@ -4566,7 +4566,7 @@ cache(function(data, match, sendBadge, request) {
});
}));
-// Visual Studio Online build integration.
+// Visual Studio Team Services build integration.
camp.route(/^\/vso\/build\/([^\/]+)\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
var name = match[1]; // User name
diff --git a/try.html b/try.html
index c68f092..26300dc 100644
--- a/try.html
+++ b/try.html
@@ -128,7 +128,7 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/circleci/token/YOURTOKEN/project/BrightFlair/PHP.Gt/master.svg
-
Visual Studio Online:
+ Visual Studio Team services:
https://img.shields.io/vso/build/larsbrinkhoff/953a34b9-5966-4923-a48a-c41874cfb5f5/1.svg
@@ -1037,7 +1037,7 @@ is where the current server got started.
-
+
To obtain your own badge, you will first need to enable badges for your
project:
From 1c1993f7a8ebad2b7558abcdf93621247df82239 Mon Sep 17 00:00:00 2001
From: Mario Colque
Date: Thu, 25 Feb 2016 18:13:02 -0300
Subject: [PATCH 084/207] added beerpay.io itegration
---
server.js | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/server.js b/server.js
index acb8ab7..185ea81 100644
--- a/server.js
+++ b/server.js
@@ -4711,6 +4711,35 @@ cache(function(data, match, sendBadge, request) {
})}
));
+// beerpay.io integration.
+camp.route(/^\/beerpay\/(.*)\/(.*)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var user = match[1],
+ project = match[2],
+ format = match[3];
+
+ var apiUrl = 'https://beerpay.io/api/v1/' + user + '/projects/' + project;
+ var badgeData = getBadgeData('beerpay', data);
+
+ request(apiUrl, function (err, res, buffer) {
+ if (err) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(badgeData, format);
+ return;
+ }
+
+ try {
+ var data = JSON.parse(buffer);
+ badgeData.text[1] = '$' + (data.total_amount || 0);
+ badgeData.colorscheme = 'red';
+ sendBadge(format, badgeData);
+ } catch (e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
+
// Maintenance integration.
camp.route(/^\/maintenance\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
From d1321179c9e017cbd5e267d290f183046f2bbe89 Mon Sep 17 00:00:00 2001
From: Julien Rottenberg
Date: Sat, 27 Feb 2016 18:56:23 -0800
Subject: [PATCH 085/207] PR for badges/shields#241
---
index.html | 4 ++++
server.js | 37 +++++++++++++++++++++++++++++++++++++
try.html | 4 ++++
3 files changed, 45 insertions(+)
diff --git a/index.html b/index.html
index 3846d04..28b438a 100644
--- a/index.html
+++ b/index.html
@@ -723,6 +723,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/docker/pulls/mashape/kong.svg
+ Docker Automated build
+
+ https://img.shields.io/docker/automated/jrottenberg/ffmpeg.svg
+
ImageLayers Size:
https://img.shields.io/imagelayers/image-size/_/ubuntu/latest.svg
diff --git a/server.js b/server.js
index acb8ab7..05570e9 100644
--- a/server.js
+++ b/server.js
@@ -4471,6 +4471,43 @@ cache(function(data, match, sendBadge, request) {
});
}));
+
+// Docker Hub automated integration.
+camp.route(/^\/docker\/automated\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var user = match[1]; // eg, jrottenberg
+ var repo = match[2]; // eg, ffmpeg
+ var format = match[3];
+ if (user === '_') {
+ user = 'library';
+ }
+ var path = user + '/' + repo;
+ var url = 'https://registry.hub.docker.com/v2/repositories/' + path;
+ var badgeData = getBadgeData('automated build', data);
+ request(url, function(err, res, buffer) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ try {
+ var data = JSON.parse(buffer);
+ var automated = data.is_automated;
+ badgeData.text[1] = automated;
+ if (automated) {
+ badgeData.colorscheme = 'blue';
+ } else {
+ badgeData.colorscheme = 'yellow';
+ }
+ badgeData.colorB = '#008bb8';
+ sendBadge(format, badgeData);
+ } catch(e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
+
// Twitter integration.
camp.route(/^\/twitter\/url\/([^\/]+)\/(.+)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
diff --git a/try.html b/try.html
index c68f092..9ecd25f 100644
--- a/try.html
+++ b/try.html
@@ -722,6 +722,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/docker/pulls/mashape/kong.svg
+ Docker Automated build
+
+ https://img.shields.io/docker/automated/jrottenberg/ffmpeg.svg
+
ImageLayers Size:
https://img.shields.io/imagelayers/image-size/_/ubuntu/latest.svg
From 47ae3d85e219b4705c4a3933f789d94cdd456dfa Mon Sep 17 00:00:00 2001
From: Greg Bowler
Date: Fri, 11 Mar 2016 16:39:02 +0000
Subject: [PATCH 086/207] Add Codacy to services list
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 227ba2a..de3c6bd 100644
--- a/README.md
+++ b/README.md
@@ -67,6 +67,7 @@ What kind of metadata can you convey using badges?
## Services using the Shields standard
* [Badger](https://github.com/badges/badgerbadgerbadger)
* [badges2svg](https://github.com/bfontaine/badges2svg)
+* [Codacy](https://www.codacy.com)
* [Code Climate](https://codeclimate.com/changelog/510d4fde56b102523a0004bf)
* [Coveralls](https://coveralls.io/)
* [Forkability](http://basicallydan.github.io/forkability/)
From d2a6b5a4ea4e22220b6515c3008780b94566c2e8 Mon Sep 17 00:00:00 2001
From: Greg Bowler
Date: Fri, 11 Mar 2016 16:56:04 +0000
Subject: [PATCH 087/207] Update regex for backwards compatibility, but do not
match "coverage"
---
server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server.js b/server.js
index acb8ab7..104c56c 100644
--- a/server.js
+++ b/server.js
@@ -2450,7 +2450,7 @@ cache(function(data, match, sendBadge, request) {
}));
// Codacy integration
-camp.route(/^\/codacy?\/([^\/]+)(?:\/(.+))?\.(svg|png|gif|jpg|json)$/,
+camp.route(/^\/codacy\/(?:grade\/)?(?!coverage\/)([^\/]+)(?:\/(.+))?\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
var projectId = match[1]; // eg. e27821fb6289410b8f58338c7e0bc686
var branch = match[2];
From 0c4a0e4316204aa32a86e13b8ba4949f56b344b6 Mon Sep 17 00:00:00 2001
From: Greg Bowler
Date: Fri, 11 Mar 2016 16:58:27 +0000
Subject: [PATCH 088/207] Update original SVG URL to include explicit "grade"
---
server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server.js b/server.js
index 104c56c..f411844 100644
--- a/server.js
+++ b/server.js
@@ -2461,7 +2461,7 @@ cache(function(data, match, sendBadge, request) {
queryParams.branch = branch;
}
var query = querystring.stringify(queryParams);
- var url = 'https://www.codacy.com/project/badge/' + projectId + '?' + query;
+ var url = 'https://www.codacy.com/project/badge/grade/' + projectId + '?' + query;
var badgeData = getBadgeData('code quality', data);
fetchFromSvg(request, url, function(err, res) {
if (err != null) {
From 34cad142a6190f40a0b3af5dd45b0bbaee861d3d Mon Sep 17 00:00:00 2001
From: Greg Bowler
Date: Fri, 11 Mar 2016 17:27:58 +0000
Subject: [PATCH 089/207] Add Codacy coverage to try.html
---
try.html | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/try.html b/try.html
index c68f092..bd06b45 100644
--- a/try.html
+++ b/try.html
@@ -666,13 +666,21 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/wordpress/plugin/r/akismet.svg
- Codacy:
-
- https://img.shields.io/codacy/e27821fb6289410b8f58338c7e0bc686.svg
+ Codacy grade:
+
+ https://img.shields.io/codacy/grade/e27821fb6289410b8f58338c7e0bc686.svg
- Codacy branch:
-
- https://img.shields.io/codacy/e27821fb6289410b8f58338c7e0bc686/master.svg
+ Codacy branch grade:
+
+ https://img.shields.io/codacy/grade/e27821fb6289410b8f58338c7e0bc686/master.svg
+
+ Codacy coverage:
+
+ https://img.shields.io/codacy/coverage/c44df2d9c89a4809896914fd1a40bedd.svg
+
+ Codacy branch coverage:
+
+ https://img.shields.io/codacy/coverage/c44df2d9c89a4809896914fd1a40bedd/master.svg
Libscore:
From 6647218834b76d4edf432210d405ea1091e235ec Mon Sep 17 00:00:00 2001
From: Greg Bowler
Date: Fri, 11 Mar 2016 17:28:24 +0000
Subject: [PATCH 090/207] Implement Codacy coverage badge fixes
badges/shields#559
---
server.js | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/server.js b/server.js
index f411844..cd6d058 100644
--- a/server.js
+++ b/server.js
@@ -2498,6 +2498,37 @@ cache(function(data, match, sendBadge, request) {
});
}));
+camp.route(/^\/codacy\/coverage\/(?!grade\/)([^\/]+)(?:\/(.+))?\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var projectId = match[1]; // eg. e27821fb6289410b8f58338c7e0bc686
+ var branch = match[2];
+ var format = match[3];
+
+ queryParams = {};
+ if (branch) {
+ queryParams.branch = branch;
+ }
+ var query = querystring.stringify(queryParams);
+ var url = 'https://www.codacy.com/project/badge/coverage/' + projectId + '?' + query;
+ var badgeData = getBadgeData('coverage', data);
+ fetchFromSvg(request, url, function(err, res) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ try {
+ badgeData.text[1] = res;
+ badgeData.colorscheme = coveragePercentageColor(parseInt(res));
+ sendBadge(format, badgeData);
+
+ } catch(e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
+
// Hackage version integration.
camp.route(/^\/hackage\/v\/(.*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
From cc9669dfb896a130c5ddc55abd49d7e7407a3ed5 Mon Sep 17 00:00:00 2001
From: Peter Dave Hello
Date: Sun, 13 Mar 2016 00:13:31 +0800
Subject: [PATCH 091/207] favicon.png recompress with zopflipng losslessly
Command:
`zopflipng --iterations=1500 --splitting=3 --lossy_transparent--filters=01234mepb`
---
favicon.png | Bin 392 -> 332 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/favicon.png b/favicon.png
index 1c3c32f303cd61e21453e68ece294c27a478ba88..771c3c171ac16359785f013fbb078e6e7cffc842 100644
GIT binary patch
delta 306
zcmV-20nPr11Iz-DBYy!CNklql+c97TfB*bp
zc>C`4r`xw~Wo1UsS;`m|7G@+QBy@<8k&&AL4+zX+zzcr;{P+LPl`p{nZs?)_p(u#L
z@EO6~2?GI%Kqb1c#I9m{=Glrrz&D~Ia=2cv0~jU3&$J7gZ-4VqiD;K|hErXB!z-r2(hG-4jEoE%teo%pg+$XD^Ea&l03*tRoVb|W?f?J)07*qoM6N<$
Ef{74~5dZ)H
delta 366
zcmV-!0g?X90*C{UBYyw{b3#c}2nYxWdz(7j5;KoAG;|7`ZooDxn#4t#~!99SvnJ%C*h(%1zQyvD*Ou(Z`mu(h-D
z3B=Oc>huMIoPr$7C7a!`u#MR*u5ilv_%SmC07X$u(lotEl7D1dN-5D2<4IcbgE~HT(QfFZ**DMbSlBmQT#Q-qoxY
zj_nNbptpHK0FY(bZdsPsN~tk3_uB^c4*!sd5cURN!+3OhdH(qD10%|UoV?8*-T(jq
M07*qoM6N<$f`mb$X8-^I
From b72e29d7937855792ebbfdfd473294d99aeb0e82 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 13 Mar 2016 23:55:06 +0100
Subject: [PATCH 092/207] Increase chances of pixel grid alignment
---
badge.js | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/badge.js b/badge.js
index 37206e7..e6049c1 100644
--- a/badge.js
+++ b/badge.js
@@ -63,10 +63,15 @@ function makeImage(data, cb) {
if (data.text[0].length === 0) {
data.logoPadding = 0;
}
+
+ var textWidth1 = (measureTextWidth(data.text[0])|0);
+ var textWidth2 = (measureTextWidth(data.text[1])|0);
+ // Increase chances of pixel grid alignment.
+ if (textWidth1 % 2 === 0) { textWidth1++; }
+ if (textWidth2 % 2 === 0) { textWidth2++; }
data.widths = [
- (measureTextWidth(data.text[0])|0) + 10
- + data.logoWidth + data.logoPadding,
- (measureTextWidth(data.text[1])|0) + 10,
+ textWidth1 + 10 + data.logoWidth + data.logoPadding,
+ textWidth2 + 10,
];
if (data.links === undefined) {
data.links = ['', ''];
From 4df74acd6ce78d480fa37d11319ba13682e482f5 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Mon, 14 Mar 2016 18:15:17 +0100
Subject: [PATCH 093/207] NuGet: use API v3
The v2 API returned XML even though we asked for JSON.
MyGet is still not working.
Part of #655.
---
index.html | 12 +-----
server.js | 114 +++++++++++++++++++++++++++++++++++++++++++++++++----
try.html | 12 +-----
3 files changed, 111 insertions(+), 27 deletions(-)
diff --git a/index.html b/index.html
index 3846d04..89fbe0d 100644
--- a/index.html
+++ b/index.html
@@ -272,14 +272,6 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/gem/dt/rails.svg
- NuGet:
-
- https://img.shields.io/nuget/dt/Microsoft.AspNet.Mvc.svg
-
- MyGet:
-
- https://img.shields.io/myget/yolodev/dt/FSharpSupport.svg
-
Chocolatey:
https://img.shields.io/chocolatey/dt/scriptcs.svg
@@ -472,8 +464,8 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/nuget/v/Nuget.Core.svg
NuGet Pre Release:
-
- https://img.shields.io/nuget/vpre/Nuget.Core.svg
+
+ https://img.shields.io/nuget/vpre/Microsoft.AspNet.Mvc.svg
MyGet:
diff --git a/server.js b/server.js
index 0dad8a1..8725080 100644
--- a/server.js
+++ b/server.js
@@ -3149,7 +3149,7 @@ cache(function(data, match, sendBadge, request) {
});
}));
-function mapNugetFeed(pattern, offset, getInfo) {
+function mapNugetFeedv2(pattern, offset, getInfo) {
var vRegex = new RegExp('^\\/' + pattern + '\\/v\\/(.*)\\.(svg|png|gif|jpg|json)$');
var vPreRegex = new RegExp('^\\/' + pattern + '\\/vpre\\/(.*)\\.(svg|png|gif|jpg|json)$');
var dtRegex = new RegExp('^\\/' + pattern + '\\/dt\\/(.*)\\.(svg|png|gif|jpg|json)$');
@@ -3277,17 +3277,117 @@ function mapNugetFeed(pattern, offset, getInfo) {
}));
}
-// NuGet and Chocolatey
-mapNugetFeed('(nuget|chocolatey)', 1, function(match) {
- var site = match[1];
+function mapNugetFeed(pattern, offset, getInfo) {
+ var vRegex = new RegExp('^\\/' + pattern + '\\/v\\/(.*)\\.(svg|png|gif|jpg|json)$');
+ var vPreRegex = new RegExp('^\\/' + pattern + '\\/vpre\\/(.*)\\.(svg|png|gif|jpg|json)$');
+
+ function getNugetVersion(apiUrl, id, includePre, request, done) {
+ var reqUrl = apiUrl + '/flatcontainer/' + id.toLowerCase() + '/index.json';
+ request(reqUrl, function(err, res, buffer) {
+ if (err != null) {
+ done(err);
+ return;
+ }
+
+ try {
+ var data = JSON.parse(buffer);
+ var versions = data.versions;
+ if (!includePre) {
+ // Remove prerelease versions.
+ filteredVersions = versions.filter(function(version) {
+ return !/-/.test(version);
+ });
+ if (filteredVersions.length > 0) {
+ versions = filteredVersions;
+ }
+ }
+ var lastVersion = versions[versions.length - 1];
+ done(null, lastVersion);
+ } catch (e) { done(e); }
+ });
+ }
+
+ camp.route(vRegex,
+ cache(function(data, match, sendBadge, request) {
+ var info = getInfo(match);
+ var site = info.site; // eg, `Chocolatey`, or `YoloDev`
+ var repo = match[offset + 1]; // eg, `Nuget.Core`.
+ var format = match[offset + 2];
+ var apiUrl = info.feed;
+ var badgeData = getBadgeData(site, data);
+ getNugetVersion(apiUrl, repo, false, request, function(err, version) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ try {
+ badgeData.text[1] = 'v' + version;
+ if (version.indexOf('-') !== -1) {
+ badgeData.colorscheme = 'yellow';
+ } else if (version[0] === '0') {
+ badgeData.colorscheme = 'orange';
+ } else {
+ badgeData.colorscheme = 'blue';
+ }
+ sendBadge(format, badgeData);
+ } catch(e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+ }));
+
+ camp.route(vPreRegex,
+ cache(function(data, match, sendBadge, request) {
+ var info = getInfo(match);
+ var site = info.site; // eg, `Chocolatey`, or `YoloDev`
+ var repo = match[offset + 1]; // eg, `Nuget.Core`.
+ var format = match[offset + 2];
+ var apiUrl = info.feed;
+ var badgeData = getBadgeData(site, data);
+ getNugetVersion(apiUrl, repo, true, request, function(err, version) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ try {
+ badgeData.text[1] = 'v' + version;
+ if (version.indexOf('-') !== -1) {
+ badgeData.colorscheme = 'yellow';
+ } else if (version[0] === '0') {
+ badgeData.colorscheme = 'orange';
+ } else {
+ badgeData.colorscheme = 'blue';
+ }
+ sendBadge(format, badgeData);
+ } catch(e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+ }));
+}
+
+// Chocolatey
+mapNugetFeedv2('chocolatey', 0, function(match) {
return {
- site: site,
- feed: 'https://www.' + site + '.org/api/v2'
+ site: 'chocolatey',
+ feed: 'https://www.chocolatey.org/api/v2'
+ };
+});
+
+// NuGet
+mapNugetFeed('nuget', 0, function(match) {
+ return {
+ site: 'nuget',
+ feed: 'https://api.nuget.org/v3'
};
});
// MyGet
-mapNugetFeed('myget\\/(.*)', 1, function(match) {
+mapNugetFeedv2('myget\\/(.*)', 1, function(match) {
var feed = match[1];
return {
site: feed,
diff --git a/try.html b/try.html
index c68f092..30b1bab 100644
--- a/try.html
+++ b/try.html
@@ -271,14 +271,6 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/gem/dt/rails.svg
- NuGet:
-
- https://img.shields.io/nuget/dt/Microsoft.AspNet.Mvc.svg
-
- MyGet:
-
- https://img.shields.io/myget/yolodev/dt/FSharpSupport.svg
-
Chocolatey:
https://img.shields.io/chocolatey/dt/scriptcs.svg
@@ -471,8 +463,8 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/nuget/v/Nuget.Core.svg
NuGet Pre Release:
-
- https://img.shields.io/nuget/vpre/Nuget.Core.svg
+
+ https://img.shields.io/nuget/vpre/Microsoft.AspNet.Mvc.svg
MyGet:
From fbb034f6e57efc2af78ece279cddee56e4b03199 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 15 Mar 2016 14:20:00 +0100
Subject: [PATCH 094/207] MyGet: use of v3 API
Fixes #655.
---
server.js | 4 ++--
try.html | 8 ++++----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/server.js b/server.js
index 8725080..2e3efdc 100644
--- a/server.js
+++ b/server.js
@@ -3387,11 +3387,11 @@ mapNugetFeed('nuget', 0, function(match) {
});
// MyGet
-mapNugetFeedv2('myget\\/(.*)', 1, function(match) {
+mapNugetFeed('myget\\/(.*)', 1, function(match) {
var feed = match[1];
return {
site: feed,
- feed: 'https://www.myget.org/F/' + feed + '/api/v2'
+ feed: 'https://www.myget.org/F/' + feed + '/api/v3'
};
});
diff --git a/try.html b/try.html
index 30b1bab..9c627c9 100644
--- a/try.html
+++ b/try.html
@@ -467,12 +467,12 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/nuget/vpre/Microsoft.AspNet.Mvc.svg
MyGet:
-
- https://img.shields.io/myget/yolodev/v/FSharpSupport.svg
+
+ https://img.shields.io/myget/mongodb/v/MongoDB.Driver.Core.svg
MyGet Pre Release:
-
- https://img.shields.io/myget/yolodev/vpre/FSharpSupport.svg
+
+ https://img.shields.io/myget/yolodev/vpre/YoloDev.Dnx.FSharp.svg
Chocolatey:
From 2fb78ba775b56de57d4c153a3e77183f0c436090 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 15 Mar 2016 14:25:47 +0100
Subject: [PATCH 095/207] website: MyGet
---
index.html | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/index.html b/index.html
index 89fbe0d..be734e7 100644
--- a/index.html
+++ b/index.html
@@ -468,12 +468,12 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/nuget/vpre/Microsoft.AspNet.Mvc.svg
MyGet:
-
- https://img.shields.io/myget/yolodev/v/FSharpSupport.svg
+
+ https://img.shields.io/myget/mongodb/v/MongoDB.Driver.Core.svg
MyGet Pre Release:
-
- https://img.shields.io/myget/yolodev/vpre/FSharpSupport.svg
+
+ https://img.shields.io/myget/yolodev/vpre/YoloDev.Dnx.FSharp.svg
Chocolatey:
From 4b3b8bd49bcf307fea05178e751b643d85ff4b56 Mon Sep 17 00:00:00 2001
From: Konstantin Molchanov
Date: Tue, 22 Mar 2016 10:58:35 +0300
Subject: [PATCH 096/207] Attempt to add logo to flat-square template
I'm really not sure this would work, I just copied a code chunk from flat.
---
templates/flat-square-template.svg | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/templates/flat-square-template.svg b/templates/flat-square-template.svg
index dc10083..b5ee24f 100644
--- a/templates/flat-square-template.svg
+++ b/templates/flat-square-template.svg
@@ -4,7 +4,12 @@
- {{=it.escapeXml(it.text[0])}}
+ {{?it.logo}}
+
+ {{?}}
+ {{=it.escapeXml(it.text[0])}}
+ {{=it.escapeXml(it.text[0])}}
+ {{=it.escapeXml(it.text[1])}}
{{=it.escapeXml(it.text[1])}}
From 479b5c666671f02a9100f23c687efa27d2b8d16e Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Mon, 28 Mar 2016 19:53:49 +0200
Subject: [PATCH 097/207] Document the command to generate index.html
---
CONTRIBUTING.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 6583260..0ecd0b3 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -14,7 +14,7 @@ shields.io.
Note that the root gets redirected to .
For testing purposes, you can go to `http://localhost/try.html`.
You should modify that file. The "real" root, `http://localhost/index.html`,
-gets generated from the `try.html` file.
+gets generated from the `try.html` file with a `make website`.
## Ground rules
From 7bd2e9a819e53cc1446760e855db5bbdaa7d1a9b Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Mon, 28 Mar 2016 20:11:53 +0200
Subject: [PATCH 098/207] gemnasium ?label override
Closes #619.
---
server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server.js b/server.js
index 9b1b211..e5a602c 100644
--- a/server.js
+++ b/server.js
@@ -2394,7 +2394,7 @@ cache(function(data, match, sendBadge, request) {
try {
var nameMatch = buffer.match(/(devD|d)ependencies/)[0];
var statusMatch = buffer.match(/'14'>(.+)<\/text>\s*<\/g>/)[1];
- badgeData.text[0] = nameMatch;
+ badgeData.text[0] = data.label || nameMatch;
badgeData.text[1] = statusMatch;
if (statusMatch === 'up-to-date') {
badgeData.colorscheme = 'brightgreen';
From cde3298ddb7c53e29e89d1c3ac450128f4c42bc9 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 29 Mar 2016 23:20:58 +0200
Subject: [PATCH 099/207] website: sourceforge + bithound
---
index.html | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/index.html b/index.html
index be734e7..13a0eb6 100644
--- a/index.html
+++ b/index.html
@@ -340,6 +340,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/sourceforge/dt/sevenzip.svg
+ SourceForge:
+
+ https://img.shields.io/sourceforge/dt/arianne/stendhal.svg
+
apm:
https://img.shields.io/apm/dm/vim-mode.svg
@@ -563,6 +567,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/codeclimate/coverage/github/triAGENS/ashikawa-core.svg
+ bitHound:
+
+ https://img.shields.io/bithound/code/github/rexxars/sse-channel.svg
+
Gemnasium:
https://img.shields.io/gemnasium/mathiasbynens/he.svg
@@ -755,6 +763,14 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/david/peer/webcomponents/generator-element.svg
+ bitHound:
+
+ https://img.shields.io/bithound/dependencies/github/rexxars/sse-channel.svg
+
+ bitHound:
+
+ https://img.shields.io/bithound/devDependencies/github/rexxars/sse-channel.svg
+
CocoaPods:
https://img.shields.io/cocoapods/p/AFNetworking.svg
From e728f2395cb240613ca41aaf11870c31668df854 Mon Sep 17 00:00:00 2001
From: Julien Rottenberg
Date: Tue, 29 Mar 2016 21:33:51 -0700
Subject: [PATCH 100/207] Clearer format for #661
---
server.js | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/server.js b/server.js
index 05570e9..fbc0b85 100644
--- a/server.js
+++ b/server.js
@@ -4483,7 +4483,7 @@ cache(function(data, match, sendBadge, request) {
}
var path = user + '/' + repo;
var url = 'https://registry.hub.docker.com/v2/repositories/' + path;
- var badgeData = getBadgeData('automated build', data);
+ var badgeData = getBadgeData('docker build', data);
request(url, function(err, res, buffer) {
if (err != null) {
badgeData.text[1] = 'inaccessible';
@@ -4492,11 +4492,12 @@ cache(function(data, match, sendBadge, request) {
}
try {
var data = JSON.parse(buffer);
- var automated = data.is_automated;
- badgeData.text[1] = automated;
- if (automated) {
+ var is_automated = data.is_automated;
+ if (is_automated) {
+ badgeData.text[1] = 'automated';
badgeData.colorscheme = 'blue';
} else {
+ badgeData.text[1] = 'manual';
badgeData.colorscheme = 'yellow';
}
badgeData.colorB = '#008bb8';
From 93247eef67345a599fad267791762c844fe53b7b Mon Sep 17 00:00:00 2001
From: Mario Colque
Date: Wed, 30 Mar 2016 13:50:15 -0300
Subject: [PATCH 101/207] added working examples in cooments, code-styling,
added example to try.html
---
server.js | 8 +++++---
try.html | 4 ++++
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/server.js b/server.js
index 185ea81..af883e1 100644
--- a/server.js
+++ b/server.js
@@ -4712,11 +4712,13 @@ cache(function(data, match, sendBadge, request) {
));
// beerpay.io integration.
+// e.g. JSON response: https://beerpay.io/api/v1/beerpay/projects/beerpay.io
+// e.g. SVG badge: https://beerpay.io/beerpay/beerpay.io/badge.svg?style=flat-square
camp.route(/^\/beerpay\/(.*)\/(.*)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
- var user = match[1],
- project = match[2],
- format = match[3];
+ var user = match[1];
+ var project = match[2];
+ var format = match[3];
var apiUrl = 'https://beerpay.io/api/v1/' + user + '/projects/' + project;
var badgeData = getBadgeData('beerpay', data);
diff --git a/try.html b/try.html
index c68f092..39fa392 100644
--- a/try.html
+++ b/try.html
@@ -562,6 +562,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/bountysource/team/mozilla-core/activity.svg
+ Beerpay:
+
+ https://img.shields.io/beerpay/hashdog/scrapfy-chrome-extension.svg
+
Code Climate:
https://img.shields.io/codeclimate/github/kabisaict/flow.svg
From 582a8f7ce3700d9d2957c458f7ca36a18a30fe03 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Wed, 30 Mar 2016 22:53:00 +0200
Subject: [PATCH 102/207] website: code climate, visual studio
---
index.html | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/index.html b/index.html
index d9ad2ca..a28a5b7 100644
--- a/index.html
+++ b/index.html
@@ -129,7 +129,7 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/circleci/token/YOURTOKEN/project/BrightFlair/PHP.Gt/master.svg
- Visual Studio Team Services:
+ Visual Studio Team services:
https://img.shields.io/vso/build/larsbrinkhoff/953a34b9-5966-4923-a48a-c41874cfb5f5/1.svg
@@ -567,6 +567,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/codeclimate/coverage/github/triAGENS/ashikawa-core.svg
+ Code Climate:
+
+ https://img.shields.io/codeclimate/issues/github/me-and/mdf.svg
+
bitHound:
https://img.shields.io/bithound/code/github/rexxars/sse-channel.svg
From 27ef17defb263307c1ff6f13c71655100a5102b7 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Wed, 30 Mar 2016 23:55:29 +0200
Subject: [PATCH 103/207] Waffle.io support
Fixes #257.
---
server.js | 40 ++++++++++++++++++++++++++++++++++++++++
try.html | 4 ++++
2 files changed, 44 insertions(+)
diff --git a/server.js b/server.js
index f763352..b87cd4f 100644
--- a/server.js
+++ b/server.js
@@ -4906,6 +4906,46 @@ cache(function(data, match, sendBadge, request) {
});
}));
+// Waffle.io integration
+camp.route(/^\/waffle\/column\/([^\/]+)\/([^\/]+)\/?([^\/]+)?\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var user = match[1]; // eg, potherca
+ var repo = match[2]; // eg, GraphvizWebEditor
+ var ghLabel = match[3] || 'ready'; // eg, waffle:%20ready%20for%20development
+ var format = match[4];
+ var apiUrl = 'https://api.waffle.io/' + user + '/' + repo + '/columns';
+ var badgeData = getBadgeData('issues', data);
+
+ request(apiUrl, function(err, res, buffer) {
+ try {
+ var list = JSON.parse(buffer);
+ if (list.length === 0) {
+ badgeData.text[1] = 'absent';
+ sendBadge(format, badgeData);
+ return;
+ }
+ var column;
+ for (var i = 0; i < list.length; i++) {
+ var column = list[i];
+ var name = column.label? column.label.name: column.displayName;
+ var color = column.label? column.label.color: '78bdf2';
+ if (name === ghLabel) {
+ break;
+ }
+ }
+ badgeData.text[0] = data.label || column.displayName || name;
+ badgeData.text[1] = '' + column.issues.length;
+ badgeData.colorscheme = null;
+ badgeData.colorB = '#' + color;
+ sendBadge(format, badgeData);
+
+ } catch(e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
+
// Any badge.
camp.route(/^\/(:|badge\/)(([^-]|--)*?)-(([^-]|--)*)-(([^-]|--)+)\.(svg|png|gif|jpg)$/,
function(data, match, end, ask) {
diff --git a/try.html b/try.html
index 67903ab..dc88b44 100644
--- a/try.html
+++ b/try.html
@@ -746,6 +746,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/maintenance/yes/2016.svg
+ Waffle.io:
+
+ https://img.shields.io/waffle/column/potherca/GraphvizWebEditor/waffle:%20in%20progress.svg
+
Longer Miscellaneous
From 0826665c49c1dd85a9939d203be7185fc03a0447 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Thu, 31 Mar 2016 23:58:14 +0200
Subject: [PATCH 104/207] website: waffle.io
---
index.html | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/index.html b/index.html
index a28a5b7..e3f21d9 100644
--- a/index.html
+++ b/index.html
@@ -747,6 +747,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/maintenance/yes/2016.svg
+ Waffle.io:
+
+ https://img.shields.io/waffle/column/potherca/GraphvizWebEditor/waffle:%20in%20progress.svg
+
Longer Miscellaneous
From 5b2b74bdbbf3db16946eb83f328071ca1d0dd096 Mon Sep 17 00:00:00 2001
From: Evan Cohen
Date: Thu, 31 Mar 2016 21:54:36 -0700
Subject: [PATCH 105/207] using waffle API. Fixes badges/shields#257
---
server.js | 39 +++++++++++++++++++++++----------------
try.html | 4 ++--
2 files changed, 25 insertions(+), 18 deletions(-)
diff --git a/server.js b/server.js
index b87cd4f..5f79508 100644
--- a/server.js
+++ b/server.js
@@ -4907,34 +4907,41 @@ cache(function(data, match, sendBadge, request) {
}));
// Waffle.io integration
-camp.route(/^\/waffle\/column\/([^\/]+)\/([^\/]+)\/?([^\/]+)?\.(svg|png|gif|jpg|json)$/,
+camp.route(/^\/waffle\/cards\/([^\/]+)\/([^\/]+)\/?([^\/]+)?\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
- var user = match[1]; // eg, potherca
- var repo = match[2]; // eg, GraphvizWebEditor
- var ghLabel = match[3] || 'ready'; // eg, waffle:%20ready%20for%20development
+ var user = match[1]; // eg, evancohen
+ var repo = match[2]; // eg, smart-mirror
+ var ghLabel = match[3] || 'ready'; // eg, in%20progress
var format = match[4];
- var apiUrl = 'https://api.waffle.io/' + user + '/' + repo + '/columns';
+ var apiUrl = 'https://api.waffle.io/' + user + '/' + repo + '/cards';
var badgeData = getBadgeData('issues', data);
request(apiUrl, function(err, res, buffer) {
try {
- var list = JSON.parse(buffer);
- if (list.length === 0) {
+ var cards = JSON.parse(buffer);
+ if (cards.length === 0) {
badgeData.text[1] = 'absent';
sendBadge(format, badgeData);
return;
}
- var column;
- for (var i = 0; i < list.length; i++) {
- var column = list[i];
- var name = column.label? column.label.name: column.displayName;
- var color = column.label? column.label.color: '78bdf2';
- if (name === ghLabel) {
- break;
+ var count = 0;
+ var color;
+ var name;
+ for (var i = 0; i < cards.length; i++) {
+ var cardMetadata = cards[i].githubMetadata;
+ if(cardMetadata.labels && cardMetadata.labels.length > 0){
+ for(var j = 0; j < cardMetadata.labels.length; j++){
+ var label = cardMetadata.labels[j];
+ if(label.name == ghLabel){
+ count++;
+ color = label.color;
+ name = label.name;
+ }
+ }
}
}
- badgeData.text[0] = data.label || column.displayName || name;
- badgeData.text[1] = '' + column.issues.length;
+ badgeData.text[0] = data.label || name;
+ badgeData.text[1] = '' + count;
badgeData.colorscheme = null;
badgeData.colorB = '#' + color;
sendBadge(format, badgeData);
diff --git a/try.html b/try.html
index dc88b44..60d2b13 100644
--- a/try.html
+++ b/try.html
@@ -747,8 +747,8 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/maintenance/yes/2016.svg
Waffle.io:
-
- https://img.shields.io/waffle/column/potherca/GraphvizWebEditor/waffle:%20in%20progress.svg
+
+ https://img.shields.io/cards/column/evancohen/smart-mirror/in%20progress.svg
From cd1c9e176bbcbad749357f4fbd1f91e0c625ce0e Mon Sep 17 00:00:00 2001
From: Evan Cohen
Date: Thu, 31 Mar 2016 22:42:13 -0700
Subject: [PATCH 106/207] adding fallback color when there are no labels
---
server.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/server.js b/server.js
index 5f79508..fe7828e 100644
--- a/server.js
+++ b/server.js
@@ -4940,10 +4940,10 @@ cache(function(data, match, sendBadge, request) {
}
}
}
- badgeData.text[0] = data.label || name;
+ badgeData.text[0] = data.label || name || ghLabel;
badgeData.text[1] = '' + count;
badgeData.colorscheme = null;
- badgeData.colorB = '#' + color;
+ badgeData.colorB = '#' + (color || '78bdf2');
sendBadge(format, badgeData);
} catch(e) {
From fbd5b564bef3b2d06e9a09adde942c86c00a9d30 Mon Sep 17 00:00:00 2001
From: Evan Cohen
Date: Fri, 1 Apr 2016 11:00:32 -0700
Subject: [PATCH 107/207] code style fixes and a slight optimization
---
server.js | 12 +++++-------
try.html | 4 ++--
2 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/server.js b/server.js
index fe7828e..61bef72 100644
--- a/server.js
+++ b/server.js
@@ -4907,7 +4907,7 @@ cache(function(data, match, sendBadge, request) {
}));
// Waffle.io integration
-camp.route(/^\/waffle\/cards\/([^\/]+)\/([^\/]+)\/?([^\/]+)?\.(svg|png|gif|jpg|json)$/,
+camp.route(/^\/waffle\/label\/([^\/]+)\/([^\/]+)\/?([^\/]+)?\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
var user = match[1]; // eg, evancohen
var repo = match[2]; // eg, smart-mirror
@@ -4926,21 +4926,19 @@ cache(function(data, match, sendBadge, request) {
}
var count = 0;
var color;
- var name;
for (var i = 0; i < cards.length; i++) {
var cardMetadata = cards[i].githubMetadata;
- if(cardMetadata.labels && cardMetadata.labels.length > 0){
- for(var j = 0; j < cardMetadata.labels.length; j++){
+ if (cardMetadata.labels && cardMetadata.labels.length > 0) {
+ for (var j = 0; j < cardMetadata.labels.length; j++) {
var label = cardMetadata.labels[j];
- if(label.name == ghLabel){
+ if (label.name === ghLabel) {
count++;
color = label.color;
- name = label.name;
}
}
}
}
- badgeData.text[0] = data.label || name || ghLabel;
+ badgeData.text[0] = data.label || ghLabel;
badgeData.text[1] = '' + count;
badgeData.colorscheme = null;
badgeData.colorB = '#' + (color || '78bdf2');
diff --git a/try.html b/try.html
index 60d2b13..c0dfac3 100644
--- a/try.html
+++ b/try.html
@@ -747,8 +747,8 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/maintenance/yes/2016.svg
Waffle.io:
-
- https://img.shields.io/cards/column/evancohen/smart-mirror/in%20progress.svg
+
+ https://img.shields.io/waffle/label/evancohen/smart-mirror/in%20progress.svg
From fa109d5e3901756b2c1534c042e66e68a02f12bd Mon Sep 17 00:00:00 2001
From: Akihiro Uchida
Date: Sun, 3 Apr 2016 18:07:26 +0900
Subject: [PATCH 108/207] fix errored in ansible role badge
---
server.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/server.js b/server.js
index b87cd4f..58120ca 100644
--- a/server.js
+++ b/server.js
@@ -3722,8 +3722,7 @@ cache(function(data, match, sendBadge, request) {
}
try {
if (type === 'role') {
- badgeData.text[1] = json.summary_fields.owner.username +
- '.' + json.name;
+ badgeData.text[1] = json.namespace + '.' + json.name;
badgeData.colorscheme = 'blue';
} else {
badgeData.text[1] = 'unknown';
From 657986351c1fe4c31a923187aca6c763e42c42dc Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 3 Apr 2016 13:13:30 +0200
Subject: [PATCH 109/207] GitHub issue label support
Related to #257.
---
server.js | 28 +++++++++++++++++++++-------
try.html | 4 ++++
2 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/server.js b/server.js
index b87cd4f..f8a74b7 100644
--- a/server.js
+++ b/server.js
@@ -2892,19 +2892,29 @@ cache(function(data, match, sendBadge, request) {
}));
// GitHub issues integration.
-camp.route(/^\/github\/issues(-raw)?\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
+camp.route(/^\/github\/issues(-raw)?\/([^\/]+)\/([^\/]+)\/?([^\/]+)?\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
var isRaw = !!match[1];
- var user = match[2]; // eg, qubyte/rubidium
- var repo = match[3];
- var format = match[4];
+ var user = match[2]; // eg, badges
+ var repo = match[3]; // eg, shields
+ var ghLabel = match[4]; // eg, website
+ var format = match[5];
var apiUrl = 'https://api.github.com/repos/' + user + '/' + repo;
+ var issuesApi = false; // Are we using the issues API instead of the repo one?
+ var query = {};
+ if (ghLabel !== undefined) {
+ apiUrl += '/issues';
+ query.labels = ghLabel;
+ issuesApi = true;
+ }
// Using our OAuth App secret grants us 5000 req/hour
// instead of the standard 60 req/hour.
if (serverSecrets) {
- apiUrl += '?client_id=' + serverSecrets.gh_client_id
- + '&client_secret=' + serverSecrets.gh_client_secret;
+ query.client_id = serverSecrets.gh_client_id;
+ query.client_secret = serverSecrets.gh_client_secret;
}
+ apiUrl += '?' + querystring.stringify(query);
+
var badgeData = getBadgeData('issues', data);
if (badgeData.template === 'social') {
badgeData.logo = badgeData.logo || logos.github;
@@ -2922,7 +2932,11 @@ cache(function(data, match, sendBadge, request) {
return; // Hope for the best in the cache.
}
var data = JSON.parse(buffer);
- var issues = data.open_issues_count;
+ if (issuesApi) {
+ var issues = data.length;
+ } else {
+ var issues = data.open_issues_count;
+ }
badgeData.text[1] = issues + (isRaw? '': ' open');
badgeData.colorscheme = issues ? 'yellow' : 'brightgreen';
sendBadge(format, badgeData);
diff --git a/try.html b/try.html
index dc88b44..e3494fc 100644
--- a/try.html
+++ b/try.html
@@ -662,6 +662,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/github/issues-raw/badges/shields.svg
+ label:
+
+ https://img.shields.io/github/issues-raw/badges/shields/website.svg
+
GitHub license:
https://img.shields.io/github/license/mashape/apistatus.svg
From 1e24e2624d8e4d306ffb0ad1a16c3d976d3a8920 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Mon, 4 Apr 2016 23:43:52 +0200
Subject: [PATCH 110/207] GitHub label, Waffle label
---
index.html | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/index.html b/index.html
index e3f21d9..6e0b832 100644
--- a/index.html
+++ b/index.html
@@ -663,6 +663,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/github/issues-raw/badges/shields.svg
+ label:
+
+ https://img.shields.io/github/issues-raw/badges/shields/website.svg
+
GitHub license:
https://img.shields.io/github/license/mashape/apistatus.svg
@@ -748,8 +752,8 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/maintenance/yes/2016.svg
Waffle.io:
-
- https://img.shields.io/waffle/column/potherca/GraphvizWebEditor/waffle:%20in%20progress.svg
+
+ https://img.shields.io/waffle/label/evancohen/smart-mirror/in%20progress.svg
From 40471a137e2891768854b587e51996b8c8ae7bf6 Mon Sep 17 00:00:00 2001
From: JP-Ellis
Date: Tue, 5 Apr 2016 12:03:47 +1000
Subject: [PATCH 111/207] Add AUR integration.
Add badge for the Arch User Repository (AUR). Includes badges to
display the current version, number of votes, and license.
Unfortunately, their API does not display downloads at this stage.
Signed-off-by: JP-Ellis
---
server.js | 42 ++++++++++++++++++++++++++++++++++++++++++
try.html | 11 +++++++++++
2 files changed, 53 insertions(+)
diff --git a/server.js b/server.js
index 13eab15..5af599f 100644
--- a/server.js
+++ b/server.js
@@ -4957,7 +4957,49 @@ cache(function(data, match, sendBadge, request) {
badgeData.colorscheme = null;
badgeData.colorB = '#' + (color || '78bdf2');
sendBadge(format, badgeData);
+ } catch(e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
+// Arch user repository (AUR) integration.
+camp.route(/^\/aur\/(version|votes|license)\/(.*)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var info = match[1];
+ var pkg = match[2];
+ var format = match[3];
+ var apiUrl = 'https://aur.archlinux.org/rpc.php?type=info&arg=' + pkg;
+ var badgeData = getBadgeData('AUR', data);
+ request(apiUrl, function(err, res, buffer) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ try {
+ var data = JSON.parse(buffer).results;
+ if (info === 'version') {
+ var vdata = versionColor(data.Version);
+ badgeData.text[1] = vdata.version;
+ if (data.OutOfDate === null) {
+ badgeData.colorscheme = 'blue';
+ } else {
+ badgeData.colorscheme = 'orange';
+ }
+ } else if (info === 'votes') {
+ var votes = data.NumVotes;
+ badgeData.text[0] = "votes";
+ badgeData.text[1] = votes;
+ badgeData.colorscheme = floorCountColor(votes, 2, 20, 60);
+ } else if (info === 'license') {
+ var license = data.License;
+ badgeData.text[0] = "license";
+ badgeData.text[1] = license;
+ badgeData.colorscheme = 'blue';
+ }
+ sendBadge(format, badgeData);
} catch(e) {
badgeData.text[1] = 'invalid';
sendBadge(format, badgeData);
diff --git a/try.html b/try.html
index eecf583..acc69c0 100644
--- a/try.html
+++ b/try.html
@@ -514,6 +514,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/dub/v/vibe-d.svg
+ AUR:
+
+ https://img.shields.io/aur/version/yaourt.svg
+
Social
@@ -542,6 +546,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/twitter/follow/shields_io.svg?style=social
+ AUR:
+
+ https://img.shields.io/aur/votes/yaourt.svg
+
Miscellaneous
@@ -749,6 +757,9 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
Maintenance:
https://img.shields.io/maintenance/yes/2016.svg
+ AUR:
+
+ https://img.shields.io/aur/license/yaourt.svg
Waffle.io:
From e5103a1781b0d95cd9426246d88db000ffc5595a Mon Sep 17 00:00:00 2001
From: sanemat
Date: Tue, 5 Apr 2016 22:00:44 +0900
Subject: [PATCH 112/207] Add chrome extension support
* Version, Downloads, Price, Rating and Rating Count for chrome app,
chrome extension and chrome theme.
* Google does not provide a public API for chrome web store.
* Use `chrome-web-store-item-property`.
* Gather meta information from chrome web store.
see #505, #636
---
package.json | 3 ++-
server.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
try.html | 20 ++++++++++++++++++++
3 files changed, 70 insertions(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 0e44c43..31673a5 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,8 @@
"camp": "~16.0.0",
"semver": "~4.3.3",
"bower": "~1.4.1",
- "promise": "~7.0.0"
+ "promise": "~7.0.0",
+ "chrome-web-store-item-property": "^1.1.2"
},
"devDependencies": {
"ass": "~0.0.6",
diff --git a/server.js b/server.js
index 13eab15..09930f8 100644
--- a/server.js
+++ b/server.js
@@ -4965,6 +4965,54 @@ cache(function(data, match, sendBadge, request) {
});
}));
+// Chrome web store integration
+camp.route(/^\/chrome-web-store\/(v|d|price|rating|rating-count)\/(.*)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var type = match[1];
+ var storeId = match[2]; // eg, nimelepbpejjlbmoobocpfnjhihnpked
+ var format = match[3];
+ var badgeData = getBadgeData('chrome web store', data);
+ var url = 'https://chrome.google.com/webstore/detail/' + storeId + '?hl=en&gl=US';
+ var chromeWebStore = require('chrome-web-store-item-property');
+ request(url, function(err, res, buffer) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ return;
+ }
+ chromeWebStore.convert(buffer)
+ .then(function (value) {
+ if (type === 'v') {
+ var vdata = versionColor(value.version);
+ badgeData.text[1] = vdata.version;
+ badgeData.colorscheme = vdata.color;
+ } else if (type === 'd') {
+ var downloads = value.interactionCount.UserDownloads;
+ badgeData.text[0] = 'downloads';
+ badgeData.text[1] = metric(downloads) + ' total';
+ badgeData.colorscheme = downloadCountColor(downloads);
+ } else if (type === 'price') {
+ badgeData.text[1] = value.price;
+ badgeData.colorscheme = 'brightgreen';
+ } else if (type === 'rating') {
+ var rating = Math.round(value.ratingValue * 100) / 100;
+ badgeData.text[0] = 'rating';
+ badgeData.text[1] = rating;
+ badgeData.colorscheme = floorCountColor(rating, 2, 3, 4);
+ } else if (type === 'rating-count') {
+ var ratingCount = value.ratingCount;
+ badgeData.text[0] = 'rating count';
+ badgeData.text[1] = metric(ratingCount) + ' total';
+ badgeData.colorscheme = floorCountColor(ratingCount, 5, 50, 500);
+ }
+ sendBadge(format, badgeData);
+ }).catch(function (err) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ });
+ });
+}));
+
// Any badge.
camp.route(/^\/(:|badge\/)(([^-]|--)*?)-(([^-]|--)*)-(([^-]|--)+)\.(svg|png|gif|jpg)$/,
function(data, match, end, ask) {
diff --git a/try.html b/try.html
index eecf583..3956fbe 100644
--- a/try.html
+++ b/try.html
@@ -383,6 +383,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/packagecontrol/dt/Package%20Control.svg
+ Chrome Web Store:
+
+ https://img.shields.io/chrome-web-store/d/nimelepbpejjlbmoobocpfnjhihnpked.svg
+
Version
@@ -514,6 +518,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/dub/v/vibe-d.svg
+ Chrome Web Store:
+
+ https://img.shields.io/chrome-web-store/v/nimelepbpejjlbmoobocpfnjhihnpked.svg
+
Social
@@ -754,6 +762,18 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/waffle/label/evancohen/smart-mirror/in%20progress.svg
+ Chrome Web Store:
+
+ https://img.shields.io/chrome-web-store/price/nimelepbpejjlbmoobocpfnjhihnpked.svg
+
+ Chrome Web Store:
+
+ https://img.shields.io/chrome-web-store/rating/nimelepbpejjlbmoobocpfnjhihnpked.svg
+
+ Chrome Web Store:
+
+ https://img.shields.io/chrome-web-store/rating-count/nimelepbpejjlbmoobocpfnjhihnpked.svg
+
Longer Miscellaneous
From 7dc09e2e8df1da93c22f99043743cc98aa64d150 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Tue, 5 Apr 2016 22:21:23 +0200
Subject: [PATCH 113/207] Added dotted-version comparator & latest version
As planned in
https://github.com/badges/shields/issues/490#issuecomment-205550621.
Fixes #490.
---
server.js | 60 ++++++++++++++++++++++++++++++++++++-------------------
1 file changed, 40 insertions(+), 20 deletions(-)
diff --git a/server.js b/server.js
index 13eab15..0a71903 100644
--- a/server.js
+++ b/server.js
@@ -5245,27 +5245,52 @@ function versionColor(version) {
}
}
+// Take string versions.
+// -1 if v1 < v2, 1 if v1 > v2, 0 otherwise.
+function compareDottedVersion(v1, v2) {
+ var parts1 = /([0-9\.]+)(.*)$/.exec(v1);
+ var parts2 = /([0-9\.]+)(.*)$/.exec(v2);
+ if (parts1 != null && parts2 != null) {
+ var numbers1 = parts1[1];
+ var numbers2 = parts2[1];
+ var distinguisher1 = parts1[2];
+ var distinguisher2 = parts2[2];
+ var numlist1 = numbers1.split('.').map(function(e) { return +e; });
+ var numlist2 = numbers2.split('.').map(function(e) { return +e; });
+ var cmp = listCompare(numlist1, numlist2);
+ if (cmp !== 0) { return cmp; }
+ else { return distinguisher1 < distinguisher2? -1:
+ distinguisher1 > distinguisher2? 1: 0; }
+ }
+ return v1 < v2? -1: v1 > v2? 1: 0;
+}
+
+// Take a list of string versions.
+// Return the latest, or undefined, if there are none.
+function latestDottedVersion(versions) {
+ var len = versions.length;
+ if (len === 0) { return; }
+ var version = versions[0];
+ for (var i = 1; i < len; i++) {
+ if (compareDottedVersion(version, versions[i]) < 0) {
+ version = versions[i];
+ }
+ }
+ return version;
+}
+
// Given a list of versions (as strings), return the latest version.
+// Return undefined if no version could be found.
function latestVersion(versions) {
var version = '';
var origVersions = versions;
versions = versions.filter(function(version) {
return (/^v?[0-9]/).test(version);
});
- semver_versions = versions.map(function(version) {
- var matches = /^(v?[0-9]+)(\.[0-9]+)?(-.*)?$/.exec(version);
- if (matches) {
- version = matches[1] + (matches[2] ? matches[2] : '.0') + '.0' +
- (matches[3] ? matches[3] : '');
- }
- return version;
- });
try {
- version = semver.maxSatisfying(semver_versions, '');
- version = versions[semver_versions.indexOf(version)];
+ version = semver.maxSatisfying(versions, '');
} catch(e) {
- versions = versions.sort();
- version = versions[versions.length - 1];
+ version = latestDottedVersion(versions);
}
if (version === undefined) {
origVersions = origVersions.sort();
@@ -5381,20 +5406,15 @@ function phpNumberedVersionData(version) {
}
function listCompare(a, b) {
- for (var i = 0; i < a.length; i++) {
+ var alen = a.length, blen = b.length;
+ for (var i = 0; i < alen; i++) {
if (a[i] < b[i]) {
return -1;
} else if (a[i] > b[i]) {
return 1;
}
}
- if (a.length < b.length) {
- return -1;
- } else if (a.length > b.length) {
- return 1;
- } else {
- return 0;
- }
+ return alen - blen;
}
// Return a negative value if v1 < v2,
From 2ecb691196515ed5ab22d92997ca977b156c231b Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Wed, 6 Apr 2016 01:13:46 +0200
Subject: [PATCH 114/207] Correct indentation
From 40471a1.
---
server.js | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/server.js b/server.js
index 4e8d49d..b02892f 100644
--- a/server.js
+++ b/server.js
@@ -4943,13 +4943,13 @@ cache(function(data, match, sendBadge, request) {
for (var i = 0; i < cards.length; i++) {
var cardMetadata = cards[i].githubMetadata;
if (cardMetadata.labels && cardMetadata.labels.length > 0) {
- for (var j = 0; j < cardMetadata.labels.length; j++) {
- var label = cardMetadata.labels[j];
- if (label.name === ghLabel) {
- count++;
- color = label.color;
- }
+ for (var j = 0; j < cardMetadata.labels.length; j++) {
+ var label = cardMetadata.labels[j];
+ if (label.name === ghLabel) {
+ count++;
+ color = label.color;
}
+ }
}
}
badgeData.text[0] = data.label || ghLabel;
@@ -4958,8 +4958,8 @@ cache(function(data, match, sendBadge, request) {
badgeData.colorB = '#' + (color || '78bdf2');
sendBadge(format, badgeData);
} catch(e) {
- badgeData.text[1] = 'invalid';
- sendBadge(format, badgeData);
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
}
});
}));
From f07b7ab69cc82351e53d745dcb148a24ce80e991 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Wed, 6 Apr 2016 01:15:27 +0200
Subject: [PATCH 115/207] website: AUR
---
index.html | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/index.html b/index.html
index 6e0b832..de0df7b 100644
--- a/index.html
+++ b/index.html
@@ -515,6 +515,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/dub/v/vibe-d.svg
+ AUR:
+
+ https://img.shields.io/aur/version/yaourt.svg
+
Social
@@ -543,6 +547,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/twitter/follow/shields_io.svg?style=social
+ AUR:
+
+ https://img.shields.io/aur/votes/yaourt.svg
+
Miscellaneous
@@ -750,6 +758,9 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
Maintenance:
https://img.shields.io/maintenance/yes/2016.svg
+ AUR:
+
+ https://img.shields.io/aur/license/yaourt.svg
Waffle.io:
From 2b5ec621a738dc7c42b5370b6cad29c5dd298232 Mon Sep 17 00:00:00 2001
From: Gary Ewan Park
Date: Sun, 20 Mar 2016 20:44:23 +0000
Subject: [PATCH 116/207] (GH-638) Added basic badge integration for homebrew
---
index.html | 4 ++++
server.js | 30 ++++++++++++++++++++++++++++++
try.html | 4 ++++
3 files changed, 38 insertions(+)
diff --git a/index.html b/index.html
index 6e0b832..a6be10c 100644
--- a/index.html
+++ b/index.html
@@ -515,6 +515,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/dub/v/vibe-d.svg
+ homebrew:
+
+ https://img.shields.io/homebrew/v/cake.svg
+
Social
diff --git a/server.js b/server.js
index b02892f..0944924 100644
--- a/server.js
+++ b/server.js
@@ -4814,6 +4814,36 @@ cache(function(data, match, sendBadge, request) {
sendBadge(format, badgeData);
}));
+// homebrew integration
+// Example: /homebrew/v/cake.svg
+camp.route(/^\/homebrew\/v\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
+cache(function(data, match, sendBadge, request) {
+ var package = match[1];
+ var format = match[2];
+ var apiUrl = 'http://braumeister.org/formula/' + package + '/version';
+
+ var badgeData = getBadgeData('homebrew', data);
+ request(apiUrl, { headers: { 'Accept': 'application/json' } }, function(err, res, buffer) {
+ if (err != null) {
+ badgeData.text[1] = 'inaccessible';
+ sendBadge(format, badgeData);
+ }
+ try {
+ var data = JSON.parse(buffer);
+ var version = data.stable;
+
+ var vdata = versionColor(version);
+ badgeData.text[1] = vdata.version;
+ badgeData.colorscheme = vdata.color;
+
+ sendBadge(format, badgeData);
+ } catch(e) {
+ badgeData.text[1] = 'invalid';
+ sendBadge(format, badgeData);
+ }
+ });
+}));
+
// StackExchange integration.
camp.route(/^\/stackexchange\/([^\/]+)\/([^\/])\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
diff --git a/try.html b/try.html
index acc69c0..90f5db7 100644
--- a/try.html
+++ b/try.html
@@ -518,6 +518,10 @@ Pixel-perfect Retina-ready Fast Consistent Hackable
https://img.shields.io/aur/version/yaourt.svg
+ homebrew:
+
+ https://img.shields.io/homebrew/v/cake.svg
+
Social
From e8a2b1ce8ab43fa75648da8d330bb993b69f3ff8 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Fri, 8 Apr 2016 23:57:22 +0200
Subject: [PATCH 117/207] Document custom badges more prominently
Fixes #663.
---
INSTALL.md | 4 ++--
README.md | 4 ++++
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/INSTALL.md b/INSTALL.md
index d98807e..4ffc01f 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -6,9 +6,9 @@
[](https://travis-ci.org/badges/gh-badges)
-Make your own badges [here][badges]!
+Make your own badges [here][badges]! (Quick guide: `https://img.shields.io/badge/left-right-f39f37.svg`.)
-[badges]:
+[badges]:
# Install the API
diff --git a/README.md b/README.md
index 227ba2a..5631105 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,10 @@
* **[SPECIFICATION](spec/SPECIFICATION.md)** – spec for the visual design of Shields badges.
* **[LICENSE](LICENSE.md)** – public domain dedication.
+Make your own badges [here][badges]! (Quick guide: `https://img.shields.io/badge/left-right-f39f37.svg`.)
+
+[badges]:
+
## Solving the problem
Many GitHub repositories sport badges for things like:
From b89dc72fc4bf9fd46e29cfada9d8367ac0734a21 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sat, 9 Apr 2016 19:34:13 +0200
Subject: [PATCH 118/207] Support ?maxAge
Fixes #534.
---
server.js | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
diff --git a/server.js b/server.js
index 1d8b0ea..a7ee28d 100644
--- a/server.js
+++ b/server.js
@@ -170,8 +170,12 @@ vendorDomain.on('error', function(err) {
function cache(f) {
return function getRequest(data, match, end, ask) {
- // Cache management - no cache, so it won't be cached by GitHub's CDN.
- ask.res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
+ if (data.maxAge !== undefined && /^[0-9]+$/.test(data.maxAge)) {
+ var maxAge = +data.maxAge;
+ } else {
+ // Cache management - no cache, so it won't be cached by GitHub's CDN.
+ ask.res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
+ }
var reqTime = new Date();
var date = (reqTime).toGMTString();
ask.res.setHeader('Expires', date); // Proxies, GitHub, see #221.
@@ -269,6 +273,10 @@ function cache(f) {
};
requestCache.set(cacheIndex, updatedCache);
if (!cachedVersionSent) {
+ // Set the cache interval if specified.
+ if (maxAge !== undefined) {
+ ask.res.setHeader('Cache-Control', 'max-age=' + maxAge);
+ }
badge(badgeData, makeSend(format, ask.res, end));
}
}, cachedRequest);
@@ -5070,13 +5078,9 @@ function(data, match, end, ask) {
incrMonthlyAnalytics(analytics.rawFlatSquareMonthly);
}
- if (ask.req.headers['cache-control']) {
- ask.res.setHeader('Cache-Control', ask.req.headers['cache-control']);
- } else {
- // Cache management - the badge is constant.
- var cacheDuration = (3600*24*1)|0; // 1 day.
- ask.res.setHeader('Cache-Control', 'public, max-age=' + cacheDuration);
- }
+ // Cache management - the badge is constant.
+ var cacheDuration = (3600*24*1)|0; // 1 day.
+ ask.res.setHeader('Cache-Control', 'max-age=' + cacheDuration);
if (+(new Date(ask.req.headers['if-modified-since'])) >= +serverStartTime) {
ask.res.statusCode = 304;
ask.res.end(); // not modified.
@@ -5115,7 +5119,7 @@ function(data, match, end, ask) {
// Cache management - the badge is constant.
var cacheDuration = (3600*24*1)|0; // 1 day.
- ask.res.setHeader('Cache-Control', 'public, max-age=' + cacheDuration);
+ ask.res.setHeader('Cache-Control', 'max-age=' + cacheDuration);
if (+(new Date(ask.req.headers['if-modified-since'])) >= +serverStartTime) {
ask.res.statusCode = 304;
ask.res.end(); // not modified.
@@ -5160,6 +5164,7 @@ function getLabel(label, data) {
}
// data (URL query) can include `label`, `style`, `logo`, `logoWidth`, `link`.
+// It can also include `maxAge`.
function getBadgeData(defaultLabel, data) {
var label = getLabel(defaultLabel, data);
var template = data.style || 'default';
From 89affa49fec5685ab857ddf9e17fcd04ce24a2d3 Mon Sep 17 00:00:00 2001
From: Thaddee Tyl
Date: Sun, 10 Apr 2016 13:43:00 +0200
Subject: [PATCH 119/207] website: use heavy HTTP caching
This will hopefully help a bit for #633.
---
Makefile | 2 +-
index.html | 410 ++++++++++++++++++++++++++++-------------------------
2 files changed, 216 insertions(+), 196 deletions(-)
diff --git a/Makefile b/Makefile
index c2abbce..49b2358 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@ favicon:
node gh-badge.js '' '' '#bada55' .png > favicon.png
website:
- cat try.html | sed "s,\( ,&https://img.shields.io," \
| sed "s,var origin = '';,var origin = 'https://img.shields.io';," \
| sed "s,