diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e3545a7755..1f73f474d0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -54,8 +54,8 @@ jobs: version: - "" - "latest" - - "v1.63" # TODO(ldez): it should be updated for v2. - - "v1.63.4" # TODO(ldez): it should be updated for v2. + - "v2.0" + - "v2.0.0" runs-on: ${{ matrix.os }} permissions: contents: read @@ -83,8 +83,8 @@ jobs: version: - "" - "latest" - - "v1.63.4" # TODO(ldez): it should be updated for v2. - - "95c39ac1fbaf66475705c06c16259ffd9d6bf9a2" # TODO(ldez): it should be updated for v2. + - "v2.0.0" + - "1f032fbc4b117e4247b19ff606cc847ab5383bc9" runs-on: ${{ matrix.os }} permissions: contents: read diff --git a/.golangci.yml b/.golangci.yml index ad24fce4c0..e6015c66b6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,6 +1,7 @@ +version: "2" + output: show-stats: true - sort-results: true sort-order: + - file - linter - - file \ No newline at end of file diff --git a/README.md b/README.md index e9e8035be2..d8f77ec194 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,13 @@ The action runs [golangci-lint](https://github.com/golangci/golangci-lint) and r ## Supporting Us - +[![GitHub Sponsors](https://img.shields.io/badge/GitHub-Donate-blue?logo=github&style=for-the-badge)](https://github.com/sponsors/golangci) [![Open Collective backers and sponsors](https://img.shields.io/badge/OpenCollective-Donate-blue?logo=opencollective&style=for-the-badge)](https://opencollective.com/golangci-lint) [![Linter Authors](https://img.shields.io/badge/Linter_Authors-Donate-blue?style=for-the-badge)](https://golangci-lint.run/product/thanks/) `golangci-lint` is a free and open-source project built by volunteers. -If you value it, consider supporting us, we appreciate it! :heart: +If you value it, consider supporting us; we appreciate it! :heart: ## How to use @@ -54,9 +54,9 @@ jobs: with: go-version: stable - name: golangci-lint - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v7 with: - version: v1.64 + version: v2.0 ``` @@ -92,9 +92,9 @@ jobs: with: go-version: ${{ matrix.go }} - name: golangci-lint - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v7 with: - version: v1.64 + version: v2.0 ``` You will also likely need to add the following `.gitattributes` file to ensure that line endings for Windows builds are properly formatted: @@ -120,7 +120,7 @@ on: env: GO_VERSION: stable - GOLANGCI_LINT_VERSION: v1.64 + GOLANGCI_LINT_VERSION: v2.1 jobs: detect-modules: @@ -147,10 +147,11 @@ jobs: with: go-version: ${{ env.GO_VERSION }} - name: golangci-lint ${{ matrix.modules }} - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v7 with: version: ${{ env.GOLANGCI_LINT_VERSION }} working-directory: ${{ matrix.modules }} + args: --path-mode=abs ``` @@ -179,7 +180,7 @@ jobs: with: os: ${{ matrix.os }} go-version: ${{ matrix.go-version }} - golangci-lint-version: v1.64 + golangci-lint-version: v2.1 ``` ```yaml @@ -201,7 +202,7 @@ on: golangci-lint-version: description: 'Golangci-lint version' type: string - default: 'v1.64' + default: 'v2.1' jobs: detect-modules: @@ -229,10 +230,11 @@ jobs: with: go-version: ${{ inputs.go-version }} - name: golangci-lint ${{ matrix.modules }} - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v7 with: version: ${{ inputs.golangci-lint-version }} working-directory: ${{ matrix.modules }} + args: --path-mode=abs ``` You will also likely need to add the following `.gitattributes` file to ensure that line endings for Windows builds are properly formatted: @@ -245,12 +247,13 @@ You will also likely need to add the following `.gitattributes` file to ensure t ## Compatibility +* `v7.0.0` supports golangci-lint v2 only. * `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`. * `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. * `v2.0.0+` works with `golangci-lint` version >= `v1.28.3` -* `v1.2.2` is deprecated due to we forgot to change the minimum version of `golangci-lint` to `v1.28.3` ([issue](https://github.com/golangci/golangci-lint-action/issues/39)) +* `v1.2.2` is deprecated because we forgot to change the minimum version of `golangci-lint` to `v1.28.3` ([issue](https://github.com/golangci/golangci-lint-action/issues/39)) * `v1.2.1` works with `golangci-lint` version >= `v1.14.0` ([issue](https://github.com/golangci/golangci-lint-action/issues/39)) ## Options @@ -262,17 +265,17 @@ You will also likely need to add the following `.gitattributes` file to ensure t 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. -* `goinstall`: the value can be v1.2.3, `latest`, or the hash of a commit. +* `binary` (default): the value can be v2.3 or v2.3.4 or `latest` to use the latest version. +* `goinstall`: the value can be v2.3.4, `latest`, or the hash of a commit. * `none`: the value is ignored.
Example ```yml -uses: golangci/golangci-lint-action@v6 +uses: golangci/golangci-lint-action@v7 with: - version: v1.58 + version: v2.0 # ... ``` @@ -290,7 +293,7 @@ The default value is `binary`. Example ```yml -uses: golangci/golangci-lint-action@v6 +uses: golangci/golangci-lint-action@v7 with: install-mode: "goinstall" # ... @@ -310,7 +313,7 @@ By default, it uses the `github.token` from the action. Example ```yml -uses: golangci/golangci-lint-action@v6 +uses: golangci/golangci-lint-action@v7 with: github-token: xxx # ... @@ -324,16 +327,16 @@ with: This option is `true` by default. -If the GitHub Action detects configuration file the validation will be performed unless this option is set to `false`. +If the GitHub Action detects a configuration file, the validation will be performed unless this option is set to `false`. If there is no configuration file, the validation is skipped. -The JSONSchema used to validate the configuration depends on the version of golangci-lint you are using. +The JSON Schema used to validate the configuration depends on the version of golangci-lint you are using.
Example ```yml -uses: golangci/golangci-lint-action@v6 +uses: golangci/golangci-lint-action@v7 with: verify: false # ... @@ -349,8 +352,8 @@ Show only new issues. The default value is `false`. -* `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`. +* `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 uses 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 uses 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. @@ -358,7 +361,7 @@ The default value is `false`. Example ```yml -uses: golangci/golangci-lint-action@v6 +uses: golangci/golangci-lint-action@v7 with: only-new-issues: true # ... @@ -376,7 +379,7 @@ Working directory, useful for monorepos. Example ```yml -uses: golangci/golangci-lint-action@v6 +uses: golangci/golangci-lint-action@v7 with: working-directory: somedir # ... @@ -390,16 +393,22 @@ with: golangci-lint command line arguments. -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=` +> [!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=`. + +> [!IMPORTANT] +> Adding a `=` between the flag name and its value is important because the action parses the arguments on spaces.
Example ```yml -uses: golangci/golangci-lint-action@v6 +uses: golangci/golangci-lint-action@v7 with: - args: --timeout=30m --config=/my/path/.golangci.yml --issues-exit-code=0 + # In some rare cases, + # you could have to use `${{ github.workspace }}` as base directory to reference your configuration file. + args: --config=/my/path/.golangci.yml --issues-exit-code=0 # ... ``` @@ -411,9 +420,9 @@ with: 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`). +By default, the [problem matcher of Go (`actions/setup-go`)](https://github.com/actions/setup-go/blob/main/matchers.json) already handles the default golangci-lint output (`text`). -Works only with `colored-line-number` (the golangci-lint default). +Works only with `text` format (the golangci-lint default). https://golangci-lint.run/usage/configuration/#output-configuration @@ -423,7 +432,7 @@ The default value is `false`. Example ```yml -uses: golangci/golangci-lint-action@v6 +uses: golangci/golangci-lint-action@v7 with: problem-matchers: true # ... @@ -444,7 +453,7 @@ The default value is `false`. Example ```yml -uses: golangci/golangci-lint-action@v6 +uses: golangci/golangci-lint-action@v7 with: skip-cache: true # ... @@ -456,7 +465,7 @@ with: (optional) -If set to `true`, caches will not be saved, but they may still be restored, required `skip-cache: false`. +If set to `true`, caches will not be saved, but they may still be restored, requiring `skip-cache: false`. The default value is `false`. @@ -464,7 +473,7 @@ The default value is `false`. Example ```yml -uses: golangci/golangci-lint-action@v6 +uses: golangci/golangci-lint-action@v7 with: skip-save-cache: true # ... @@ -480,13 +489,13 @@ Periodically invalidate the cache every `cache-invalidation-interval` days to en The default value is `7`. -If set the number is `<= 0`, the cache will be always invalidate (Not recommended). +If the number is `<= 0`, the cache will always be invalidated (Not recommended).
Example ```yml -uses: golangci/golangci-lint-action@v6 +uses: golangci/golangci-lint-action@v7 with: cache-invalidation-interval: 15 # ... @@ -505,7 +514,7 @@ The restrictions of annotations are the following: If you would like to have comments - please, up-vote [the issue](https://github.com/golangci/golangci-lint-action/issues/5). 3. The number of annotations is [limited](https://github.com/actions/toolkit/blob/main/docs/problem-matchers.md#limitations). -To enable annotations, you need to add the `checks` permission to your action. +Permissions required: ```yaml annotate permissions: @@ -513,17 +522,15 @@ permissions: contents: read # Optional: allow read access to pull request. Use with `only-new-issues` option. pull-requests: read - # Optional: allow write access to checks to allow the action to annotate code in the PR. - checks: write ``` -For annotations to work use the default `colored-line-number` output and either use `actions/setup-go` in the job or enable the internal [problem matchers](#problem-matchers). +For annotations to work, use the default format output (`text`) and either use `actions/setup-go` in the job or enable the internal [problem matchers](#problem-matchers). ## Performance The action was implemented with performance in mind: -1. We cache data from golangci-lint analysis between builds by using [@actions/cache](https://github.com/actions/toolkit/tree/HEAD/packages/cache). +1. We cache data from golangci-lint analysis between builds by using [@actions/cache](https://github.com/actions/toolkit/tree/HEAD/packages/cache). 2. We don't use Docker because image pulling is slow. 3. We do as much as we can in parallel, e.g. we download cache, and golangci-lint binary in parallel. diff --git a/action.yml b/action.yml index 1db3570795..23f71a9e0e 100644 --- a/action.yml +++ b/action.yml @@ -7,8 +7,8 @@ inputs: description: | 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. - - `goinstall`: the value can be v1.2.3, `latest`, or the hash of a commit. + - `binary` (default): the value can be v2.3 or v2.3.4 or `latest` to use the latest version. + - `goinstall`: the value can be v2.3.4, `latest`, or the hash of a commit. - `none`: the value is ignored. required: false install-mode: diff --git a/dist/post_run/index.js b/dist/post_run/index.js index f4bd235e75..315c400725 100644 --- a/dist/post_run/index.js +++ b/dist/post_run/index.js @@ -220,7 +220,7 @@ function restoreCacheV2(paths, primaryKey, restoreKeys, options, enableCrossOsAr }; const response = yield twirpClient.GetCacheEntryDownloadURL(request); if (!response.ok) { - core.debug(`Cache not found for keys: ${keys.join(', ')}`); + core.debug(`Cache not found for version ${request.version} of keys: ${keys.join(', ')}`); return undefined; } core.info(`Cache hit for: ${request.key}`); @@ -2204,6 +2204,7 @@ const cacheUtils_1 = __nccwpck_require__(680); const auth_1 = __nccwpck_require__(4552); const http_client_1 = __nccwpck_require__(4844); const cache_twirp_client_1 = __nccwpck_require__(1486); +const util_1 = __nccwpck_require__(7564); /** * This class is a wrapper around the CacheServiceClientJSON class generated by Twirp. * @@ -2263,6 +2264,7 @@ class CacheServiceClient { (0, core_1.debug)(`[Response] - ${response.message.statusCode}`); (0, core_1.debug)(`Headers: ${JSON.stringify(response.message.headers, null, 2)}`); const body = JSON.parse(rawBody); + (0, util_1.maskSecretUrls)(body); (0, core_1.debug)(`Body: ${JSON.stringify(body, null, 2)}`); if (this.isSuccessStatusCode(statusCode)) { return { response, body }; @@ -2444,6 +2446,87 @@ exports.getUserAgentString = getUserAgentString; /***/ }), +/***/ 7564: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.maskSecretUrls = exports.maskSigUrl = void 0; +const core_1 = __nccwpck_require__(7484); +/** + * Masks the `sig` parameter in a URL and sets it as a secret. + * + * @param url - The URL containing the signature parameter to mask + * @remarks + * This function attempts to parse the provided URL and identify the 'sig' query parameter. + * If found, it registers both the raw and URL-encoded signature values as secrets using + * the Actions `setSecret` API, which prevents them from being displayed in logs. + * + * The function handles errors gracefully if URL parsing fails, logging them as debug messages. + * + * @example + * ```typescript + * // Mask a signature in an Azure SAS token URL + * maskSigUrl('https://example.blob.core.windows.net/container/file.txt?sig=abc123&se=2023-01-01'); + * ``` + */ +function maskSigUrl(url) { + if (!url) + return; + try { + const parsedUrl = new URL(url); + const signature = parsedUrl.searchParams.get('sig'); + if (signature) { + (0, core_1.setSecret)(signature); + (0, core_1.setSecret)(encodeURIComponent(signature)); + } + } + catch (error) { + (0, core_1.debug)(`Failed to parse URL: ${url} ${error instanceof Error ? error.message : String(error)}`); + } +} +exports.maskSigUrl = maskSigUrl; +/** + * Masks sensitive information in URLs containing signature parameters. + * Currently supports masking 'sig' parameters in the 'signed_upload_url' + * and 'signed_download_url' properties of the provided object. + * + * @param body - The object should contain a signature + * @remarks + * This function extracts URLs from the object properties and calls maskSigUrl + * on each one to redact sensitive signature information. The function doesn't + * modify the original object; it only marks the signatures as secrets for + * logging purposes. + * + * @example + * ```typescript + * const responseBody = { + * signed_upload_url: 'https://blob.core.windows.net/?sig=abc123', + * signed_download_url: 'https://blob.core/windows.net/?sig=def456' + * }; + * maskSecretUrls(responseBody); + * ``` + */ +function maskSecretUrls(body) { + if (typeof body !== 'object' || body === null) { + (0, core_1.debug)('body is not an object or is null'); + return; + } + if ('signed_upload_url' in body && + typeof body.signed_upload_url === 'string') { + maskSigUrl(body.signed_upload_url); + } + if ('signed_download_url' in body && + typeof body.signed_download_url === 'string') { + maskSigUrl(body.signed_download_url); + } +} +exports.maskSecretUrls = maskSecretUrls; +//# sourceMappingURL=util.js.map + +/***/ }), + /***/ 5321: /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { @@ -62206,7 +62289,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ -/* global global, define, Symbol, Reflect, Promise, SuppressedError */ +/* global global, define, Symbol, Reflect, Promise, SuppressedError, Iterator */ var __extends; var __assign; var __rest; @@ -62238,6 +62321,7 @@ var __classPrivateFieldIn; var __createBinding; var __addDisposableResource; var __disposeResources; +var __rewriteRelativeImportExtension; (function (factory) { var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {}; if (typeof define === "function" && define.amd) { @@ -62365,8 +62449,8 @@ var __disposeResources; }; __generator = function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); @@ -62470,10 +62554,11 @@ var __disposeResources; __asyncGenerator = function (thisArg, _arguments, generator) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i; + function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; } + function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } @@ -62504,10 +62589,19 @@ var __disposeResources; o["default"] = v; }; + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + __importStar = function (mod) { if (mod && mod.__esModule) return mod; var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; @@ -62537,7 +62631,7 @@ var __disposeResources; __addDisposableResource = function (env, value, async) { if (value !== null && value !== void 0) { if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected."); - var dispose; + var dispose, inner; if (async) { if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined."); dispose = value[Symbol.asyncDispose]; @@ -62545,8 +62639,10 @@ var __disposeResources; if (dispose === void 0) { if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined."); dispose = value[Symbol.dispose]; + if (async) inner = dispose; } if (typeof dispose !== "function") throw new TypeError("Object not disposable."); + if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } }; env.stack.push({ value: value, dispose: dispose, async: async }); } else if (async) { @@ -62565,22 +62661,36 @@ var __disposeResources; env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; env.hasError = true; } + var r, s = 0; function next() { - while (env.stack.length) { - var rec = env.stack.pop(); + while (r = env.stack.pop()) { try { - var result = rec.dispose && rec.dispose.call(rec.value); - if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next); + if (r.dispose) { + var result = r.dispose.call(r.value); + if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + } + else s |= 1; } catch (e) { fail(e); } } + if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve(); if (env.hasError) throw env.error; } return next(); }; + __rewriteRelativeImportExtension = function (path, preserveJsx) { + if (typeof path === "string" && /^\.\.?\//.test(path)) { + return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) { + return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js"); + }); + } + return path; + }; + exporter("__extends", __extends); exporter("__assign", __assign); exporter("__rest", __rest); @@ -62612,7 +62722,10 @@ var __disposeResources; exporter("__classPrivateFieldIn", __classPrivateFieldIn); exporter("__addDisposableResource", __addDisposableResource); exporter("__disposeResources", __disposeResources); + exporter("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension); }); + +0 && (0); /***/ }), @@ -92538,11 +92651,9 @@ async function goInstall(versionInfo) { core.info(`Installing golangci-lint ${versionInfo.TargetVersion}...`); const startedAt = Date.now(); const options = { env: { ...process.env, CGO_ENABLED: "1" } }; - // TODO(ldez): it should be updated for v2. - const exres = await execShellCommand(`go install github.com/golangci/golangci-lint/cmd/golangci-lint@${versionInfo.TargetVersion}`, options); + const exres = await execShellCommand(`go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@${versionInfo.TargetVersion}`, options); printOutput(exres); - // TODO(ldez): it should be updated for v2. - const res = await execShellCommand(`go install -n github.com/golangci/golangci-lint/cmd/golangci-lint@${versionInfo.TargetVersion}`, options); + const res = await execShellCommand(`go install -n github.com/golangci/golangci-lint/v2/cmd/golangci-lint@${versionInfo.TargetVersion}`, options); printOutput(res); // The output of `go install -n` when the binary is already installed is `touch `. const binPath = res.stderr @@ -92843,7 +92954,7 @@ async function runLint(binPath, patchPath) { const res = await execShellCommand(`${binPath} cache status`); printOutput(res); } - let userArgs = core.getInput(`args`); + const userArgs = core.getInput(`args`); const addedArgs = []; const userArgsList = userArgs .trim() @@ -92863,20 +92974,11 @@ async function runLint(binPath, patchPath) { core.info(`##[add-matcher]${matchersPath}`); } } - const formats = (userArgsMap.get("out-format") || "") - .trim() - .split(",") - .filter((f) => f.length > 0) - .filter((f) => !f.startsWith(`github-actions`)) // Removes `github-actions` format. - .join(","); - if (formats) { - // Adds formats but without `github-actions` format. - addedArgs.push(`--out-format=${formats}`); - } - // Removes `--out-format` from the user flags because it's already inside `addedArgs`. - userArgs = userArgs.replace(/--out-format=\S*/gi, "").trim(); if ((0, patch_1.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`) || + userArgNames.has(`new-from-merge-base`)) { throw new Error(`please, don't specify manually --new* args when requesting only new issues`); } const ctx = github.context; @@ -92890,6 +92992,7 @@ async function runLint(binPath, patchPath) { // Override config values. addedArgs.push(`--new=false`); addedArgs.push(`--new-from-rev=`); + addedArgs.push(`--new-from-merge-base=`); } break; case `merge_group`: @@ -92897,6 +93000,7 @@ async function runLint(binPath, patchPath) { // Override config values. addedArgs.push(`--new=false`); addedArgs.push(`--new-from-patch=`); + addedArgs.push(`--new-from-merge-base=`); break; default: break; @@ -92924,7 +93028,6 @@ async function runLint(binPath, patchPath) { } catch (exc) { // This logging passes issues to GitHub annotations but comments can be more convenient for some users. - // TODO: support reviewdog or leaving comments by GitHub API. printOutput(exc); if (exc.code === 1) { core.setFailed(`issues found`); @@ -93203,20 +93306,17 @@ const fs = __importStar(__nccwpck_require__(9896)); const path_1 = __importDefault(__nccwpck_require__(6928)); const install_1 = __nccwpck_require__(232); const versionRe = /^v(\d+)\.(\d+)(?:\.(\d+))?$/; -// TODO(ldez): it should be updated to match v2 module name. -const modVersionRe = /github.com\/golangci\/golangci-lint\s(v\S+)/; +const modVersionRe = /github.com\/golangci\/golangci-lint\/v2\s(v\S+)/; const parseVersion = (s) => { if (s == "latest" || s == "") { - // TODO(ldez): v2: it should be replaced with "return null" - return { major: 1, minor: 64, patch: 8 }; + return null; } const match = s.match(versionRe); if (!match) { throw new Error(`invalid version string '${s}', expected format v1.2 or v1.2.3`); } - // TODO(ldez): v2: to remove. - if (parseInt(match[1]) > 1) { - throw new Error(`invalid version string '${s}', golangci-lint v2 is not supported by golangci-lint-action v6, you must update to golangci-lint-action v7.`); + if (parseInt(match[1]) !== 2) { + throw new Error(`invalid version string '${s}', golangci-lint v${match[1]} is not supported by golangci-lint-action v7.`); } return { major: parseInt(match[1]), @@ -93231,11 +93331,10 @@ const stringifyVersion = (v) => { return `v${v.major}.${v.minor}${v.patch !== null ? `.${v.patch}` : ``}`; }; exports.stringifyVersion = stringifyVersion; -// TODO(ldez): it should be updated to v2.0.0. const minVersion = { - major: 1, - minor: 28, - patch: 3, + major: 2, + minor: 0, + patch: 0, }; const isLessVersion = (a, b) => { if (a == null) { @@ -93281,7 +93380,7 @@ const fetchVersionMapping = async () => { maxRetries: 5, }); try { - const url = `https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/assets/github-action-config-v1.json`; + const url = `https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/assets/github-action-config-v2.json`; const response = await http.get(url); if (response.message.statusCode !== 200) { throw new Error(`failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`); @@ -93297,17 +93396,11 @@ async function getVersion(mode) { core.info(`Finding needed golangci-lint version...`); if (mode == install_1.InstallMode.GoInstall) { const v = core.getInput(`version`); - // TODO(ldez): v2: to remove. - if (v == "latest") { - return { TargetVersion: "v1.64.8" }; - } - // TODO(ldez): v2: "v1.64.8" should be replaced with "latest". - return { TargetVersion: v ? v : "v1.64.8" }; + return { TargetVersion: v ? v : "latest" }; } const reqVersion = getRequestedVersion(); // if the patched version is passed, just use it - // TODO(ldez): should be updated to `reqVersion?.major === 2`. - if (reqVersion?.major === 1 && reqVersion?.minor != null && reqVersion?.patch !== null) { + if (reqVersion?.major === 2 && reqVersion?.minor != null && reqVersion?.patch !== null) { return new Promise((resolve) => { const versionWithoutV = `${reqVersion.major}.${reqVersion.minor}.${reqVersion.patch}`; resolve({ TargetVersion: `v${versionWithoutV}` }); @@ -97982,7 +98075,7 @@ const checkStat = (stat, path, options) => stat.isFile() && checkPathExt(path, o /***/ ((module) => { "use strict"; -module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"4.0.2","preview":true,"description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","main":"lib/cache.js","types":"lib/cache.d.ts","directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^1.11.1","@actions/exec":"^1.0.1","@actions/glob":"^0.1.0","@actions/http-client":"^2.1.1","@actions/io":"^1.0.1","@azure/abort-controller":"^1.1.0","@azure/ms-rest-js":"^2.6.0","@azure/storage-blob":"^12.13.0","@protobuf-ts/plugin":"^2.9.4","semver":"^6.3.1"},"devDependencies":{"@types/semver":"^6.0.0","typescript":"^5.2.2"}}'); +module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"4.0.3","preview":true,"description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","main":"lib/cache.js","types":"lib/cache.d.ts","directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^1.11.1","@actions/exec":"^1.0.1","@actions/glob":"^0.1.0","@actions/http-client":"^2.1.1","@actions/io":"^1.0.1","@azure/abort-controller":"^1.1.0","@azure/ms-rest-js":"^2.6.0","@azure/storage-blob":"^12.13.0","@protobuf-ts/plugin":"^2.9.4","semver":"^6.3.1"},"devDependencies":{"@types/node":"^22.13.9","@types/semver":"^6.0.0","typescript":"^5.2.2"}}'); /***/ }), diff --git a/dist/run/index.js b/dist/run/index.js index 6a334e0df4..354785592d 100644 --- a/dist/run/index.js +++ b/dist/run/index.js @@ -220,7 +220,7 @@ function restoreCacheV2(paths, primaryKey, restoreKeys, options, enableCrossOsAr }; const response = yield twirpClient.GetCacheEntryDownloadURL(request); if (!response.ok) { - core.debug(`Cache not found for keys: ${keys.join(', ')}`); + core.debug(`Cache not found for version ${request.version} of keys: ${keys.join(', ')}`); return undefined; } core.info(`Cache hit for: ${request.key}`); @@ -2204,6 +2204,7 @@ const cacheUtils_1 = __nccwpck_require__(680); const auth_1 = __nccwpck_require__(4552); const http_client_1 = __nccwpck_require__(4844); const cache_twirp_client_1 = __nccwpck_require__(1486); +const util_1 = __nccwpck_require__(7564); /** * This class is a wrapper around the CacheServiceClientJSON class generated by Twirp. * @@ -2263,6 +2264,7 @@ class CacheServiceClient { (0, core_1.debug)(`[Response] - ${response.message.statusCode}`); (0, core_1.debug)(`Headers: ${JSON.stringify(response.message.headers, null, 2)}`); const body = JSON.parse(rawBody); + (0, util_1.maskSecretUrls)(body); (0, core_1.debug)(`Body: ${JSON.stringify(body, null, 2)}`); if (this.isSuccessStatusCode(statusCode)) { return { response, body }; @@ -2444,6 +2446,87 @@ exports.getUserAgentString = getUserAgentString; /***/ }), +/***/ 7564: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.maskSecretUrls = exports.maskSigUrl = void 0; +const core_1 = __nccwpck_require__(7484); +/** + * Masks the `sig` parameter in a URL and sets it as a secret. + * + * @param url - The URL containing the signature parameter to mask + * @remarks + * This function attempts to parse the provided URL and identify the 'sig' query parameter. + * If found, it registers both the raw and URL-encoded signature values as secrets using + * the Actions `setSecret` API, which prevents them from being displayed in logs. + * + * The function handles errors gracefully if URL parsing fails, logging them as debug messages. + * + * @example + * ```typescript + * // Mask a signature in an Azure SAS token URL + * maskSigUrl('https://example.blob.core.windows.net/container/file.txt?sig=abc123&se=2023-01-01'); + * ``` + */ +function maskSigUrl(url) { + if (!url) + return; + try { + const parsedUrl = new URL(url); + const signature = parsedUrl.searchParams.get('sig'); + if (signature) { + (0, core_1.setSecret)(signature); + (0, core_1.setSecret)(encodeURIComponent(signature)); + } + } + catch (error) { + (0, core_1.debug)(`Failed to parse URL: ${url} ${error instanceof Error ? error.message : String(error)}`); + } +} +exports.maskSigUrl = maskSigUrl; +/** + * Masks sensitive information in URLs containing signature parameters. + * Currently supports masking 'sig' parameters in the 'signed_upload_url' + * and 'signed_download_url' properties of the provided object. + * + * @param body - The object should contain a signature + * @remarks + * This function extracts URLs from the object properties and calls maskSigUrl + * on each one to redact sensitive signature information. The function doesn't + * modify the original object; it only marks the signatures as secrets for + * logging purposes. + * + * @example + * ```typescript + * const responseBody = { + * signed_upload_url: 'https://blob.core.windows.net/?sig=abc123', + * signed_download_url: 'https://blob.core/windows.net/?sig=def456' + * }; + * maskSecretUrls(responseBody); + * ``` + */ +function maskSecretUrls(body) { + if (typeof body !== 'object' || body === null) { + (0, core_1.debug)('body is not an object or is null'); + return; + } + if ('signed_upload_url' in body && + typeof body.signed_upload_url === 'string') { + maskSigUrl(body.signed_upload_url); + } + if ('signed_download_url' in body && + typeof body.signed_download_url === 'string') { + maskSigUrl(body.signed_download_url); + } +} +exports.maskSecretUrls = maskSecretUrls; +//# sourceMappingURL=util.js.map + +/***/ }), + /***/ 5321: /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { @@ -62206,7 +62289,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ -/* global global, define, Symbol, Reflect, Promise, SuppressedError */ +/* global global, define, Symbol, Reflect, Promise, SuppressedError, Iterator */ var __extends; var __assign; var __rest; @@ -62238,6 +62321,7 @@ var __classPrivateFieldIn; var __createBinding; var __addDisposableResource; var __disposeResources; +var __rewriteRelativeImportExtension; (function (factory) { var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {}; if (typeof define === "function" && define.amd) { @@ -62365,8 +62449,8 @@ var __disposeResources; }; __generator = function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); @@ -62470,10 +62554,11 @@ var __disposeResources; __asyncGenerator = function (thisArg, _arguments, generator) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i; + function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; } + function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } @@ -62504,10 +62589,19 @@ var __disposeResources; o["default"] = v; }; + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + __importStar = function (mod) { if (mod && mod.__esModule) return mod; var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; @@ -62537,7 +62631,7 @@ var __disposeResources; __addDisposableResource = function (env, value, async) { if (value !== null && value !== void 0) { if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected."); - var dispose; + var dispose, inner; if (async) { if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined."); dispose = value[Symbol.asyncDispose]; @@ -62545,8 +62639,10 @@ var __disposeResources; if (dispose === void 0) { if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined."); dispose = value[Symbol.dispose]; + if (async) inner = dispose; } if (typeof dispose !== "function") throw new TypeError("Object not disposable."); + if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } }; env.stack.push({ value: value, dispose: dispose, async: async }); } else if (async) { @@ -62565,22 +62661,36 @@ var __disposeResources; env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; env.hasError = true; } + var r, s = 0; function next() { - while (env.stack.length) { - var rec = env.stack.pop(); + while (r = env.stack.pop()) { try { - var result = rec.dispose && rec.dispose.call(rec.value); - if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next); + if (r.dispose) { + var result = r.dispose.call(r.value); + if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + } + else s |= 1; } catch (e) { fail(e); } } + if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve(); if (env.hasError) throw env.error; } return next(); }; + __rewriteRelativeImportExtension = function (path, preserveJsx) { + if (typeof path === "string" && /^\.\.?\//.test(path)) { + return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) { + return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js"); + }); + } + return path; + }; + exporter("__extends", __extends); exporter("__assign", __assign); exporter("__rest", __rest); @@ -62612,7 +62722,10 @@ var __disposeResources; exporter("__classPrivateFieldIn", __classPrivateFieldIn); exporter("__addDisposableResource", __addDisposableResource); exporter("__disposeResources", __disposeResources); + exporter("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension); }); + +0 && (0); /***/ }), @@ -92538,11 +92651,9 @@ async function goInstall(versionInfo) { core.info(`Installing golangci-lint ${versionInfo.TargetVersion}...`); const startedAt = Date.now(); const options = { env: { ...process.env, CGO_ENABLED: "1" } }; - // TODO(ldez): it should be updated for v2. - const exres = await execShellCommand(`go install github.com/golangci/golangci-lint/cmd/golangci-lint@${versionInfo.TargetVersion}`, options); + const exres = await execShellCommand(`go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@${versionInfo.TargetVersion}`, options); printOutput(exres); - // TODO(ldez): it should be updated for v2. - const res = await execShellCommand(`go install -n github.com/golangci/golangci-lint/cmd/golangci-lint@${versionInfo.TargetVersion}`, options); + const res = await execShellCommand(`go install -n github.com/golangci/golangci-lint/v2/cmd/golangci-lint@${versionInfo.TargetVersion}`, options); printOutput(res); // The output of `go install -n` when the binary is already installed is `touch `. const binPath = res.stderr @@ -92843,7 +92954,7 @@ async function runLint(binPath, patchPath) { const res = await execShellCommand(`${binPath} cache status`); printOutput(res); } - let userArgs = core.getInput(`args`); + const userArgs = core.getInput(`args`); const addedArgs = []; const userArgsList = userArgs .trim() @@ -92863,20 +92974,11 @@ async function runLint(binPath, patchPath) { core.info(`##[add-matcher]${matchersPath}`); } } - const formats = (userArgsMap.get("out-format") || "") - .trim() - .split(",") - .filter((f) => f.length > 0) - .filter((f) => !f.startsWith(`github-actions`)) // Removes `github-actions` format. - .join(","); - if (formats) { - // Adds formats but without `github-actions` format. - addedArgs.push(`--out-format=${formats}`); - } - // Removes `--out-format` from the user flags because it's already inside `addedArgs`. - userArgs = userArgs.replace(/--out-format=\S*/gi, "").trim(); if ((0, patch_1.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`) || + userArgNames.has(`new-from-merge-base`)) { throw new Error(`please, don't specify manually --new* args when requesting only new issues`); } const ctx = github.context; @@ -92890,6 +92992,7 @@ async function runLint(binPath, patchPath) { // Override config values. addedArgs.push(`--new=false`); addedArgs.push(`--new-from-rev=`); + addedArgs.push(`--new-from-merge-base=`); } break; case `merge_group`: @@ -92897,6 +93000,7 @@ async function runLint(binPath, patchPath) { // Override config values. addedArgs.push(`--new=false`); addedArgs.push(`--new-from-patch=`); + addedArgs.push(`--new-from-merge-base=`); break; default: break; @@ -92924,7 +93028,6 @@ async function runLint(binPath, patchPath) { } catch (exc) { // This logging passes issues to GitHub annotations but comments can be more convenient for some users. - // TODO: support reviewdog or leaving comments by GitHub API. printOutput(exc); if (exc.code === 1) { core.setFailed(`issues found`); @@ -93203,20 +93306,17 @@ const fs = __importStar(__nccwpck_require__(9896)); const path_1 = __importDefault(__nccwpck_require__(6928)); const install_1 = __nccwpck_require__(232); const versionRe = /^v(\d+)\.(\d+)(?:\.(\d+))?$/; -// TODO(ldez): it should be updated to match v2 module name. -const modVersionRe = /github.com\/golangci\/golangci-lint\s(v\S+)/; +const modVersionRe = /github.com\/golangci\/golangci-lint\/v2\s(v\S+)/; const parseVersion = (s) => { if (s == "latest" || s == "") { - // TODO(ldez): v2: it should be replaced with "return null" - return { major: 1, minor: 64, patch: 8 }; + return null; } const match = s.match(versionRe); if (!match) { throw new Error(`invalid version string '${s}', expected format v1.2 or v1.2.3`); } - // TODO(ldez): v2: to remove. - if (parseInt(match[1]) > 1) { - throw new Error(`invalid version string '${s}', golangci-lint v2 is not supported by golangci-lint-action v6, you must update to golangci-lint-action v7.`); + if (parseInt(match[1]) !== 2) { + throw new Error(`invalid version string '${s}', golangci-lint v${match[1]} is not supported by golangci-lint-action v7.`); } return { major: parseInt(match[1]), @@ -93231,11 +93331,10 @@ const stringifyVersion = (v) => { return `v${v.major}.${v.minor}${v.patch !== null ? `.${v.patch}` : ``}`; }; exports.stringifyVersion = stringifyVersion; -// TODO(ldez): it should be updated to v2.0.0. const minVersion = { - major: 1, - minor: 28, - patch: 3, + major: 2, + minor: 0, + patch: 0, }; const isLessVersion = (a, b) => { if (a == null) { @@ -93281,7 +93380,7 @@ const fetchVersionMapping = async () => { maxRetries: 5, }); try { - const url = `https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/assets/github-action-config-v1.json`; + const url = `https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/assets/github-action-config-v2.json`; const response = await http.get(url); if (response.message.statusCode !== 200) { throw new Error(`failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`); @@ -93297,17 +93396,11 @@ async function getVersion(mode) { core.info(`Finding needed golangci-lint version...`); if (mode == install_1.InstallMode.GoInstall) { const v = core.getInput(`version`); - // TODO(ldez): v2: to remove. - if (v == "latest") { - return { TargetVersion: "v1.64.8" }; - } - // TODO(ldez): v2: "v1.64.8" should be replaced with "latest". - return { TargetVersion: v ? v : "v1.64.8" }; + return { TargetVersion: v ? v : "latest" }; } const reqVersion = getRequestedVersion(); // if the patched version is passed, just use it - // TODO(ldez): should be updated to `reqVersion?.major === 2`. - if (reqVersion?.major === 1 && reqVersion?.minor != null && reqVersion?.patch !== null) { + if (reqVersion?.major === 2 && reqVersion?.minor != null && reqVersion?.patch !== null) { return new Promise((resolve) => { const versionWithoutV = `${reqVersion.major}.${reqVersion.minor}.${reqVersion.patch}`; resolve({ TargetVersion: `v${versionWithoutV}` }); @@ -97982,7 +98075,7 @@ const checkStat = (stat, path, options) => stat.isFile() && checkPathExt(path, o /***/ ((module) => { "use strict"; -module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"4.0.2","preview":true,"description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","main":"lib/cache.js","types":"lib/cache.d.ts","directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^1.11.1","@actions/exec":"^1.0.1","@actions/glob":"^0.1.0","@actions/http-client":"^2.1.1","@actions/io":"^1.0.1","@azure/abort-controller":"^1.1.0","@azure/ms-rest-js":"^2.6.0","@azure/storage-blob":"^12.13.0","@protobuf-ts/plugin":"^2.9.4","semver":"^6.3.1"},"devDependencies":{"@types/semver":"^6.0.0","typescript":"^5.2.2"}}'); +module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"4.0.3","preview":true,"description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","main":"lib/cache.js","types":"lib/cache.d.ts","directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^1.11.1","@actions/exec":"^1.0.1","@actions/glob":"^0.1.0","@actions/http-client":"^2.1.1","@actions/io":"^1.0.1","@azure/abort-controller":"^1.1.0","@azure/ms-rest-js":"^2.6.0","@azure/storage-blob":"^12.13.0","@protobuf-ts/plugin":"^2.9.4","semver":"^6.3.1"},"devDependencies":{"@types/node":"^22.13.9","@types/semver":"^6.0.0","typescript":"^5.2.2"}}'); /***/ }), diff --git a/go.mod b/go.mod index e591614738..2ae3ad2f77 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/golangci/golangci-lint-action -go 1.14 +go 1.23 diff --git a/package-lock.json b/package-lock.json index db5e753663..7d7a84cb82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,45 +1,45 @@ { "name": "golanci-lint-action", - "version": "6.5.2", + "version": "7.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "golanci-lint-action", - "version": "6.5.2", + "version": "7.0.1", "license": "MIT", "dependencies": { - "@actions/cache": "^4.0.2", + "@actions/cache": "^4.0.3", "@actions/core": "^1.11.1", "@actions/exec": "^1.1.1", "@actions/github": "^6.0.0", "@actions/http-client": "^2.2.3", "@actions/tool-cache": "^2.0.2", "@octokit/plugin-retry": "^6.1.0", - "@types/node": "^22.13.10", - "@types/semver": "^7.5.8", + "@types/node": "^22.14.1", + "@types/semver": "^7.7.0", "@types/tmp": "^0.2.6", "@types/which": "^3.0.4", "tmp": "^0.2.3", "which": "^5.0.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^8.26.1", - "@typescript-eslint/parser": "^8.26.1", + "@typescript-eslint/eslint-plugin": "^8.30.1", + "@typescript-eslint/parser": "^8.30.1", "@vercel/ncc": "^0.38.3", "eslint": "^8.57.1", - "eslint-config-prettier": "^10.1.1", + "eslint-config-prettier": "^10.1.2", "eslint-plugin-import": "^2.31.0", - "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-prettier": "^5.2.6", "eslint-plugin-simple-import-sort": "^12.1.1", "prettier": "^3.5.3", - "typescript": "^5.8.2" + "typescript": "^5.8.3" } }, "node_modules/@actions/cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-4.0.2.tgz", - "integrity": "sha512-cBr7JL1q+JKjbBd3w3SZN5OQ1Xg+/D8QLMcE7MpgpghZlL4biBO0ZEeraoTxCZyfN0YY0dxXlLgsgGv/sT5BTg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-4.0.3.tgz", + "integrity": "sha512-SvrqFtYJ7I48A/uXNkoJrnukx5weQv1fGquhs3+4nkByZThBH109KTIqj5x/cGV7JGNvb8dLPVywUOqX1fjiXg==", "license": "MIT", "dependencies": { "@actions/core": "^1.11.1", @@ -634,10 +634,11 @@ } }, "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.1.tgz", + "integrity": "sha512-VzgHzGblFmUeBmmrk55zPyrQIArQN4vujc9shWytaPdB3P7qhi0cpaiKIr7tlCmFv2lYUwnLospIqjL9ZSAhhg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -735,12 +736,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.13.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", - "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/node-fetch": { @@ -766,9 +767,10 @@ } }, "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "license": "MIT" }, "node_modules/@types/tmp": { "version": "0.2.6", @@ -789,17 +791,17 @@ "integrity": "sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz", - "integrity": "sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz", + "integrity": "sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/type-utils": "8.26.1", - "@typescript-eslint/utils": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/type-utils": "8.30.1", + "@typescript-eslint/utils": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -819,16 +821,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.1.tgz", - "integrity": "sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.30.1.tgz", + "integrity": "sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/typescript-estree": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", "debug": "^4.3.4" }, "engines": { @@ -844,14 +846,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz", - "integrity": "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz", + "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1" + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -862,14 +864,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz", - "integrity": "sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz", + "integrity": "sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.26.1", - "@typescript-eslint/utils": "8.26.1", + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/utils": "8.30.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -886,9 +888,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz", - "integrity": "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", + "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", "dev": true, "license": "MIT", "engines": { @@ -900,14 +902,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz", - "integrity": "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz", + "integrity": "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -966,16 +968,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.1.tgz", - "integrity": "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz", + "integrity": "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/typescript-estree": "8.26.1" + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -990,13 +992,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz", - "integrity": "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz", + "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.26.1", + "@typescript-eslint/types": "8.30.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -1731,9 +1733,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.1.tgz", - "integrity": "sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.2.tgz", + "integrity": "sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==", "dev": true, "license": "MIT", "bin": { @@ -1844,13 +1846,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", - "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz", + "integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" + "synckit": "^0.11.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -1861,7 +1864,7 @@ "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", - "eslint-config-prettier": "*", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -3477,19 +3480,20 @@ } }, "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.2.tgz", + "integrity": "sha512-1IUffI8zZ8qUMB3NUJIjk0RpLroG/8NkQDAWH1NbB2iJ0/5pn3M8rxfNzMz4GH9OnYaGYn31LEDSXJp/qIlxgA==", "dev": true, + "license": "MIT", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "@pkgr/core": "^0.2.0", + "tslib": "^2.8.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/synckit" } }, "node_modules/text-table": { @@ -3549,9 +3553,10 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/tunnel": { "version": "0.0.6", @@ -3659,9 +3664,9 @@ } }, "node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3700,9 +3705,10 @@ } }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" }, "node_modules/universal-user-agent": { "version": "6.0.1", diff --git a/package.json b/package.json index 302924f751..b8e76eb2c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "golanci-lint-action", - "version": "6.5.2", + "version": "7.0.1", "private": true, "description": "golangci-lint github action", "main": "dist/main.js", @@ -24,30 +24,30 @@ "author": "golangci", "license": "MIT", "dependencies": { - "@actions/cache": "^4.0.2", + "@actions/cache": "^4.0.3", "@actions/core": "^1.11.1", "@actions/exec": "^1.1.1", "@actions/github": "^6.0.0", "@actions/http-client": "^2.2.3", "@octokit/plugin-retry": "^6.1.0", "@actions/tool-cache": "^2.0.2", - "@types/node": "^22.13.10", - "@types/semver": "^7.5.8", + "@types/node": "^22.14.1", + "@types/semver": "^7.7.0", "@types/tmp": "^0.2.6", "@types/which": "^3.0.4", "tmp": "^0.2.3", "which": "^5.0.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^8.26.1", - "@typescript-eslint/parser": "^8.26.1", + "@typescript-eslint/eslint-plugin": "^8.30.1", + "@typescript-eslint/parser": "^8.30.1", "@vercel/ncc": "^0.38.3", "eslint": "^8.57.1", - "eslint-config-prettier": "^10.1.1", + "eslint-config-prettier": "^10.1.2", "eslint-plugin-import": "^2.31.0", - "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-prettier": "^5.2.6", "eslint-plugin-simple-import-sort": "^12.1.1", "prettier": "^3.5.3", - "typescript": "^5.8.2" + "typescript": "^5.8.3" } } diff --git a/sample-go-mod/.golangci.yml b/sample-go-mod/.golangci.yml index ad24fce4c0..e6015c66b6 100644 --- a/sample-go-mod/.golangci.yml +++ b/sample-go-mod/.golangci.yml @@ -1,6 +1,7 @@ +version: "2" + output: show-stats: true - sort-results: true sort-order: + - file - linter - - file \ No newline at end of file diff --git a/sample-go-mod/go.mod b/sample-go-mod/go.mod index 0184a16b24..e4c5b91a92 100644 --- a/sample-go-mod/go.mod +++ b/sample-go-mod/go.mod @@ -2,7 +2,7 @@ module sample go 1.22.1 -require github.com/golangci/golangci-lint v1.60.1 +require github.com/golangci/golangci-lint/v2 v2.0.0 require ( 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect diff --git a/sample-go-mod/tools.go b/sample-go-mod/tools.go index 9660590095..1a0e055a59 100644 --- a/sample-go-mod/tools.go +++ b/sample-go-mod/tools.go @@ -3,5 +3,5 @@ package main import ( - _ "github.com/golangci/golangci-lint/cmd/golangci-lint" + _ "github.com/golangci/golangci-lint/v2/cmd/golangci-lint" ) diff --git a/sample-go-tool/.golangci.yml b/sample-go-tool/.golangci.yml index ad24fce4c0..e6015c66b6 100644 --- a/sample-go-tool/.golangci.yml +++ b/sample-go-tool/.golangci.yml @@ -1,6 +1,7 @@ +version: "2" + output: show-stats: true - sort-results: true sort-order: + - file - linter - - file \ No newline at end of file diff --git a/sample-go-tool/go.mod b/sample-go-tool/go.mod index 0bab3bef20..ebc15d278f 100644 --- a/sample-go-tool/go.mod +++ b/sample-go-tool/go.mod @@ -4,7 +4,7 @@ go 1.24 toolchain go1.24.0 -tool github.com/golangci/golangci-lint/cmd/golangci-lint +tool github.com/golangci/golangci-lint/v2/cmd/golangci-lint require ( 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect @@ -68,7 +68,7 @@ require ( github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect github.com/golangci/go-printf-func-name v0.1.0 // indirect github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect - github.com/golangci/golangci-lint v1.64.4 // indirect + github.com/golangci/golangci-lint/v2 v2.0.0 // indirect github.com/golangci/misspell v0.6.0 // indirect github.com/golangci/plugin-module-register v0.1.1 // indirect github.com/golangci/revgrep v0.8.0 // indirect diff --git a/src/install.ts b/src/install.ts index 960fa8dcc3..1f5083fd6f 100644 --- a/src/install.ts +++ b/src/install.ts @@ -84,16 +84,14 @@ async function goInstall(versionInfo: VersionInfo): Promise { const options: ExecOptions = { env: { ...process.env, CGO_ENABLED: "1" } } - // TODO(ldez): it should be updated for v2. const exres = await execShellCommand( - `go install github.com/golangci/golangci-lint/cmd/golangci-lint@${versionInfo.TargetVersion}`, + `go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@${versionInfo.TargetVersion}`, options ) printOutput(exres) - // TODO(ldez): it should be updated for v2. const res = await execShellCommand( - `go install -n github.com/golangci/golangci-lint/cmd/golangci-lint@${versionInfo.TargetVersion}`, + `go install -n github.com/golangci/golangci-lint/v2/cmd/golangci-lint@${versionInfo.TargetVersion}`, options ) printOutput(res) diff --git a/src/run.ts b/src/run.ts index 55864df795..db02b3f3f7 100644 --- a/src/run.ts +++ b/src/run.ts @@ -51,7 +51,7 @@ async function runLint(binPath: string, patchPath: string): Promise { printOutput(res) } - let userArgs = core.getInput(`args`) + const userArgs = core.getInput(`args`) const addedArgs: string[] = [] const userArgsList = userArgs @@ -76,23 +76,13 @@ async function runLint(binPath: string, patchPath: string): Promise { } } - const formats = (userArgsMap.get("out-format") || "") - .trim() - .split(",") - .filter((f) => f.length > 0) - .filter((f) => !f.startsWith(`github-actions`)) // Removes `github-actions` format. - .join(",") - - if (formats) { - // Adds formats but without `github-actions` format. - addedArgs.push(`--out-format=${formats}`) - } - - // Removes `--out-format` from the user flags because it's already inside `addedArgs`. - userArgs = userArgs.replace(/--out-format=\S*/gi, "").trim() - 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`) || + userArgNames.has(`new-from-merge-base`) + ) { throw new Error(`please, don't specify manually --new* args when requesting only new issues`) } @@ -110,6 +100,7 @@ async function runLint(binPath: string, patchPath: string): Promise { // Override config values. addedArgs.push(`--new=false`) addedArgs.push(`--new-from-rev=`) + addedArgs.push(`--new-from-merge-base=`) } break case `merge_group`: @@ -118,6 +109,7 @@ async function runLint(binPath: string, patchPath: string): Promise { // Override config values. addedArgs.push(`--new=false`) addedArgs.push(`--new-from-patch=`) + addedArgs.push(`--new-from-merge-base=`) break default: break @@ -150,7 +142,6 @@ async function runLint(binPath: string, patchPath: string): Promise { core.info(`golangci-lint found no issues`) } catch (exc) { // This logging passes issues to GitHub annotations but comments can be more convenient for some users. - // TODO: support reviewdog or leaving comments by GitHub API. printOutput(exc) if (exc.code === 1) { diff --git a/src/version.ts b/src/version.ts index 337fc8f320..186000710f 100644 --- a/src/version.ts +++ b/src/version.ts @@ -13,13 +13,11 @@ export type Version = { } | null const versionRe = /^v(\d+)\.(\d+)(?:\.(\d+))?$/ -// TODO(ldez): it should be updated to match v2 module name. -const modVersionRe = /github.com\/golangci\/golangci-lint\s(v\S+)/ +const modVersionRe = /github.com\/golangci\/golangci-lint\/v2\s(v\S+)/ const parseVersion = (s: string): Version => { if (s == "latest" || s == "") { - // TODO(ldez): v2: it should be replaced with "return null" - return { major: 1, minor: 64, patch: 8 } + return null } const match = s.match(versionRe) @@ -27,11 +25,8 @@ const parseVersion = (s: string): Version => { throw new Error(`invalid version string '${s}', expected format v1.2 or v1.2.3`) } - // TODO(ldez): v2: to remove. - if (parseInt(match[1]) > 1) { - throw new Error( - `invalid version string '${s}', golangci-lint v2 is not supported by golangci-lint-action v6, you must update to golangci-lint-action v7.` - ) + if (parseInt(match[1]) !== 2) { + throw new Error(`invalid version string '${s}', golangci-lint v${match[1]} is not supported by golangci-lint-action v7.`) } return { @@ -48,11 +43,10 @@ export const stringifyVersion = (v: Version): string => { return `v${v.major}.${v.minor}${v.patch !== null ? `.${v.patch}` : ``}` } -// TODO(ldez): it should be updated to v2.0.0. const minVersion = { - major: 1, - minor: 28, - patch: 3, + major: 2, + minor: 0, + patch: 0, } const isLessVersion = (a: Version, b: Version): boolean => { @@ -122,7 +116,7 @@ const fetchVersionMapping = async (): Promise => { maxRetries: 5, }) try { - const url = `https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/assets/github-action-config-v1.json` + const url = `https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/assets/github-action-config-v2.json` const response: httpm.HttpClientResponse = await http.get(url) if (response.message.statusCode !== 200) { throw new Error(`failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`) @@ -140,20 +134,14 @@ export async function getVersion(mode: InstallMode): Promise { if (mode == InstallMode.GoInstall) { const v: string = core.getInput(`version`) - // TODO(ldez): v2: to remove. - if (v == "latest") { - return { TargetVersion: "v1.64.8" } - } - // TODO(ldez): v2: "v1.64.8" should be replaced with "latest". - return { TargetVersion: v ? v : "v1.64.8" } + return { TargetVersion: v ? v : "latest" } } const reqVersion = getRequestedVersion() // if the patched version is passed, just use it - // TODO(ldez): should be updated to `reqVersion?.major === 2`. - if (reqVersion?.major === 1 && reqVersion?.minor != null && reqVersion?.patch !== null) { + if (reqVersion?.major === 2 && reqVersion?.minor != null && reqVersion?.patch !== null) { return new Promise((resolve) => { const versionWithoutV = `${reqVersion.major}.${reqVersion.minor}.${reqVersion.patch}` resolve({ TargetVersion: `v${versionWithoutV}` })