diff --git a/frontend/components/suggestion-and-search.js b/frontend/components/suggestion-and-search.js index 9fdaba0059..c0b42a33fd 100644 --- a/frontend/components/suggestion-and-search.js +++ b/frontend/components/suggestion-and-search.js @@ -38,21 +38,23 @@ export default class SuggestionAndSearch extends React.Component { } getSuggestions() { - this.setState({ inProgress: true }, () => { + this.setState({ inProgress: true }, async () => { const { baseUrl } = this.props const { projectUrl } = this.state const url = resolveUrl('/$suggest/v1', baseUrl, { url: projectUrl }) const fetch = window.fetch || fetchPonyfill - fetch(url) - .then(res => res.json()) - .then(json => { - this.setState({ inProgress: false, suggestions: json.badges }) - }) - .catch(() => { - this.setState({ inProgress: false, suggestions: [] }) - }) + const res = await fetch(url) + let suggestions + try { + const json = await res.json() + suggestions = json.badges + } catch (e) { + suggestions = [] + } + + this.setState({ inProgress: false, suggestions }) }) } diff --git a/lib/php-version.js b/lib/php-version.js index eaaf1f28ab..534a1ec6d6 100644 --- a/lib/php-version.js +++ b/lib/php-version.js @@ -5,6 +5,7 @@ */ 'use strict' +const { promisify } = require('util') const request = require('request') const uniq = require('lodash.uniq') const { listCompare } = require('./version') @@ -216,26 +217,23 @@ function versionReduction(versions, phpReleases) { return versions.join(', ') } -function getPhpReleases(githubApiProvider, cb) { - regularUpdate( - { - url: '/repos/php/php-src/git/refs/tags', - intervalMillis: 24 * 3600 * 1000, // 1 day - scraper: tags => - uniq( - tags - // only releases - .filter( - tag => tag.ref.match(/^refs\/tags\/php-\d+\.\d+\.\d+$/) != null - ) - // get minor version of release - .map(tag => tag.ref.match(/^refs\/tags\/php-(\d+\.\d+)\.\d+$/)[1]) - ), - request: (url, options, cb) => - githubApiProvider.request(request, url, {}, cb), - }, - cb - ) +function getPhpReleases(githubApiProvider) { + return promisify(regularUpdate)({ + url: '/repos/php/php-src/git/refs/tags', + intervalMillis: 24 * 3600 * 1000, // 1 day + scraper: tags => + uniq( + tags + // only releases + .filter( + tag => tag.ref.match(/^refs\/tags\/php-\d+\.\d+\.\d+$/) != null + ) + // get minor version of release + .map(tag => tag.ref.match(/^refs\/tags\/php-(\d+\.\d+)\.\d+$/)[1]) + ), + request: (url, options, cb) => + githubApiProvider.request(request, url, {}, cb), + }) } module.exports = { diff --git a/lib/regular-update.js b/lib/regular-update.js index 54651d1ec2..1c359d90e3 100644 --- a/lib/regular-update.js +++ b/lib/regular-update.js @@ -6,6 +6,23 @@ let regularUpdateCache = Object.create(null) // url: a string, scraper: a function that takes string data at that URL. // interval: number in milliseconds. // cb: a callback function that takes an error and data returned by the scraper. +// +// To use this from a service: +// +// const { promisify } = require('util') +// const { regularUpdate } = require('../../lib/regular-update') +// +// function getThing() { +// return promisify(regularUpdate)({ +// url: ..., +// ... +// }) +// } +// +// in handle(): +// +// const thing = await getThing() + function regularUpdate( { url, diff --git a/lib/svg-to-img.js b/lib/svg-to-img.js index 979272d457..61c04b616e 100644 --- a/lib/svg-to-img.js +++ b/lib/svg-to-img.js @@ -1,5 +1,6 @@ 'use strict' +const { promisify } = require('util') const gm = require('gm') const LruCache = require('./lru-cache') @@ -8,32 +9,27 @@ const imageMagick = gm.subClass({ imageMagick: true }) // The following is an arbitrary limit (~1.5MB, 1.5kB/image). const imgCache = new LruCache(1000) -function svgToImg(svg, format) { - return new Promise((resolve, reject) => { - const cacheIndex = format + svg - if (imgCache.has(cacheIndex)) { - // We own a cache for this svg conversion. - const result = imgCache.get(cacheIndex) - resolve(result) - return - } +async function svgToImg(svg, format) { + const cacheIndex = `${format}${svg}` - const buf = Buffer.from( - '' + svg - ) - imageMagick(buf, 'image.' + format) - .density(90) - .background(format === 'jpg' ? '#FFFFFF' : 'none') - .flatten() - .toBuffer(format, (err, data) => { - if (err) { - reject(err) - } else { - imgCache.set(cacheIndex, data) - resolve(data) - } - }) - }) + if (imgCache.has(cacheIndex)) { + return imgCache.get(cacheIndex) + } + + const svgBuffer = Buffer.from( + `${svg}` + ) + + const chain = imageMagick(svgBuffer, `image.${format}`) + .density(90) + .background(format === 'jpg' ? '#FFFFFF' : 'none') + .flatten() + const toBuffer = chain.toBuffer.bind(chain) + + const data = await promisify(toBuffer)(format) + + imgCache.set(cacheIndex, data) + return data } module.exports = svgToImg diff --git a/services/php-eye/php-eye-php-version.service.js b/services/php-eye/php-eye-php-version.service.js index 8776a68338..4b02abeb97 100644 --- a/services/php-eye/php-eye-php-version.service.js +++ b/services/php-eye/php-eye-php-version.service.js @@ -21,68 +21,68 @@ module.exports = class PhpEyePhpVersion extends LegacyService { uri: 'https://php-eye.com/api/v1/package/' + userRepo + '.json', } const badgeData = getBadgeData('php tested', data) - getPhpReleases(githubApiProvider, (err, phpReleases) => { - if (err != null) { - badgeData.text[1] = 'invalid' - sendBadge(format, badgeData) - return - } - request(options, (err, res, buffer) => { - if (err !== null) { - log.error('PHP-Eye error: ' + err.stack) - if (res) { - log.error('' + res) - } - badgeData.text[1] = 'invalid' - sendBadge(format, badgeData) - return - } - - try { - const data = JSON.parse(buffer) - const travis = data.versions.filter( - release => release.name === version - )[0].travis - - if (!travis.config_exists) { - badgeData.colorscheme = 'red' - badgeData.text[1] = 'not tested' + getPhpReleases(githubApiProvider) + .then(phpReleases => { + request(options, (err, res, buffer) => { + if (err !== null) { + log.error('PHP-Eye error: ' + err.stack) + if (res) { + log.error('' + res) + } + badgeData.text[1] = 'invalid' sendBadge(format, badgeData) return } - const versions = [] - for (const index in travis.runtime_status) { - if ( - travis.runtime_status[index] === 3 && - index.match(/^php\d\d$/) !== null - ) { - versions.push(index.replace(/^php(\d)(\d)$/, '$1.$2')) + try { + const data = JSON.parse(buffer) + const travis = data.versions.filter( + release => release.name === version + )[0].travis + + if (!travis.config_exists) { + badgeData.colorscheme = 'red' + badgeData.text[1] = 'not tested' + sendBadge(format, badgeData) + return } - } - let reduction = phpVersionReduction(versions, phpReleases) + const versions = [] + for (const index in travis.runtime_status) { + if ( + travis.runtime_status[index] === 3 && + index.match(/^php\d\d$/) !== null + ) { + versions.push(index.replace(/^php(\d)(\d)$/, '$1.$2')) + } + } - if (travis.runtime_status.hhvm === 3) { - reduction += reduction ? ', ' : '' - reduction += 'HHVM' - } + let reduction = phpVersionReduction(versions, phpReleases) - if (reduction) { - badgeData.colorscheme = 'brightgreen' - badgeData.text[1] = reduction - } else if (!versions.length) { - badgeData.colorscheme = 'red' - badgeData.text[1] = 'not tested' - } else { + if (travis.runtime_status.hhvm === 3) { + reduction += reduction ? ', ' : '' + reduction += 'HHVM' + } + + if (reduction) { + badgeData.colorscheme = 'brightgreen' + badgeData.text[1] = reduction + } else if (!versions.length) { + badgeData.colorscheme = 'red' + badgeData.text[1] = 'not tested' + } else { + badgeData.text[1] = 'invalid' + } + } catch (e) { badgeData.text[1] = 'invalid' } - } catch (e) { - badgeData.text[1] = 'invalid' - } + sendBadge(format, badgeData) + }) + }) + .catch(() => { + badgeData.text[1] = 'invalid' sendBadge(format, badgeData) }) - }) }) ) } diff --git a/services/travis/travis-php-version.service.js b/services/travis/travis-php-version.service.js index 51542848c2..2468ca93b7 100644 --- a/services/travis/travis-php-version.service.js +++ b/services/travis/travis-php-version.service.js @@ -22,63 +22,63 @@ module.exports = class TravisPhpVersion extends LegacyService { uri: `https://api.travis-ci.org/repos/${userRepo}/branches/${version}`, } const badgeData = getBadgeData('php', data) - getPhpReleases(githubApiProvider, (err, phpReleases) => { - if (err != null) { - badgeData.text[1] = 'invalid' - sendBadge(format, badgeData) - return - } - request(options, (err, res, buffer) => { - if (err !== null) { - log.error(`Travis CI error: ${err.stack}`) - if (res) { - log.error('' + res) - } - badgeData.text[1] = 'invalid' - sendBadge(format, badgeData) - return - } - - try { - const data = JSON.parse(buffer) - let travisVersions = [] - - // from php - if (typeof data.branch.config.php !== 'undefined') { - travisVersions = travisVersions.concat( - data.branch.config.php.map(v => v.toString()) - ) - } - // from matrix - if (typeof data.branch.config.matrix.include !== 'undefined') { - travisVersions = travisVersions.concat( - data.branch.config.matrix.include.map(v => v.php.toString()) - ) + getPhpReleases(githubApiProvider) + .then(phpReleases => { + request(options, (err, res, buffer) => { + if (err !== null) { + log.error(`Travis CI error: ${err.stack}`) + if (res) { + log.error('' + res) + } + badgeData.text[1] = 'invalid' + sendBadge(format, badgeData) + return } - const hasHhvm = travisVersions.find(v => v.startsWith('hhvm')) - const versions = travisVersions - .map(v => phpMinorVersion(v)) - .filter(v => v.indexOf('.') !== -1) - let reduction = phpVersionReduction(versions, phpReleases) + try { + const data = JSON.parse(buffer) + let travisVersions = [] - if (hasHhvm) { - reduction += reduction ? ', ' : '' - reduction += 'HHVM' - } + // from php + if (typeof data.branch.config.php !== 'undefined') { + travisVersions = travisVersions.concat( + data.branch.config.php.map(v => v.toString()) + ) + } + // from matrix + if (typeof data.branch.config.matrix.include !== 'undefined') { + travisVersions = travisVersions.concat( + data.branch.config.matrix.include.map(v => v.php.toString()) + ) + } - if (reduction) { - badgeData.colorscheme = 'blue' - badgeData.text[1] = reduction - } else { + const hasHhvm = travisVersions.find(v => v.startsWith('hhvm')) + const versions = travisVersions + .map(v => phpMinorVersion(v)) + .filter(v => v.indexOf('.') !== -1) + let reduction = phpVersionReduction(versions, phpReleases) + + if (hasHhvm) { + reduction += reduction ? ', ' : '' + reduction += 'HHVM' + } + + if (reduction) { + badgeData.colorscheme = 'blue' + badgeData.text[1] = reduction + } else { + badgeData.text[1] = 'invalid' + } + } catch (e) { badgeData.text[1] = 'invalid' } - } catch (e) { - badgeData.text[1] = 'invalid' - } + sendBadge(format, badgeData) + }) + }) + .catch(() => { + badgeData.text[1] = 'invalid' sendBadge(format, badgeData) }) - }) }) ) }