100 lines
2.9 KiB
JavaScript
100 lines
2.9 KiB
JavaScript
import fs from 'fs'
|
|
import YAML from 'yaml'
|
|
import fetch from 'node-fetch'
|
|
const token = process.env.GH_TOKEN
|
|
const file = fs.readFileSync('./data/progress_source.yaml', 'utf8')
|
|
const sourceFileData = YAML.parse(file)
|
|
|
|
const versions = sourceFileData.columns.map(x => x.label)
|
|
const labelData = sourceFileData.data
|
|
|
|
function checkIfMilestoneMatchesVersion(version, milestone) {
|
|
if (milestone.title && milestone.title.toLowerCase().includes(version)) {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
function updateDataWithMilestoneInfo(data, milestoneLabel, milestone) {
|
|
data.msLabel = milestoneLabel
|
|
data.openIssues = milestone.open_issues
|
|
data.closedIssues = milestone.closed_issues
|
|
if (data.openIssues + data.closedIssues === 0) {
|
|
data.totalIssues = 0
|
|
} else {
|
|
data.totalIssues = (data.openIssues + data.closedIssues).toFixed(1)
|
|
}
|
|
}
|
|
|
|
async function fetchMilestoneDataForData(data) {
|
|
const baseUrl = parseBaseUrl(data.sourceUrl)
|
|
const apiUrl = `https://api.github.com/repos/open-telemetry/${baseUrl}/milestones`
|
|
const response = await fetch(apiUrl, { headers: { 'Authorization': `token ${token}` }})
|
|
const resJson = await response.json()
|
|
return resJson
|
|
}
|
|
|
|
async function fetchReleaseDataForData(data) {
|
|
const baseUrl = parseBaseUrl(data.sourceUrl)
|
|
const releaseUrl = `https://api.github.com/repos/open-telemetry/${baseUrl}/releases`
|
|
const response = await fetch(releaseUrl, { headers: { 'Authorization': `token ${token}` }})
|
|
const resJson = await response.json()
|
|
const sortedResponse = resJson.sort((a, b) => b.published_at - a.published_at)
|
|
return sortedResponse[0]
|
|
}
|
|
|
|
function parseBaseUrl(url) {
|
|
const urlTokens = url.split('/')
|
|
return urlTokens.pop()
|
|
}
|
|
|
|
function findMilestone(data, milestones) {
|
|
for (const version of versions) {
|
|
let found = false
|
|
for (let ms of milestones) {
|
|
if (checkIfMilestoneMatchesVersion(version, ms)) {
|
|
updateDataWithMilestoneInfo(data, version, ms)
|
|
found = true
|
|
break;
|
|
}
|
|
}
|
|
if (found) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function updateReleaseData(data, release) {
|
|
if (release) {
|
|
data.releaseName = release.name
|
|
data.releaseDescription = release.body
|
|
data.releaseUrl = release.html_url
|
|
}
|
|
}
|
|
|
|
async function main() {
|
|
if (token === undefined || token.length === 0)
|
|
{
|
|
console.error("please set GH_TOKEN, exiting")
|
|
process.exit(1)
|
|
}
|
|
|
|
for (const datum of labelData) {
|
|
await fetchMilestoneDataForData(datum)
|
|
.then(msData => findMilestone(datum, msData))
|
|
.catch(err => console.error(`failed to fetch milestone for ${datum.label}`, err))
|
|
}
|
|
|
|
for (const datum of labelData) {
|
|
await fetchReleaseDataForData(datum)
|
|
.then(rData => updateReleaseData(datum, rData))
|
|
.catch(err => console.error(`failed to fetch release for ${datum.label}`, err))
|
|
}
|
|
|
|
const finalYaml = YAML.stringify(sourceFileData)
|
|
fs.writeFileSync('./data/progress_generated.yaml', finalYaml)
|
|
}
|
|
|
|
main();
|