Unciv/.github/workflows/mergeTranslations.js
2022-03-09 18:37:15 +02:00

129 lines
3.7 KiB
JavaScript

const { Octokit } = require("@octokit/rest");
const { version } = require("os");
const internal = require("stream");
const fs = require("fs");
const { argv } = require("process");
// To be run from the main Unciv repo directory
// Summarizes and adds the summary to the changelog.md file
// Meant to be run from a Github action as part of the preparation for version rollout
async function main(){
var args = argv.slice(2) // remove 'node' and filename parameters
var auth = args[0]
var issue_to_comment_on = 0 // 0 means no issue
if (args[1]) issue_to_comment_on = Number(args[1])
var branch_to_merge_to = "translations"
if(args[2]) branch_to_merge_to = args[2]
const github = new Octokit({
auth: auth
});
const repo = {
owner: "yairm210",
repo: "Unciv" }
async function branchExists(branchName) {
try {
await github.git.getRef({...repo, ref: 'heads/' + branchName })
return true
} catch (err) {
return false
}
}
async function getDefaultBranch() {
var repoData = await github.repos.get(repo)
return repoData.data.default_branch
}
async function createTranslationBranchIfNeeded() {
if (await branchExists(branch_to_merge_to)) return
var defaultBranch = await getDefaultBranch()
var currentHead = await github.git.getRef({...repo, ref: 'heads/' + defaultBranch })
var currentSha = currentHead.data.object.sha
console.log("Current sha: " + currentSha)
await github.git.createRef({...repo,
ref: `refs/heads/` + branch_to_merge_to,
sha: currentSha })
if (issue_to_comment_on != 0)
await github.issues.createComment({...repo,
issue_number: issue_to_comment_on,
body: 'Translations branch created' })
}
async function mergeExistingTranslationsIntoBranch(){
var translationPrs = await github.pulls.list({ ...repo, state: "open" })
// When we used a forEach loop here, only one merge would happen at each run,
// because we essentially started multiple async tasks in parallel and they conflicted.
// Instead, we use X of Y as per https://stackoverflow.com/questions/37576685/using-async-await-with-a-foreach-loop
for (const pr of translationPrs.data) {
if (pr.labels.some(label => label.name == "mergeable translation"))
await tryMergePr(pr)
}
}
async function tryMergePr(pr){
if (pr.base.ref != branch_to_merge_to)
await github.pulls.update({ ...repo,
pull_number: pr.number,
base: branch_to_merge_to })
try {
await github.pulls.merge({...repo,
pull_number: pr.number,
merge_method: "squash" })
console.log("Merged #"+pr.number+", "+pr.title)
} catch (err) {
console.log(err)
}
}
async function createTranslationPrIfNeeded() {
var translationPulls = await github.pulls.list({...repo,
state: "open",
head: repo.owner + ":" + branch_to_merge_to });
if (translationPulls.data.length == 0) { // no pr exists yet
var defaultBranch = await getDefaultBranch();
var result = await github.pulls.create({...repo,
title: "Version rollout",
head: branch_to_merge_to,
base: defaultBranch });
if (issue_to_comment_on != 0)
await github.issues.createComment({...repo,
issue_number: issue_to_comment_on,
body: 'Version rollout PR created' });
// await github.pulls.merge({...repo,
// pull_number: result.data.number,
// merge_method: "squash"
// })
}
}
await createTranslationBranchIfNeeded()
await mergeExistingTranslationsIntoBranch()
await createTranslationPrIfNeeded()
}
main()