Files
strom/data/minecraft-data/.github/helper-bot/handleMcpcGeneratedArtifacts.js
T
2026-03-22 19:49:37 +01:00

114 lines
4.2 KiB
JavaScript

const fs = require('fs')
const github = require('gh-helpers')()
const { join } = require('path')
const { extractPcEntityMetadata } = require('../../tools/js/extractPcEntityMetadata')
const { exec, createInitialPR } = require('./utils')
const artifactsDir = join(__dirname, './artifacts')
const root = join(__dirname, '..', '..')
async function handle (ourPR, genPullNo, version, artifactURL, shouldPull) {
const branchNameVersion = version.replace(/[^a-zA-Z0-9]/g, '_').toLowerCase()
const branch = ourPR.headBranch || `pc-${branchNameVersion}`
if (shouldPull) exec('git', ['pull', 'origin'])
// if external PR:
// const branch = ourPR.headBranch
// exec('git', ['remote', 'add', 'fo', ourPR.headCloneURL])
// exec('git', ['fetch', 'fo', branch])
// exec('git', ['checkout', '-b', branch, `fo/` + branch])
try {
exec('git', ['checkout', branch])
} catch (err) {
console.error('Error checking out branch:', err)
process.exit(1)
}
const dataPaths = require('../../data/dataPaths.json')
const dataPath = dataPaths.pc[version]
const destDir = join(root, `./data/pc/${version}`)
if (!fs.existsSync(destDir) || !dataPath) {
console.warn(`⚠️ Version ${version} not found (checked ${destDir}) ; cannot continue.`, fs.existsSync(destDir), dataPath)
process.exit(1)
}
if (ourPR.body) {
await github.updateIssue(ourPR.number, {
body: ourPR.body.replace('<!--minecraft-data-generator-placeholder-->', `- https://github.com/PrismarineJS/minecraft-data-generator/pull/${genPullNo}`)
})
}
console.log('Handling PR:', ourPR)
fs.mkdirSync(artifactsDir, { recursive: true })
// https://github.com/PrismarineJS/minecraft-data-generator/actions/runs/17261281146/artifacts/3861320839
const s = artifactURL.split('github.com/')[1]
const [ownerName, repoName, _actions, _runs, _runId, _artifacts, artifactId] = s.split('/') // eslint-disable-line
console.log('Downloading artifacts', { ownerName, repoName, artifactId, artifactsDir })
await github.artifacts.downloadIdFrom(ownerName, repoName, artifactId, artifactsDir)
console.log(fs.readdirSync(artifactsDir))
// Now copy artifacts/${version}/*.json to data/pc/$version/*.json
const versionArtifactsDir = join(artifactsDir, version)
for (const file of fs.readdirSync(versionArtifactsDir)) {
if (file.endsWith('.json')) {
const src = join(versionArtifactsDir, file)
const dest = join(destDir, file)
fs.mkdirSync(destDir, { recursive: true })
console.log(`copy ${src} => ${dest}`)
fs.copyFileSync(src, dest)
dataPath[file.replace('.json', '')] = 'pc/' + version
}
}
// Commit the new dataPath
fs.writeFileSync(join(root, 'data', 'dataPaths.json'), JSON.stringify(dataPaths, null, 2))
try {
process.chdir(join(__dirname, '../../tools/js'))
extractPcEntityMetadata(version, version, { write: true, cloneIfMissing: true })
} catch (e) {
console.log('Failed to extract PC entity metadata', e)
}
// Now, we need to commit the changes
exec('git', ['config', 'user.name', 'github-actions[bot]'])
exec('git', ['config', 'user.email', '41898282+github-actions[bot]@users.noreply.github.com'])
exec('git', ['add', '--all'])
exec('git', ['commit', '-m', `[Auto] Apply generated data from PrismarineJS/minecraft-data-generator#${genPullNo}`])
exec('git', ['push', 'origin', branch])
}
async function main (versions, genPullNo, artifactUrl, createPR) {
const version = versions.at(-1)
const pr = await github.findPullRequest({ titleIncludes: '🎈', author: null })
console.log('Found PR', pr)
if (pr && pr.isOpen) {
const details = await github.getPullRequest(pr.id)
console.log('PR', details)
await handle(details, genPullNo, version, artifactUrl, true)
} else if (createPR) {
const pr = await createInitialPR('pc', '(This issue was created for a minecraft-data-generator PR)', {
version,
protocolVersion: null
})
console.log('Created PR', pr)
const details = await github.getPullRequest(pr.number)
console.log('PR', details)
await handle(details, genPullNo, version, artifactUrl, false)
} else {
process.exit(1)
}
}
main(
JSON.parse(process.env.TRIGGER_MC_VERSIONS),
process.env.TRIGGER_PR_NO,
process.env.TRIGGER_ARTIFACT_URL,
process.env.CREATE_PR_IF_NONE
)