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 + + + + @@ -352,6 +356,22 @@ 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 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

- - - + + + + + + + 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 @@

- Gratipay 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 + + + + 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 + + + + + + + + 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 - - + + - - + + 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 - +
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: 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 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.svghttps://img.shields.io/codeship/d6c1ddd0-16a3-0132-5f85-2e35c05e22b1/master.svg
Magnum CI: https://img.shields.io/magnumci/96ffb83fa700f069024921b0702e76ff.svghttps://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: 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 +

+ + @@ -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 +

+ + @@ -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.