diff --git a/scripts/software-github.mjs b/scripts/software-github.mjs new file mode 100644 index 00000000..cd95a1a1 --- /dev/null +++ b/scripts/software-github.mjs @@ -0,0 +1,94 @@ +#!/usr/bin/env zx +const https = require('https'); +const url = require('url'); + +let definitions, softwarePackages + +async function getSoftwareDefinitions() { + try { + return YAML.parse(fs.readFileSync(`${os.homedir()}/.local/share/chezmoi/software.yml`, 'utf8')) + } catch (e) { + throw Error('Failed to load software definitions', e) + } +} + +async function writeSoftwareDefinitions() { + try { + fs.writeFileSync(`${os.homedir()}/.local/share/chezmoi/software.yml`, YAML.stringify(definitions)) + console.log('Wrote additional data to software.yml') + } catch (e) { + throw Error('Failed to write new software definitions file', e) + } +} + +// Function to get the number of stars for a GitHub repository +function getRepoStars(repoUrl, token) { + return new Promise((resolve, reject) => { + const { pathname } = url.parse(repoUrl); + const [, owner, repo] = pathname.split('/'); + + const options = { + hostname: 'api.github.com', + path: `/repos/${owner}/${repo}`, + method: 'GET', + headers: { + 'User-Agent': 'nodejs', // GitHub API requires a User-Agent header + 'Accept': 'application/vnd.github.v3+json', // Specify JSON format for response + 'Authorization': `token ${token}` // Include token in Authorization header + } + }; + + const req = https.request(options, (res) => { + let data = ''; + + // A chunk of data has been received. + res.on('data', (chunk) => { + data += chunk; + }); + + // The whole response has been received. + res.on('end', () => { + if (res.statusCode === 200) { + const repoInfo = JSON.parse(data); + resolve(repoInfo.stargazers_count); + } else { + reject(`Failed to get stars. Status code: ${res.statusCode}`); + } + }); + }); + + // Handle error events + req.on('error', (error) => { + reject(`Error: ${error.message}`); + }); + + req.end(); + }); +} + +async function populateMissing() { + definitions = await getSoftwareDefinitions() + softwarePackages = definitions.softwarePackages + for (const pkg in softwarePackages) { + if (softwarePackages[pkg]._github) { + try { + softwarePackages[pkg]._stars = await getRepoStars(softwarePackages[pkg]._github, process.env.GITHUB_TOKEN) + } catch(e) { + console.log(`Failed to process ${softwarePackages[pkg]._github}`) + } + } else if (softwarePackages[pkg]._stars === false) { + console.log('No GitHub repository for ' + pkg) + } else { + console.log('***** MISSING GITHUB REPOSITORY INFORMATION FOR ' + pkg + ' *****') + } + } + definitions.softwarePackages = softwarePackages +} + +async function main() { + await populateMissing() + await writeSoftwareDefinitions() +} + +console.log('Running script..') +main() \ No newline at end of file