Compare commits

...

15 Commits

Author SHA1 Message Date
Ludovic Fernandez
a4f60bb28d fix: use 3-dots syntax for diff on push (#1040) 2024-05-08 05:51:20 +02:00
Fernandez Ludovic
5815a4b917 doc: improve readme 2024-05-07 02:02:33 +02:00
Fernandez Ludovic
23faadfdeb doc: improve readme 2024-05-07 01:56:19 +02:00
Fernandez Ludovic
b556f25b3c doc: improve readme 2024-05-07 01:44:28 +02:00
Ludovic Fernandez
789f114c52 feat: rewrite format handling (#1038) 2024-05-07 01:40:17 +02:00
dependabot[bot]
d36b91c294 build(deps-dev): bump @typescript-eslint/parser from 7.7.1 to 7.8.0 (#1035) 2024-05-06 15:48:38 +02:00
dependabot[bot]
a9eb115348 build(deps): bump @types/node from 20.12.7 to 20.12.8 (#1036) 2024-05-06 15:42:05 +02:00
dependabot[bot]
bd4fa7c900 build(deps-dev): bump @typescript-eslint/eslint-plugin from 7.7.1 to 7.8.0 (#1034) 2024-05-06 15:41:21 +02:00
Ludovic Fernandez
38e1018663 feat: improve log about pwd/cwd (#1033) 2024-05-05 01:13:21 +02:00
Ludovic Fernandez
21e9e6b47f feat: use OS and working-directory as cache key (#1032) 2024-05-04 18:43:48 +02:00
Fernandez Ludovic
dbe4fc23f1 chore: use getBooleanInput 2024-05-04 17:49:04 +02:00
Ludovic Fernandez
dbb7ebcd4c feat: add option to control cache invalidation interval (#1031) 2024-05-04 17:47:25 +02:00
Ludovic Fernandez
ecb32920c6 feat: uses 2 dots compare syntax for push diff (#1030) 2024-05-04 16:54:30 +02:00
Fernandez Ludovic
046435d14c doc: improve options documentation 2024-05-04 02:42:39 +02:00
Fernandez Ludovic
ca8befdfb6 doc: improve options documentation 2024-05-04 02:36:06 +02:00
11 changed files with 348 additions and 212 deletions

119
README.md
View File

@@ -8,8 +8,11 @@ The action runs [golangci-lint](https://github.com/golangci/golangci-lint) and r
![GitHub Annotations](./static/annotations.png) ![GitHub Annotations](./static/annotations.png)
![Logs](./static/colored-line-number.png)
## Compatibility ## Compatibility
* `v6.0.0+` removes `annotations` option, removes the default output format (`github-actions`).
* `v5.0.0+` removes `skip-pkg-cache` and `skip-build-cache` because the cache related to Go itself is already handled by `actions/setup-go`. * `v5.0.0+` removes `skip-pkg-cache` and `skip-build-cache` because the cache related to Go itself is already handled by `actions/setup-go`.
* `v4.0.0+` requires an explicit `actions/setup-go` installation step before using this action: `uses: actions/setup-go@v5`. * `v4.0.0+` requires an explicit `actions/setup-go` installation step before using this action: `uses: actions/setup-go@v5`.
The `skip-go-installation` option has been removed. The `skip-go-installation` option has been removed.
@@ -45,7 +48,7 @@ jobs:
with: with:
go-version: '1.22' go-version: '1.22'
- name: golangci-lint - name: golangci-lint
uses: golangci/golangci-lint-action@v5 uses: golangci/golangci-lint-action@v6
with: with:
version: latest version: latest
``` ```
@@ -87,7 +90,7 @@ jobs:
with: with:
go-version: ${{ matrix.go }} go-version: ${{ matrix.go }}
- name: golangci-lint - name: golangci-lint
uses: golangci/golangci-lint-action@v5 uses: golangci/golangci-lint-action@v6
with: with:
version: latest version: latest
``` ```
@@ -100,87 +103,150 @@ You will also likely need to add the following `.gitattributes` file to ensure t
## Options ## Options
`version`: (required) The version of golangci-lint to use. ### `version`
(required)
The version of golangci-lint to use.
* When `install-mode` is `binary` (default) the value can be v1.2 or v1.2.3 or `latest` to use the latest version. * When `install-mode` is `binary` (default) the value can be v1.2 or v1.2.3 or `latest` to use the latest version.
* When `install-mode` is `goinstall` the value can be v1.2.3, `latest`, or the hash of a commit. * When `install-mode` is `goinstall` the value can be v1.2.3, `latest`, or the hash of a commit.
```yml ```yml
uses: golangci/golangci-lint-action@v5 uses: golangci/golangci-lint-action@v6
with: with:
version: latest version: latest
# ... # ...
``` ```
`install-mode`: (optional) The mode to install golangci-lint. ### `install-mode`
It can be `binary` or `goinstall`.
(optional)
The mode to install golangci-lint: it can be `binary` or `goinstall`.
The default value is `binary`. The default value is `binary`.
```yml ```yml
uses: golangci/golangci-lint-action@v5 uses: golangci/golangci-lint-action@v6
with: with:
install-mode: "goinstall" install-mode: "goinstall"
# ... # ...
``` ```
`only-new-issues`: (optional) Show only new issues. ### `only-new-issues`
If you are using `merge_group` event (merge queue) you should add the option `fetch-depth: 0` to `actions/checkout` step.
(optional)
Show only new issues.
The default value is `false`. The default value is `false`.
```yml ```yml
uses: golangci/golangci-lint-action@v5 uses: golangci/golangci-lint-action@v6
with: with:
only-new-issues: true only-new-issues: true
# ... # ...
``` ```
`working-directory`: (optional) working directory, useful for monorepos. * `pull_request` and `pull_request_target`: the action gets the diff of the PR content from the [GitHub API](https://docs.github.com/en/rest/pulls/pulls?apiVersion=2022-11-28#get-a-pull-request) and use it with `--new-from-patch`.
* `push`: the action gets the diff of the push content (difference between commits before and after the push) from the [GitHub API](https://docs.github.com/en/rest/commits/commits?apiVersion=2022-11-28#compare-two-commits) and use it with `--new-from-patch`.
* `merge_group`: the action gets the diff by using `--new-from-rev` option (relies on git).
You should add the option `fetch-depth: 0` to `actions/checkout` step.
### `working-directory`
(optional)
Working directory, useful for monorepos.
```yml ```yml
uses: golangci/golangci-lint-action@v5 uses: golangci/golangci-lint-action@v6
with: with:
working-directory: somedir working-directory: somedir
# ... # ...
``` ```
`skip-cache`: (optional) If set to `true`, then all caching functionality will be completely disabled, ### `skip-cache`
(optional)
If set to `true`, then all caching functionality will be completely disabled,
takes precedence over all other caching options. takes precedence over all other caching options.
The default value is `false`. The default value is `false`.
```yml ```yml
uses: golangci/golangci-lint-action@v5 uses: golangci/golangci-lint-action@v6
with: with:
skip-cache: true skip-cache: true
# ... # ...
``` ```
`skip-save-cache`: (optional) If set to `true`, caches will not be saved, but they may still be restored, required `skip-cache: false`. ### `skip-save-cache`
(optional)
If set to `true`, caches will not be saved, but they may still be restored, required `skip-cache: false`.
The default value is `false`. The default value is `false`.
```yml ```yml
uses: golangci/golangci-lint-action@v5 uses: golangci/golangci-lint-action@v6
with: with:
skip-save-cache: true skip-save-cache: true
# ... # ...
``` ```
`annotations`: (optional) To enable/disable GitHub Action annotations. ### `cache-invalidation-interval`
If disabled (`false`), the output format(s) will follow the golangci-lint configuration file and use the same default as golangci-lint (i.e. `colored-line-number`).
https://golangci-lint.run/usage/configuration/#output-configuration (optional)
The default value is `true`.
Periodically invalidate the cache every `cache-invalidation-interval` days to ensure that outdated data is removed and fresh data is loaded.
The default value is `7`.
```yml ```yml
uses: golangci/golangci-lint-action@v5 uses: golangci/golangci-lint-action@v6
with: with:
annotations: false cache-invalidation-interval: 15
# ... # ...
``` ```
`args`: (optional) golangci-lint command line arguments. If set the number is `<= 0`, the cache will be always invalidate (Not recommended).
### `problem-matchers`
(optional)
Force the usage of the embedded problem matchers.
By default, the [problem matcher of Go (`actions/setup-go`)](https://github.com/actions/setup-go/blob/main/matchers.json) already handles the golangci-lint output (`colored-line-number`).
Works only with `colored-line-number` (the golangci-lint default).
https://golangci-lint.run/usage/configuration/#output-configuration
The default value is `false`.
```yml
uses: golangci/golangci-lint-action@v6
with:
problem-matchers: true
# ...
```
### `args`
(optional)
golangci-lint command line arguments.
Note: By default, the `.golangci.yml` file should be at the root of the repository. Note: By default, the `.golangci.yml` file should be at the root of the repository.
The location of the configuration file can be changed by using `--config=` The location of the configuration file can be changed by using `--config=`
```yml ```yml
uses: golangci/golangci-lint-action@v5 uses: golangci/golangci-lint-action@v6
with: with:
args: --timeout=30m --config=/my/path/.golangci.yml --issues-exit-code=0 args: --timeout=30m --config=/my/path/.golangci.yml --issues-exit-code=0
# ... # ...
@@ -246,10 +312,11 @@ Inside our action, we perform 3 steps:
### Caching internals ### Caching internals
1. We save and restore the following directory: `~/.cache/golangci-lint`. 1. We save and restore the following directory: `~/.cache/golangci-lint`.
2. The primary caching key looks like `golangci-lint.cache-{interval_number}-{go.mod_hash}`. 2. The primary caching key looks like `golangci-lint.cache-{runner_os}-{working_directory}-{interval_number}-{go.mod_hash}`.
Interval number ensures that we periodically invalidate our cache (every 7 days). Interval number ensures that we periodically invalidate our cache (every 7 days).
`go.mod` hash ensures that we invalidate the cache early - as soon as dependencies have changed. `go.mod` hash ensures that we invalidate the cache early - as soon as dependencies have changed.
3. We use [restore keys](https://help.github.com/en/actions/configuring-and-managing-workflows/caching-dependencies-to-speed-up-workflows#matching-a-cache-key): `golangci-lint.cache-{interval_number}-`. 3. We use [restore keys](https://help.github.com/en/actions/configuring-and-managing-workflows/caching-dependencies-to-speed-up-workflows#matching-a-cache-key):
`golangci-lint.cache-{runner_os}-{working_directory}-{interval_number}-`.
GitHub matches keys by prefix if we have no exact match for the primary cache. GitHub matches keys by prefix if we have no exact match for the primary cache.
This scheme is basic and needs improvements. Pull requests and ideas are welcome. This scheme is basic and needs improvements. Pull requests and ideas are welcome.

View File

@@ -36,14 +36,18 @@ inputs:
restore existing caches, subject to other options. restore existing caches, subject to other options.
default: 'false' default: 'false'
required: false required: false
annotations: problem-matchers:
description: "To Enable/disable GitHub Action annotations" description: "Force the usage of the embedded problem matchers"
default: 'true' default: 'false'
required: false required: false
args: args:
description: "golangci-lint command line arguments" description: "golangci-lint command line arguments"
default: "" default: ""
required: false required: false
cache-invalidation-interval:
description: "Periodically invalidate a cache because a new code being added. (number of days)"
default: '7'
required: false
runs: runs:
using: "node20" using: "node20"
main: "dist/run/index.js" main: "dist/run/index.js"

56
dist/post_run/index.js generated vendored
View File

@@ -88815,18 +88815,26 @@ const getLintCacheDir = () => {
}; };
const getIntervalKey = (invalidationIntervalDays) => { const getIntervalKey = (invalidationIntervalDays) => {
const now = new Date(); const now = new Date();
if (invalidationIntervalDays <= 0) {
return `${now.getTime()}`;
}
const secondsSinceEpoch = now.getTime() / 1000; const secondsSinceEpoch = now.getTime() / 1000;
const intervalNumber = Math.floor(secondsSinceEpoch / (invalidationIntervalDays * 86400)); const intervalNumber = Math.floor(secondsSinceEpoch / (invalidationIntervalDays * 86400));
return intervalNumber.toString(); return intervalNumber.toString();
}; };
async function buildCacheKeys() { async function buildCacheKeys() {
const keys = []; const keys = [];
// Periodically invalidate a cache because a new code being added. // Cache by OS.
// TODO: configure it via inputs. let cacheKey = `golangci-lint.cache-${process.env?.RUNNER_OS}-`;
let cacheKey = `golangci-lint.cache-${getIntervalKey(7)}-`;
keys.push(cacheKey);
// Get working directory from input // Get working directory from input
const workingDirectory = core.getInput(`working-directory`); const workingDirectory = core.getInput(`working-directory`);
if (workingDirectory) {
cacheKey += `${workingDirectory}-`;
}
// Periodically invalidate a cache because a new code being added.
const invalidationIntervalDays = parseInt(core.getInput(`cache-invalidation-interval`, { required: true }).trim());
cacheKey += `${getIntervalKey(invalidationIntervalDays)}-`;
keys.push(cacheKey);
// create path to go.mod prepending the workingDirectory if it exists // create path to go.mod prepending the workingDirectory if it exists
const goModPath = path_1.default.join(workingDirectory, `go.mod`); const goModPath = path_1.default.join(workingDirectory, `go.mod`);
core.info(`Checking for go.mod: ${goModPath}`); core.info(`Checking for go.mod: ${goModPath}`);
@@ -88841,7 +88849,7 @@ async function buildCacheKeys() {
return keys; return keys;
} }
async function restoreCache() { async function restoreCache() {
if (core.getInput(`skip-cache`, { required: true }).trim() == "true") if (core.getBooleanInput(`skip-cache`, { required: true }))
return; return;
if (!utils.isValidEvent()) { if (!utils.isValidEvent()) {
utils.logWarning(`Event Validation Error: The event type ${process.env[constants_1.Events.Key]} is not supported because it's not tied to a branch or tag ref.`); utils.logWarning(`Event Validation Error: The event type ${process.env[constants_1.Events.Key]} is not supported because it's not tied to a branch or tag ref.`);
@@ -88879,9 +88887,9 @@ async function restoreCache() {
} }
exports.restoreCache = restoreCache; exports.restoreCache = restoreCache;
async function saveCache() { async function saveCache() {
if (core.getInput(`skip-cache`, { required: true }).trim() == "true") if (core.getBooleanInput(`skip-cache`, { required: true }))
return; return;
if (core.getInput(`skip-save-cache`, { required: true }).trim() == "true") if (core.getBooleanInput(`skip-save-cache`, { required: true }))
return; return;
// Validate inputs, this can cause task failure // Validate inputs, this can cause task failure
if (!utils.isValidEvent()) { if (!utils.isValidEvent()) {
@@ -89147,11 +89155,7 @@ const execShellCommand = (0, util_1.promisify)(child_process_1.exec);
const writeFile = (0, util_1.promisify)(fs.writeFile); const writeFile = (0, util_1.promisify)(fs.writeFile);
const createTempDir = (0, util_1.promisify)(tmp_1.dir); const createTempDir = (0, util_1.promisify)(tmp_1.dir);
function isOnlyNewIssues() { function isOnlyNewIssues() {
const onlyNewIssues = core.getInput(`only-new-issues`, { required: true }).trim(); return core.getBooleanInput(`only-new-issues`, { required: true });
if (onlyNewIssues !== `false` && onlyNewIssues !== `true`) {
throw new Error(`invalid value of "only-new-issues": "${onlyNewIssues}", expected "true" or "false"`);
}
return onlyNewIssues === `true`;
} }
async function prepareLint() { async function prepareLint() {
const mode = core.getInput("install-mode").toLowerCase(); const mode = core.getInput("install-mode").toLowerCase();
@@ -89221,11 +89225,10 @@ async function fetchPushPatch(ctx) {
const octokit = github.getOctokit(core.getInput(`github-token`, { required: true })); const octokit = github.getOctokit(core.getInput(`github-token`, { required: true }));
let patch; let patch;
try { try {
const patchResp = await octokit.rest.repos.compareCommits({ const patchResp = await octokit.rest.repos.compareCommitsWithBasehead({
owner: ctx.repo.owner, owner: ctx.repo.owner,
repo: ctx.repo.repo, repo: ctx.repo.repo,
base: ctx.payload.before, basehead: `${ctx.payload.before}...${ctx.payload.after}`,
head: ctx.payload.after,
mediaType: { mediaType: {
format: `diff`, format: `diff`,
}, },
@@ -89287,18 +89290,27 @@ async function runLint(lintPath, patchPath) {
.map(([key, value]) => [key.toLowerCase(), value ?? ""]); .map(([key, value]) => [key.toLowerCase(), value ?? ""]);
const userArgsMap = new Map(userArgsList); const userArgsMap = new Map(userArgsList);
const userArgNames = new Set(userArgsList.map(([key]) => key)); const userArgNames = new Set(userArgsList.map(([key]) => key));
const annotations = core.getInput(`annotations`).trim() !== "false"; const problemMatchers = core.getBooleanInput(`problem-matchers`);
if (annotations) { if (problemMatchers) {
const matchersPath = path.join(__dirname, "../..", "problem-matchers.json");
if (fs.existsSync(matchersPath)) {
// Adds problem matchers.
// https://github.com/actions/setup-go/blob/cdcb36043654635271a94b9a6d1392de5bb323a7/src/main.ts#L81-L83
core.info(`##[add-matcher]${matchersPath}`);
}
}
const formats = (userArgsMap.get("out-format") || "") const formats = (userArgsMap.get("out-format") || "")
.trim() .trim()
.split(",") .split(",")
.filter((f) => f.length > 0) .filter((f) => f.length > 0)
.filter((f) => !f.startsWith(`github-actions`)) .filter((f) => !f.startsWith(`github-actions`)) // Removes `github-actions` format.
.concat("github-actions")
.join(","); .join(",");
if (formats) {
// Adds formats but without `github-actions` format.
addedArgs.push(`--out-format=${formats}`); addedArgs.push(`--out-format=${formats}`);
userArgs = userArgs.replace(/--out-format=\S*/gi, "").trim();
} }
// Removes `--out-format` from the user flags because it's already inside `addedArgs`.
userArgs = userArgs.replace(/--out-format=\S*/gi, "").trim();
if (isOnlyNewIssues()) { if (isOnlyNewIssues()) {
if (userArgNames.has(`new`) || userArgNames.has(`new-from-rev`) || userArgNames.has(`new-from-patch`)) { if (userArgNames.has(`new`) || userArgNames.has(`new-from-rev`) || userArgNames.has(`new-from-patch`)) {
throw new Error(`please, don't specify manually --new* args when requesting only new issues`); throw new Error(`please, don't specify manually --new* args when requesting only new issues`);
@@ -89326,8 +89338,8 @@ async function runLint(lintPath, patchPath) {
break; break;
} }
} }
const workingDirectory = core.getInput(`working-directory`);
const cmdArgs = {}; const cmdArgs = {};
const workingDirectory = core.getInput(`working-directory`);
if (workingDirectory) { if (workingDirectory) {
if (!fs.existsSync(workingDirectory) || !fs.lstatSync(workingDirectory).isDirectory()) { if (!fs.existsSync(workingDirectory) || !fs.lstatSync(workingDirectory).isDirectory()) {
throw new Error(`working-directory (${workingDirectory}) was not a path`); throw new Error(`working-directory (${workingDirectory}) was not a path`);
@@ -89338,7 +89350,7 @@ async function runLint(lintPath, patchPath) {
cmdArgs.cwd = path.resolve(workingDirectory); cmdArgs.cwd = path.resolve(workingDirectory);
} }
const cmd = `${lintPath} run ${addedArgs.join(` `)} ${userArgs}`.trimEnd(); const cmd = `${lintPath} run ${addedArgs.join(` `)} ${userArgs}`.trimEnd();
core.info(`Running [${cmd}] in [${cmdArgs.cwd || ``}] ...`); core.info(`Running [${cmd}] in [${cmdArgs.cwd || process.cwd()}] ...`);
const startedAt = Date.now(); const startedAt = Date.now();
try { try {
const res = await execShellCommand(cmd, cmdArgs); const res = await execShellCommand(cmd, cmdArgs);

56
dist/run/index.js generated vendored
View File

@@ -88815,18 +88815,26 @@ const getLintCacheDir = () => {
}; };
const getIntervalKey = (invalidationIntervalDays) => { const getIntervalKey = (invalidationIntervalDays) => {
const now = new Date(); const now = new Date();
if (invalidationIntervalDays <= 0) {
return `${now.getTime()}`;
}
const secondsSinceEpoch = now.getTime() / 1000; const secondsSinceEpoch = now.getTime() / 1000;
const intervalNumber = Math.floor(secondsSinceEpoch / (invalidationIntervalDays * 86400)); const intervalNumber = Math.floor(secondsSinceEpoch / (invalidationIntervalDays * 86400));
return intervalNumber.toString(); return intervalNumber.toString();
}; };
async function buildCacheKeys() { async function buildCacheKeys() {
const keys = []; const keys = [];
// Periodically invalidate a cache because a new code being added. // Cache by OS.
// TODO: configure it via inputs. let cacheKey = `golangci-lint.cache-${process.env?.RUNNER_OS}-`;
let cacheKey = `golangci-lint.cache-${getIntervalKey(7)}-`;
keys.push(cacheKey);
// Get working directory from input // Get working directory from input
const workingDirectory = core.getInput(`working-directory`); const workingDirectory = core.getInput(`working-directory`);
if (workingDirectory) {
cacheKey += `${workingDirectory}-`;
}
// Periodically invalidate a cache because a new code being added.
const invalidationIntervalDays = parseInt(core.getInput(`cache-invalidation-interval`, { required: true }).trim());
cacheKey += `${getIntervalKey(invalidationIntervalDays)}-`;
keys.push(cacheKey);
// create path to go.mod prepending the workingDirectory if it exists // create path to go.mod prepending the workingDirectory if it exists
const goModPath = path_1.default.join(workingDirectory, `go.mod`); const goModPath = path_1.default.join(workingDirectory, `go.mod`);
core.info(`Checking for go.mod: ${goModPath}`); core.info(`Checking for go.mod: ${goModPath}`);
@@ -88841,7 +88849,7 @@ async function buildCacheKeys() {
return keys; return keys;
} }
async function restoreCache() { async function restoreCache() {
if (core.getInput(`skip-cache`, { required: true }).trim() == "true") if (core.getBooleanInput(`skip-cache`, { required: true }))
return; return;
if (!utils.isValidEvent()) { if (!utils.isValidEvent()) {
utils.logWarning(`Event Validation Error: The event type ${process.env[constants_1.Events.Key]} is not supported because it's not tied to a branch or tag ref.`); utils.logWarning(`Event Validation Error: The event type ${process.env[constants_1.Events.Key]} is not supported because it's not tied to a branch or tag ref.`);
@@ -88879,9 +88887,9 @@ async function restoreCache() {
} }
exports.restoreCache = restoreCache; exports.restoreCache = restoreCache;
async function saveCache() { async function saveCache() {
if (core.getInput(`skip-cache`, { required: true }).trim() == "true") if (core.getBooleanInput(`skip-cache`, { required: true }))
return; return;
if (core.getInput(`skip-save-cache`, { required: true }).trim() == "true") if (core.getBooleanInput(`skip-save-cache`, { required: true }))
return; return;
// Validate inputs, this can cause task failure // Validate inputs, this can cause task failure
if (!utils.isValidEvent()) { if (!utils.isValidEvent()) {
@@ -89147,11 +89155,7 @@ const execShellCommand = (0, util_1.promisify)(child_process_1.exec);
const writeFile = (0, util_1.promisify)(fs.writeFile); const writeFile = (0, util_1.promisify)(fs.writeFile);
const createTempDir = (0, util_1.promisify)(tmp_1.dir); const createTempDir = (0, util_1.promisify)(tmp_1.dir);
function isOnlyNewIssues() { function isOnlyNewIssues() {
const onlyNewIssues = core.getInput(`only-new-issues`, { required: true }).trim(); return core.getBooleanInput(`only-new-issues`, { required: true });
if (onlyNewIssues !== `false` && onlyNewIssues !== `true`) {
throw new Error(`invalid value of "only-new-issues": "${onlyNewIssues}", expected "true" or "false"`);
}
return onlyNewIssues === `true`;
} }
async function prepareLint() { async function prepareLint() {
const mode = core.getInput("install-mode").toLowerCase(); const mode = core.getInput("install-mode").toLowerCase();
@@ -89221,11 +89225,10 @@ async function fetchPushPatch(ctx) {
const octokit = github.getOctokit(core.getInput(`github-token`, { required: true })); const octokit = github.getOctokit(core.getInput(`github-token`, { required: true }));
let patch; let patch;
try { try {
const patchResp = await octokit.rest.repos.compareCommits({ const patchResp = await octokit.rest.repos.compareCommitsWithBasehead({
owner: ctx.repo.owner, owner: ctx.repo.owner,
repo: ctx.repo.repo, repo: ctx.repo.repo,
base: ctx.payload.before, basehead: `${ctx.payload.before}...${ctx.payload.after}`,
head: ctx.payload.after,
mediaType: { mediaType: {
format: `diff`, format: `diff`,
}, },
@@ -89287,18 +89290,27 @@ async function runLint(lintPath, patchPath) {
.map(([key, value]) => [key.toLowerCase(), value ?? ""]); .map(([key, value]) => [key.toLowerCase(), value ?? ""]);
const userArgsMap = new Map(userArgsList); const userArgsMap = new Map(userArgsList);
const userArgNames = new Set(userArgsList.map(([key]) => key)); const userArgNames = new Set(userArgsList.map(([key]) => key));
const annotations = core.getInput(`annotations`).trim() !== "false"; const problemMatchers = core.getBooleanInput(`problem-matchers`);
if (annotations) { if (problemMatchers) {
const matchersPath = path.join(__dirname, "../..", "problem-matchers.json");
if (fs.existsSync(matchersPath)) {
// Adds problem matchers.
// https://github.com/actions/setup-go/blob/cdcb36043654635271a94b9a6d1392de5bb323a7/src/main.ts#L81-L83
core.info(`##[add-matcher]${matchersPath}`);
}
}
const formats = (userArgsMap.get("out-format") || "") const formats = (userArgsMap.get("out-format") || "")
.trim() .trim()
.split(",") .split(",")
.filter((f) => f.length > 0) .filter((f) => f.length > 0)
.filter((f) => !f.startsWith(`github-actions`)) .filter((f) => !f.startsWith(`github-actions`)) // Removes `github-actions` format.
.concat("github-actions")
.join(","); .join(",");
if (formats) {
// Adds formats but without `github-actions` format.
addedArgs.push(`--out-format=${formats}`); addedArgs.push(`--out-format=${formats}`);
userArgs = userArgs.replace(/--out-format=\S*/gi, "").trim();
} }
// Removes `--out-format` from the user flags because it's already inside `addedArgs`.
userArgs = userArgs.replace(/--out-format=\S*/gi, "").trim();
if (isOnlyNewIssues()) { if (isOnlyNewIssues()) {
if (userArgNames.has(`new`) || userArgNames.has(`new-from-rev`) || userArgNames.has(`new-from-patch`)) { if (userArgNames.has(`new`) || userArgNames.has(`new-from-rev`) || userArgNames.has(`new-from-patch`)) {
throw new Error(`please, don't specify manually --new* args when requesting only new issues`); throw new Error(`please, don't specify manually --new* args when requesting only new issues`);
@@ -89326,8 +89338,8 @@ async function runLint(lintPath, patchPath) {
break; break;
} }
} }
const workingDirectory = core.getInput(`working-directory`);
const cmdArgs = {}; const cmdArgs = {};
const workingDirectory = core.getInput(`working-directory`);
if (workingDirectory) { if (workingDirectory) {
if (!fs.existsSync(workingDirectory) || !fs.lstatSync(workingDirectory).isDirectory()) { if (!fs.existsSync(workingDirectory) || !fs.lstatSync(workingDirectory).isDirectory()) {
throw new Error(`working-directory (${workingDirectory}) was not a path`); throw new Error(`working-directory (${workingDirectory}) was not a path`);
@@ -89338,7 +89350,7 @@ async function runLint(lintPath, patchPath) {
cmdArgs.cwd = path.resolve(workingDirectory); cmdArgs.cwd = path.resolve(workingDirectory);
} }
const cmd = `${lintPath} run ${addedArgs.join(` `)} ${userArgs}`.trimEnd(); const cmd = `${lintPath} run ${addedArgs.join(` `)} ${userArgs}`.trimEnd();
core.info(`Running [${cmd}] in [${cmdArgs.cwd || ``}] ...`); core.info(`Running [${cmd}] in [${cmdArgs.cwd || process.cwd()}] ...`);
const startedAt = Date.now(); const startedAt = Date.now();
try { try {
const res = await execShellCommand(cmd, cmdArgs); const res = await execShellCommand(cmd, cmdArgs);

186
package-lock.json generated
View File

@@ -15,14 +15,14 @@
"@actions/github": "^6.0.0", "@actions/github": "^6.0.0",
"@actions/http-client": "^2.2.1", "@actions/http-client": "^2.2.1",
"@actions/tool-cache": "^2.0.1", "@actions/tool-cache": "^2.0.1",
"@types/node": "^20.12.7", "@types/node": "^20.12.8",
"@types/semver": "^7.5.8", "@types/semver": "^7.5.8",
"@types/tmp": "^0.2.6", "@types/tmp": "^0.2.6",
"tmp": "^0.2.3" "tmp": "^0.2.3"
}, },
"devDependencies": { "devDependencies": {
"@typescript-eslint/eslint-plugin": "^7.7.1", "@typescript-eslint/eslint-plugin": "^7.8.0",
"@typescript-eslint/parser": "^7.7.1", "@typescript-eslint/parser": "^7.8.0",
"@vercel/ncc": "^0.38.1", "@vercel/ncc": "^0.38.1",
"eslint": "^8.57.0", "eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
@@ -643,9 +643,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.12.7", "version": "20.12.8",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz",
"integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==",
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"
} }
@@ -691,16 +691,16 @@
} }
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz",
"integrity": "sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==", "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.10.0", "@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "7.7.1", "@typescript-eslint/scope-manager": "7.8.0",
"@typescript-eslint/type-utils": "7.7.1", "@typescript-eslint/type-utils": "7.8.0",
"@typescript-eslint/utils": "7.7.1", "@typescript-eslint/utils": "7.8.0",
"@typescript-eslint/visitor-keys": "7.7.1", "@typescript-eslint/visitor-keys": "7.8.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"graphemer": "^1.4.0", "graphemer": "^1.4.0",
"ignore": "^5.3.1", "ignore": "^5.3.1",
@@ -741,15 +741,15 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz",
"integrity": "sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==", "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "7.7.1", "@typescript-eslint/scope-manager": "7.8.0",
"@typescript-eslint/types": "7.7.1", "@typescript-eslint/types": "7.8.0",
"@typescript-eslint/typescript-estree": "7.7.1", "@typescript-eslint/typescript-estree": "7.8.0",
"@typescript-eslint/visitor-keys": "7.7.1", "@typescript-eslint/visitor-keys": "7.8.0",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@@ -769,13 +769,13 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz",
"integrity": "sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==", "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "7.7.1", "@typescript-eslint/types": "7.8.0",
"@typescript-eslint/visitor-keys": "7.7.1" "@typescript-eslint/visitor-keys": "7.8.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || >=20.0.0" "node": "^18.18.0 || >=20.0.0"
@@ -786,13 +786,13 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz",
"integrity": "sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==", "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "7.7.1", "@typescript-eslint/typescript-estree": "7.8.0",
"@typescript-eslint/utils": "7.7.1", "@typescript-eslint/utils": "7.8.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^1.3.0" "ts-api-utils": "^1.3.0"
}, },
@@ -813,9 +813,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz",
"integrity": "sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==", "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^18.18.0 || >=20.0.0" "node": "^18.18.0 || >=20.0.0"
@@ -826,13 +826,13 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz",
"integrity": "sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==", "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "7.7.1", "@typescript-eslint/types": "7.8.0",
"@typescript-eslint/visitor-keys": "7.7.1", "@typescript-eslint/visitor-keys": "7.8.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@@ -893,17 +893,17 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz",
"integrity": "sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==", "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@types/json-schema": "^7.0.15", "@types/json-schema": "^7.0.15",
"@types/semver": "^7.5.8", "@types/semver": "^7.5.8",
"@typescript-eslint/scope-manager": "7.7.1", "@typescript-eslint/scope-manager": "7.8.0",
"@typescript-eslint/types": "7.7.1", "@typescript-eslint/types": "7.8.0",
"@typescript-eslint/typescript-estree": "7.7.1", "@typescript-eslint/typescript-estree": "7.8.0",
"semver": "^7.6.0" "semver": "^7.6.0"
}, },
"engines": { "engines": {
@@ -933,12 +933,12 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz",
"integrity": "sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==", "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "7.7.1", "@typescript-eslint/types": "7.8.0",
"eslint-visitor-keys": "^3.4.3" "eslint-visitor-keys": "^3.4.3"
}, },
"engines": { "engines": {
@@ -4563,9 +4563,9 @@
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "20.12.7", "version": "20.12.8",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz",
"integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==",
"requires": { "requires": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"
} }
@@ -4610,16 +4610,16 @@
} }
}, },
"@typescript-eslint/eslint-plugin": { "@typescript-eslint/eslint-plugin": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz",
"integrity": "sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==", "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@eslint-community/regexpp": "^4.10.0", "@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "7.7.1", "@typescript-eslint/scope-manager": "7.8.0",
"@typescript-eslint/type-utils": "7.7.1", "@typescript-eslint/type-utils": "7.8.0",
"@typescript-eslint/utils": "7.7.1", "@typescript-eslint/utils": "7.8.0",
"@typescript-eslint/visitor-keys": "7.7.1", "@typescript-eslint/visitor-keys": "7.8.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"graphemer": "^1.4.0", "graphemer": "^1.4.0",
"ignore": "^5.3.1", "ignore": "^5.3.1",
@@ -4640,54 +4640,54 @@
} }
}, },
"@typescript-eslint/parser": { "@typescript-eslint/parser": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz",
"integrity": "sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==", "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/scope-manager": "7.7.1", "@typescript-eslint/scope-manager": "7.8.0",
"@typescript-eslint/types": "7.7.1", "@typescript-eslint/types": "7.8.0",
"@typescript-eslint/typescript-estree": "7.7.1", "@typescript-eslint/typescript-estree": "7.8.0",
"@typescript-eslint/visitor-keys": "7.7.1", "@typescript-eslint/visitor-keys": "7.8.0",
"debug": "^4.3.4" "debug": "^4.3.4"
} }
}, },
"@typescript-eslint/scope-manager": { "@typescript-eslint/scope-manager": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz",
"integrity": "sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==", "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "7.7.1", "@typescript-eslint/types": "7.8.0",
"@typescript-eslint/visitor-keys": "7.7.1" "@typescript-eslint/visitor-keys": "7.8.0"
} }
}, },
"@typescript-eslint/type-utils": { "@typescript-eslint/type-utils": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz",
"integrity": "sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==", "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/typescript-estree": "7.7.1", "@typescript-eslint/typescript-estree": "7.8.0",
"@typescript-eslint/utils": "7.7.1", "@typescript-eslint/utils": "7.8.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^1.3.0" "ts-api-utils": "^1.3.0"
} }
}, },
"@typescript-eslint/types": { "@typescript-eslint/types": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz",
"integrity": "sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==", "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==",
"dev": true "dev": true
}, },
"@typescript-eslint/typescript-estree": { "@typescript-eslint/typescript-estree": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz",
"integrity": "sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==", "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "7.7.1", "@typescript-eslint/types": "7.8.0",
"@typescript-eslint/visitor-keys": "7.7.1", "@typescript-eslint/visitor-keys": "7.8.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@@ -4726,17 +4726,17 @@
} }
}, },
"@typescript-eslint/utils": { "@typescript-eslint/utils": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz",
"integrity": "sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==", "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@types/json-schema": "^7.0.15", "@types/json-schema": "^7.0.15",
"@types/semver": "^7.5.8", "@types/semver": "^7.5.8",
"@typescript-eslint/scope-manager": "7.7.1", "@typescript-eslint/scope-manager": "7.8.0",
"@typescript-eslint/types": "7.7.1", "@typescript-eslint/types": "7.8.0",
"@typescript-eslint/typescript-estree": "7.7.1", "@typescript-eslint/typescript-estree": "7.8.0",
"semver": "^7.6.0" "semver": "^7.6.0"
}, },
"dependencies": { "dependencies": {
@@ -4752,12 +4752,12 @@
} }
}, },
"@typescript-eslint/visitor-keys": { "@typescript-eslint/visitor-keys": {
"version": "7.7.1", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz",
"integrity": "sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==", "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "7.7.1", "@typescript-eslint/types": "7.8.0",
"eslint-visitor-keys": "^3.4.3" "eslint-visitor-keys": "^3.4.3"
} }
}, },

View File

@@ -30,14 +30,14 @@
"@actions/github": "^6.0.0", "@actions/github": "^6.0.0",
"@actions/http-client": "^2.2.1", "@actions/http-client": "^2.2.1",
"@actions/tool-cache": "^2.0.1", "@actions/tool-cache": "^2.0.1",
"@types/node": "^20.12.7", "@types/node": "^20.12.8",
"@types/semver": "^7.5.8", "@types/semver": "^7.5.8",
"@types/tmp": "^0.2.6", "@types/tmp": "^0.2.6",
"tmp": "^0.2.3" "tmp": "^0.2.3"
}, },
"devDependencies": { "devDependencies": {
"@typescript-eslint/eslint-plugin": "^7.7.1", "@typescript-eslint/eslint-plugin": "^7.8.0",
"@typescript-eslint/parser": "^7.7.1", "@typescript-eslint/parser": "^7.8.0",
"@vercel/ncc": "^0.38.1", "@vercel/ncc": "^0.38.1",
"eslint": "^8.57.0", "eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",

17
problem-matchers.json Normal file
View File

@@ -0,0 +1,17 @@
{
"problemMatcher": [
{
"owner": "golangci-lint-colored-line-number",
"severity": "error",
"pattern": [
{
"regexp": "^([^:]+):(\\d+):(?:(\\d+):)?\\s+(.+ \\(.+\\))$",
"file": 1,
"line": 2,
"column": 3,
"message": 4
}
]
}
]
}

View File

@@ -25,6 +25,11 @@ const getLintCacheDir = (): string => {
const getIntervalKey = (invalidationIntervalDays: number): string => { const getIntervalKey = (invalidationIntervalDays: number): string => {
const now = new Date() const now = new Date()
if (invalidationIntervalDays <= 0) {
return `${now.getTime()}`
}
const secondsSinceEpoch = now.getTime() / 1000 const secondsSinceEpoch = now.getTime() / 1000
const intervalNumber = Math.floor(secondsSinceEpoch / (invalidationIntervalDays * 86400)) const intervalNumber = Math.floor(secondsSinceEpoch / (invalidationIntervalDays * 86400))
return intervalNumber.toString() return intervalNumber.toString()
@@ -32,28 +37,42 @@ const getIntervalKey = (invalidationIntervalDays: number): string => {
async function buildCacheKeys(): Promise<string[]> { async function buildCacheKeys(): Promise<string[]> {
const keys = [] const keys = []
// Periodically invalidate a cache because a new code being added.
// TODO: configure it via inputs. // Cache by OS.
let cacheKey = `golangci-lint.cache-${getIntervalKey(7)}-` let cacheKey = `golangci-lint.cache-${process.env?.RUNNER_OS}-`
keys.push(cacheKey)
// Get working directory from input // Get working directory from input
const workingDirectory = core.getInput(`working-directory`) const workingDirectory = core.getInput(`working-directory`)
if (workingDirectory) {
cacheKey += `${workingDirectory}-`
}
// Periodically invalidate a cache because a new code being added.
const invalidationIntervalDays = parseInt(core.getInput(`cache-invalidation-interval`, { required: true }).trim())
cacheKey += `${getIntervalKey(invalidationIntervalDays)}-`
keys.push(cacheKey)
// create path to go.mod prepending the workingDirectory if it exists // create path to go.mod prepending the workingDirectory if it exists
const goModPath = path.join(workingDirectory, `go.mod`) const goModPath = path.join(workingDirectory, `go.mod`)
core.info(`Checking for go.mod: ${goModPath}`) core.info(`Checking for go.mod: ${goModPath}`)
if (await pathExists(goModPath)) { if (await pathExists(goModPath)) {
// Add checksum to key to invalidate a cache when dependencies change. // Add checksum to key to invalidate a cache when dependencies change.
cacheKey += await checksumFile(`sha1`, goModPath) cacheKey += await checksumFile(`sha1`, goModPath)
} else { } else {
cacheKey += `nogomod` cacheKey += `nogomod`
} }
keys.push(cacheKey) keys.push(cacheKey)
return keys return keys
} }
export async function restoreCache(): Promise<void> { export async function restoreCache(): Promise<void> {
if (core.getInput(`skip-cache`, { required: true }).trim() == "true") return if (core.getBooleanInput(`skip-cache`, { required: true })) return
if (!utils.isValidEvent()) { if (!utils.isValidEvent()) {
utils.logWarning( utils.logWarning(
@@ -95,8 +114,8 @@ export async function restoreCache(): Promise<void> {
} }
export async function saveCache(): Promise<void> { export async function saveCache(): Promise<void> {
if (core.getInput(`skip-cache`, { required: true }).trim() == "true") return if (core.getBooleanInput(`skip-cache`, { required: true })) return
if (core.getInput(`skip-save-cache`, { required: true }).trim() == "true") return if (core.getBooleanInput(`skip-save-cache`, { required: true })) return
// Validate inputs, this can cause task failure // Validate inputs, this can cause task failure
if (!utils.isValidEvent()) { if (!utils.isValidEvent()) {

View File

@@ -17,13 +17,7 @@ const writeFile = promisify(fs.writeFile)
const createTempDir = promisify(dir) const createTempDir = promisify(dir)
function isOnlyNewIssues(): boolean { function isOnlyNewIssues(): boolean {
const onlyNewIssues = core.getInput(`only-new-issues`, { required: true }).trim() return core.getBooleanInput(`only-new-issues`, { required: true })
if (onlyNewIssues !== `false` && onlyNewIssues !== `true`) {
throw new Error(`invalid value of "only-new-issues": "${onlyNewIssues}", expected "true" or "false"`)
}
return onlyNewIssues === `true`
} }
async function prepareLint(): Promise<string> { async function prepareLint(): Promise<string> {
@@ -104,11 +98,10 @@ async function fetchPushPatch(ctx: Context): Promise<string> {
let patch: string let patch: string
try { try {
const patchResp = await octokit.rest.repos.compareCommits({ const patchResp = await octokit.rest.repos.compareCommitsWithBasehead({
owner: ctx.repo.owner, owner: ctx.repo.owner,
repo: ctx.repo.repo, repo: ctx.repo.repo,
base: ctx.payload.before, basehead: `${ctx.payload.before}...${ctx.payload.after}`,
head: ctx.payload.after,
mediaType: { mediaType: {
format: `diff`, format: `diff`,
}, },
@@ -192,21 +185,32 @@ async function runLint(lintPath: string, patchPath: string): Promise<void> {
const userArgsMap = new Map<string, string>(userArgsList) const userArgsMap = new Map<string, string>(userArgsList)
const userArgNames = new Set<string>(userArgsList.map(([key]) => key)) const userArgNames = new Set<string>(userArgsList.map(([key]) => key))
const annotations = core.getInput(`annotations`).trim() !== "false" const problemMatchers = core.getBooleanInput(`problem-matchers`)
if (problemMatchers) {
const matchersPath = path.join(__dirname, "../..", "problem-matchers.json")
if (fs.existsSync(matchersPath)) {
// Adds problem matchers.
// https://github.com/actions/setup-go/blob/cdcb36043654635271a94b9a6d1392de5bb323a7/src/main.ts#L81-L83
core.info(`##[add-matcher]${matchersPath}`)
}
}
if (annotations) {
const formats = (userArgsMap.get("out-format") || "") const formats = (userArgsMap.get("out-format") || "")
.trim() .trim()
.split(",") .split(",")
.filter((f) => f.length > 0) .filter((f) => f.length > 0)
.filter((f) => !f.startsWith(`github-actions`)) .filter((f) => !f.startsWith(`github-actions`)) // Removes `github-actions` format.
.concat("github-actions")
.join(",") .join(",")
if (formats) {
// Adds formats but without `github-actions` format.
addedArgs.push(`--out-format=${formats}`) addedArgs.push(`--out-format=${formats}`)
userArgs = userArgs.replace(/--out-format=\S*/gi, "").trim()
} }
// Removes `--out-format` from the user flags because it's already inside `addedArgs`.
userArgs = userArgs.replace(/--out-format=\S*/gi, "").trim()
if (isOnlyNewIssues()) { if (isOnlyNewIssues()) {
if (userArgNames.has(`new`) || userArgNames.has(`new-from-rev`) || userArgNames.has(`new-from-patch`)) { if (userArgNames.has(`new`) || userArgNames.has(`new-from-rev`) || userArgNames.has(`new-from-patch`)) {
throw new Error(`please, don't specify manually --new* args when requesting only new issues`) throw new Error(`please, don't specify manually --new* args when requesting only new issues`)
@@ -240,8 +244,9 @@ async function runLint(lintPath: string, patchPath: string): Promise<void> {
} }
} }
const workingDirectory = core.getInput(`working-directory`)
const cmdArgs: ExecOptions = {} const cmdArgs: ExecOptions = {}
const workingDirectory = core.getInput(`working-directory`)
if (workingDirectory) { if (workingDirectory) {
if (!fs.existsSync(workingDirectory) || !fs.lstatSync(workingDirectory).isDirectory()) { if (!fs.existsSync(workingDirectory) || !fs.lstatSync(workingDirectory).isDirectory()) {
throw new Error(`working-directory (${workingDirectory}) was not a path`) throw new Error(`working-directory (${workingDirectory}) was not a path`)
@@ -254,7 +259,7 @@ async function runLint(lintPath: string, patchPath: string): Promise<void> {
const cmd = `${lintPath} run ${addedArgs.join(` `)} ${userArgs}`.trimEnd() const cmd = `${lintPath} run ${addedArgs.join(` `)} ${userArgs}`.trimEnd()
core.info(`Running [${cmd}] in [${cmdArgs.cwd || ``}] ...`) core.info(`Running [${cmd}] in [${cmdArgs.cwd || process.cwd()}] ...`)
const startedAt = Date.now() const startedAt = Date.now()
try { try {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB