const core = require('@actions/core'); const exec = require('@actions/exec'); const github = require('@actions/github'); const ARGS = [ 'run', '--all-files', '--show-diff-on-failure', '--color=always' ]; function addToken(url, token) { return url.replace(/^https:\/\//, `https://x-access-token:${token}@`) } async function main() { await core.group('install pre-commit', async () => { await exec.exec('pip', ['install', 'pre-commit']); await exec.exec('pip', ['freeze', '--local']); }); const token = core.getInput('token'); const pr = github.context.payload.pull_request; const push = !!token && !!pr; const ret = await exec.exec('pre-commit', ARGS, {ignoreReturnCode: push}); if (ret && push) { // actions do not run on pushes made by actions. // need to make absolute sure things are good before pushing // TODO: is there a better way around this limitation? await exec.exec('pre-commit', ARGS); const diff = await exec.exec( 'git', ['diff', '--quiet'], {ignoreReturnCode: true} ); if (diff) { await core.group('push fixes', async () => { await exec.exec('git', ['config', 'user.name', 'pre-commit']); await exec.exec( 'git', ['config', 'user.email', 'pre-commit@example.com'] ); const branch = pr.head.ref; await exec.exec('git', ['checkout', 'HEAD', '-b', branch]); await exec.exec('git', ['commit', '-am', 'pre-commit fixes']); const url = addToken(pr.head.repo.clone_url, token); await exec.exec('git', ['remote', 'set-url', 'origin', url]); await exec.exec('git', ['push', 'origin', 'HEAD']); }); } } } main().catch((e) => core.setFailed(e.message));