* Add [Docker] image size badge * Add [Docker] version/tag badge * [Docker] allow version badge to retrieve results from multiple pages * [Docker] allow size badge to retrieve results from multiple pages * [Docker] clean up size and version badges before squash * [Docker] Size badge change API call to explicit tag * [Docker] Conditionally include tag route param for badges * [Docker] Implement feedback for size and version badges * [Docker] Implement feedback round 2 for size and version badges * [Docker] Optimise API lookups and remove date sorting on tag badge * [Docker] Implement feedback round 3 for version badge * [Docker] Implement feedback round 4 for version badge * [Docker] Adjust unit and service tests for version badge * [Docker] Move unit test data into fixtures * [Docker] Fix Docker version badge route prefix * [Docker] Add date and semver lookup for size badge * [Docker] Implement feedback round 5 for version badge * [Docker] Implement feedback round 6 * [Docker] Tweak error messaging for consistent wording * [Docker] Adjust badge titles * [Docker] Guard and treat images with missing digest * [Docker] Guard and treat images with missing digest
65 lines
1.5 KiB
JavaScript
65 lines
1.5 KiB
JavaScript
'use strict'
|
|
|
|
const dockerBlue = '066da5' // see https://github.com/badges/shields/pull/1690
|
|
const { NotFound } = require('..')
|
|
|
|
function buildDockerUrl(badgeName, includeTagRoute) {
|
|
if (includeTagRoute) {
|
|
return {
|
|
base: `docker/${badgeName}`,
|
|
pattern: ':user/:repo/:tag*',
|
|
}
|
|
} else {
|
|
return {
|
|
base: `docker/${badgeName}`,
|
|
pattern: ':user/:repo',
|
|
}
|
|
}
|
|
}
|
|
|
|
function getDockerHubUser(user) {
|
|
return user === '_' ? 'library' : user
|
|
}
|
|
|
|
async function getMultiPageData({ user, repo, fetch }) {
|
|
const data = await fetch({ user, repo })
|
|
|
|
if (data.count === 0) {
|
|
throw new NotFound({ prettyMessage: 'repository not found' })
|
|
}
|
|
|
|
const numberOfPages = Math.ceil(data.count / 100) // Maximum of 100 results can be returned per page
|
|
|
|
if (numberOfPages === 1) {
|
|
return data.results
|
|
}
|
|
|
|
const pageData = await Promise.all(
|
|
[...Array(numberOfPages - 1).keys()].map((_, i) =>
|
|
fetch({ user, repo, page: ++i + 1 })
|
|
)
|
|
)
|
|
return [...data.results].concat(...pageData.map(p => p.results))
|
|
}
|
|
|
|
function getDigestSemVerMatches({ data, digest }) {
|
|
const matches = data
|
|
.filter(d => d.images.some(i => i.digest === digest))
|
|
.map(d => d.name)
|
|
let version = matches[0]
|
|
matches.forEach(name => {
|
|
const dots = (name.match(/\./g) || []).length
|
|
const olddots = (version.match(/\./g) || []).length
|
|
version = dots >= olddots && name !== 'latest' ? name : version
|
|
})
|
|
return version
|
|
}
|
|
|
|
module.exports = {
|
|
dockerBlue,
|
|
buildDockerUrl,
|
|
getDockerHubUser,
|
|
getMultiPageData,
|
|
getDigestSemVerMatches,
|
|
}
|