diff --git a/index.html b/index.html index 079c279..f821045 100644 --- a/index.html +++ b/index.html @@ -695,18 +695,46 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/wheelmap/a/2323004600.svg - GitHub issues: + GitHub issues: https://img.shields.io/github/issues/badges/shields.svg - + https://img.shields.io/github/issues-raw/badges/shields.svg - label: + GitHub closed issues: + + https://img.shields.io/github/issues-closed/badges/shields.svg + + + + https://img.shields.io/github/issues-closed-raw/badges/shields.svg + + label: https://img.shields.io/github/issues-raw/badges/shields/website.svg + GitHub pull requests: + + https://img.shields.io/github/issues-pr/cdnjs/cdnjs.svg + + + + https://img.shields.io/github/issues-pr-raw/cdnjs/cdnjs.svg + + GitHub closed pull requests: + + https://img.shields.io/github/issues-pr-closed/cdnjs/cdnjs.svg + + + + https://img.shields.io/github/issues-pr-closed-raw/cdnjs/cdnjs.svg + + GitHub contributors: + + https://img.shields.io/github/contributors/cdnjs/cdnjs.svg + license: https://img.shields.io/github/license/mashape/apistatus.svg diff --git a/server.js b/server.js index 7d82ded..2d00e47 100644 --- a/server.js +++ b/server.js @@ -2832,6 +2832,35 @@ cache(function(data, match, sendBadge, request) { }); })); +// GitHub contributors integration. +camp.route(/^\/github\/contributors(-anon)?\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var isAnon = match[1]; + var user = match[2]; // eg, qubyte/rubidium + var repo = match[3]; + var format = match[4]; + var apiUrl = 'https://api.github.com/repos/' + user + '/' + repo + '/contributors?page=1&per_page=1&anon=' + (0+isAnon); + var badgeData = getBadgeData('contributors', data); + if (badgeData.template === 'social') { + badgeData.logo = badgeData.logo || logos.github; + } + githubAuth.request(request, apiUrl, {}, 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[0].contributions); + badgeData.colorscheme = 'blue'; + } catch(e) { + badgeData.text[1] = 'inaccessible'; + } + sendBadge(format, badgeData); + }); +})); + // GitHub release integration. camp.route(/^\/github\/release\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { @@ -2966,23 +2995,26 @@ cache(function(data, match, sendBadge, request) { })); // GitHub issues integration. -camp.route(/^\/github\/issues(-raw)?\/([^\/]+)\/([^\/]+)\/?([^\/]+)?\.(svg|png|gif|jpg|json)$/, +camp.route(/^\/github\/issues(-pr)?(-closed)?(-raw)?\/([^\/]+)\/([^\/]+)\/?([^\/]+)?\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { - var isRaw = !!match[1]; - var user = match[2]; // eg, badges - var repo = match[3]; // eg, shields - var ghLabel = match[4]; // eg, website - var format = match[5]; - var apiUrl = 'https://api.github.com/repos/' + user + '/' + repo; + var isPR = !!match[1]; + var isClosed = !!match[2]; + var isRaw = !!match[3]; + var user = match[4]; // eg, badges + var repo = match[5]; // eg, shields + var ghLabel = match[6]; // eg, website + var format = match[7]; + var apiUrl = 'https://api.github.com/' + (isPR ? 'search/issues?q=is:pr+is:' + (isClosed ? 'closed' : 'open') + '+' : 'repos/') + user + '/' + repo; var issuesApi = false; // Are we using the issues API instead of the repo one? var query = {}; - if (ghLabel !== undefined) { + if (!isPR && ghLabel !== undefined) { apiUrl += '/issues'; + apiUrl += (isClosed ? '?state=closed' : ''); query.labels = ghLabel; issuesApi = true; } - var badgeData = getBadgeData('issues', data); + var badgeData = getBadgeData( (isClosed ? 'closed ' : '' ) + (isPR ? 'pull requests' : 'issues'), data); if (badgeData.template === 'social') { badgeData.logo = badgeData.logo || logos.github; } @@ -2995,14 +3027,18 @@ cache(function(data, match, sendBadge, request) { try { var data = JSON.parse(buffer); var modifier = ''; - if (issuesApi) { - var issues = data.length; - if (res.headers['link'] && - res.headers['link'].indexOf('rel="last"') >= 0) { modifier = '+'; } + if (isPR) { + issues = data.total_count; } else { - var issues = data.open_issues_count; + if (issuesApi) { + var issues = data.length; + if (res.headers['link'] && + res.headers['link'].indexOf('rel="last"') >= 0) { modifier = '+'; } + } else { + var issues = data.open_issues_count; + } } - badgeData.text[1] = issues + modifier + (isRaw? '': ' open'); + badgeData.text[1] = metric(issues + modifier + (isRaw? '': (isClosed ? ' closed' : ' open'))); badgeData.colorscheme = issues ? 'yellow' : 'brightgreen'; sendBadge(format, badgeData); } catch(e) { diff --git a/try.html b/try.html index 737890c..be6ea96 100644 --- a/try.html +++ b/try.html @@ -694,18 +694,46 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/wheelmap/a/2323004600.svg - GitHub issues: + GitHub issues: https://img.shields.io/github/issues/badges/shields.svg - + https://img.shields.io/github/issues-raw/badges/shields.svg - label: + GitHub closed issues: + + https://img.shields.io/github/issues-closed/badges/shields.svg + + + + https://img.shields.io/github/issues-closed-raw/badges/shields.svg + + label: https://img.shields.io/github/issues-raw/badges/shields/website.svg + GitHub pull requests: + + https://img.shields.io/github/issues-pr/cdnjs/cdnjs.svg + + + + https://img.shields.io/github/issues-pr-raw/cdnjs/cdnjs.svg + + GitHub closed pull requests: + + https://img.shields.io/github/issues-pr-closed/cdnjs/cdnjs.svg + + + + https://img.shields.io/github/issues-pr-closed-raw/cdnjs/cdnjs.svg + + GitHub contributors: + + https://img.shields.io/github/contributors/cdnjs/cdnjs.svg + license: https://img.shields.io/github/license/mashape/apistatus.svg