OneLauncher-Cracked/.github/actions/clippy/src/index.ts
Pauline 992af34764
🔨 chore: bump deps
Signed-off-by: Pauline <git@ethanlibs.co>
2024-09-08 18:31:19 +02:00

129 lines
3.2 KiB
TypeScript

import { Buffer } from 'node:buffer';
import { promises as fs } from 'node:fs';
import { tmpdir as getTmpdir } from 'node:os';
import { env, cwd as getCwd } from 'node:process';
import { getInput as getCoreInput, group } from '@actions/core';
import { exec } from '@actions/exec';
import { rmRF } from '@actions/io';
import { join, relative } from 'pathe';
import { installReviewdog } from './installer';
const getInput = <T = string>(name: string): T => getCoreInput(name) as T;
async function run(): Promise<void> {
const runnerTmpdir = env.RUNNER_TEMP || getTmpdir();
const tmpdir = await fs.mkdtemp(join(runnerTmpdir, 'reviewdog-'));
const reviewdogVersion = getInput('reviewdog_version') || 'latest';
const toolName = getInput('tool_name') || 'clippy';
const clippyFlags = getInput('clippy_flags');
const clippyDebug = getInput('clippy_debug') || 'false';
const level = getInput('level') || 'error';
const reporter = getInput('reporter') || 'github-pr-check';
const filterMode = getInput('filter_mode') || 'added';
const failOnError = getInput('fail_on_error') || 'false';
const reviewdogFlags = getInput('reviewdog_flags');
const workdir = getInput('workdir') || '.';
const cwd = relative(env.GITHUB_WORKSPACE || getCwd(), workdir);
const reviewdog = await group('installing reviewdog', async () => await installReviewdog(reviewdogVersion, tmpdir));
const output: string[] = [];
await exec(
'cargo',
[
'+nightly',
'clippy',
'--color',
'never',
'-q',
'--message-format',
'json',
...parse(clippyFlags),
],
{
cwd,
ignoreReturnCode: true,
silent: clippyDebug !== 'true',
listeners: {
stdline: (data) => {
const content: CompilerMessage = JSON.parse(data);
if (content.reason !== 'compiler-message')
return;
if (content.message.code === null)
return;
const span = content.message.spans[0]!;
const messageLevel = content.message.level === 'warning' ? 'w' : 'e';
const rendered = reporter === 'github-pr-review'
? ` \n<pre><code>${content.message.rendered}</code></pre>\n__END__`
: `${content.message.rendered}\n__END__`;
const ret = `${span.file_name}:${span.line_start}:${span.column_start}:${messageLevel}:${rendered}`;
output.push(ret);
},
},
},
);
env.REVIEWDOG_GITHUB_API_TOKEN = getInput('github_token');
await exec(
reviewdog,
[
'-efm=<pre><code>%E%f:%l:%c:%t:%m',
'-efm=%E%f:%l:%c:%t:%m',
'-efm=%Z__END__',
'-efm=%C%m</code></pre>',
'-efm=%C%m',
'-efm=%C',
`-name=${toolName}`,
`-reporter=${reporter}`,
`-filter-mode=${filterMode}`,
`-fail-on-error=${failOnError}`,
`-level=${level}`,
...parse(reviewdogFlags),
],
{
cwd,
input: Buffer.from(output.join('\n'), 'utf-8'),
ignoreReturnCode: true,
},
);
await rmRF(tmpdir);
}
function parse(flags: string): string[] {
flags = flags.trim();
if (flags === '')
return [];
return flags.split(/\s+/);
}
interface CompilerMessage {
reason: string;
message: {
code: Code;
level: string;
message: string;
rendered: string;
spans: Span[];
};
}
interface Code {
code: string;
explanation?: string;
}
interface Span {
file_name: string;
is_primary: boolean;
line_start: number;
line_end: number;
column_start: number;
column_end: number;
}
run();