opentelemetry.io/scripts/fetchMilestones.js

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();