Unciv/.github/workflows/mergeTranslations.mjs

129 lines
3.7 KiB
JavaScript
Raw Permalink Normal View History

import {Octokit} from "@octokit/rest";
import {argv} from "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(){
const args = argv.slice(2); // remove 'node' and filename parameters
const auth = args[0];
let issue_to_comment_on = 0; // 0 means no issue
if (args[1]) issue_to_comment_on = Number(args[1])
let 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() {
const repoData = await github.repos.get(repo);
return repoData.data.default_branch
}
async function createTranslationBranchIfNeeded() {
if (await branchExists(branch_to_merge_to)) return
const defaultBranch = await getDefaultBranch();
const currentHead = await github.git.getRef({...repo, ref: 'heads/' + defaultBranch});
const currentSha = currentHead.data.object.sha;
console.log("Current sha: " + currentSha)
await github.git.createRef({...repo,
2022-03-09 23:37:15 +07:00
ref: `refs/heads/` + branch_to_merge_to,
sha: currentSha })
2022-03-09 23:37:15 +07:00
if (issue_to_comment_on != 0)
await github.issues.createComment({...repo,
issue_number: issue_to_comment_on,
body: 'Translations branch created' })
}
async function mergeExistingTranslationsIntoBranch(){
const 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() {
const translationPulls = await github.pulls.list({
...repo,
state: "open",
head: repo.owner + ":" + branch_to_merge_to
});
if (translationPulls.data.length == 0) { // no pr exists yet
const defaultBranch = await getDefaultBranch();
const result = await github.pulls.create({
...repo,
title: "Version rollout",
head: branch_to_merge_to,
base: defaultBranch
});
2022-03-09 23:37:15 +07:00
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()