Files
shields/services/github/github-commits-since.service.js
2018-12-18 20:52:17 +00:00

124 lines
3.5 KiB
JavaScript

'use strict'
const LegacyService = require('../legacy-service')
const {
makeBadgeData: getBadgeData,
makeLabel: getLabel,
makeLogo: getLogo,
} = require('../../lib/badge-data')
const { documentation } = require('./github-helpers')
const keywords = ['GitHub', 'commit']
// This legacy service should be rewritten to use e.g. BaseJsonService.
//
// Tips for rewriting:
// https://github.com/badges/shields/blob/master/doc/rewriting-services.md
//
// Do not base new services on this code.
module.exports = class GithubCommitsSince extends LegacyService {
static get category() {
return 'activity'
}
static get route() {
return {
base: 'github/commits-since',
pattern: ':user/:repo/:version',
}
}
static get examples() {
return [
{
title: 'GitHub commits',
namedParams: {
user: 'SubtitleEdit',
repo: 'subtitleedit',
version: '3.4.7',
},
staticPreview: {
label: 'commits since 3.4.7',
message: '4225',
color: 'blue',
},
keywords,
documentation,
},
{
title: 'GitHub commits (since latest release)',
namedParams: {
user: 'SubtitleEdit',
repo: 'subtitleedit',
version: 'latest',
},
staticPreview: {
label: 'commits since 3.5.7',
message: '157',
color: 'blue',
},
keywords,
documentation,
},
]
}
static registerLegacyRouteHandler({ camp, cache, githubApiProvider }) {
camp.route(
/^\/github\/commits-since\/([^/]+)\/([^/]+)\/([^/]+)\.(svg|png|gif|jpg|json)$/,
cache((data, match, sendBadge, request) => {
const user = match[1] // eg, SubtitleEdit
const repo = match[2] // eg, subtitleedit
const version = match[3] // eg, 3.4.7 or latest
const format = match[4]
const badgeData = getBadgeData(`commits since ${version}`, data)
function setCommitsSinceBadge(user, repo, version) {
const apiUrl = `/repos/${user}/${repo}/compare/${version}...master`
if (badgeData.template === 'social') {
badgeData.logo = getLogo('github', data)
}
githubApiProvider.request(request, apiUrl, {}, (err, res, buffer) => {
if (err != null) {
badgeData.text[1] = 'inaccessible'
sendBadge(format, badgeData)
return
}
try {
const result = JSON.parse(buffer)
badgeData.text[1] = result.ahead_by
badgeData.colorscheme = 'blue'
badgeData.text[0] = getLabel(`commits since ${version}`, data)
sendBadge(format, badgeData)
} catch (e) {
badgeData.text[1] = 'invalid'
sendBadge(format, badgeData)
}
})
}
if (version === 'latest') {
const url = `/repos/${user}/${repo}/releases/latest`
githubApiProvider.request(request, url, {}, (err, res, buffer) => {
if (err != null) {
badgeData.text[1] = 'inaccessible'
sendBadge(format, badgeData)
return
}
try {
const data = JSON.parse(buffer)
setCommitsSinceBadge(user, repo, data.tag_name)
} catch (e) {
badgeData.text[1] = 'invalid'
sendBadge(format, badgeData)
}
})
} else {
setCommitsSinceBadge(user, repo, version)
}
})
)
}
}