Compare commits
502 Commits
v3.4.0
...
4afd733a84
Author | SHA1 | Date | |
---|---|---|---|
|
4afd733a84 | ||
|
7774f98a88 | ||
|
9fae48acfc | ||
|
16ece5e01d | ||
|
a3942e2497 | ||
|
7ecb048b56 | ||
|
63a0d0e695 | ||
|
c2427fec79 | ||
|
642f8ee631 | ||
|
d84be9250b | ||
|
9551b25870 | ||
|
f51fbec16f | ||
|
a5307c8f68 | ||
|
2968cc1a32 | ||
|
1481404843 | ||
|
dec74fa030 | ||
|
1f07148fa0 | ||
|
9938e103f8 | ||
|
b91d580160 | ||
|
55c2c1448f | ||
|
911ec56a22 | ||
|
eb5c0cc489 | ||
|
4696ba8bab | ||
|
2ee514f1f3 | ||
|
7e7b516e44 | ||
|
b871b4f9de | ||
|
08ba820282 | ||
|
d8648ac2ed | ||
|
37d62ae433 | ||
|
7b561e5ab6 | ||
|
b63dc836c2 | ||
|
e8b0a12b47 | ||
|
456fc0f735 | ||
|
378320cf0d | ||
|
0bc16cda6e | ||
|
0f27d1f085 | ||
|
3b4f037d0e | ||
|
fe19838e9e | ||
|
2226d7cb06 | ||
|
8d744d5b7f | ||
|
0e58f8e7ab | ||
|
6a3fb764d5 | ||
|
696fa5c0e7 | ||
|
80284ede25 | ||
|
818ec4d51a | ||
|
1c50240be2 | ||
|
0adbc47a59 | ||
|
f7463c56f6 | ||
|
32f961426b | ||
|
e0ebdd245e | ||
|
ea34ee71d6 | ||
|
051d919338 | ||
|
b85ce4ff0a | ||
|
d9c129682c | ||
|
db1c463e05 | ||
|
697ae3d965 | ||
|
2e788936b0 | ||
|
aa1e0941ed | ||
|
3e6beafdff | ||
|
1cc4e007f0 | ||
|
bbe109d3f8 | ||
|
e60da84bfa | ||
|
1dd93d052e | ||
|
5421a116d2 | ||
|
260e8cefdb | ||
|
9665fb5353 | ||
|
62530743f6 | ||
|
f71f362e47 | ||
|
7ec71f69b1 | ||
|
60c0fc4730 | ||
|
a7b658d295 | ||
|
ec5d18412c | ||
|
a0297a1378 | ||
|
58eda26a51 | ||
|
44c2434506 | ||
|
2f13b8027d | ||
|
1ac36865a6 | ||
|
9937fdf718 | ||
|
cb60b26e7a | ||
|
774c35bccc | ||
|
7ce548721e | ||
|
0e1fd32b0c | ||
|
9e66d46e22 | ||
|
1720a0ed2a | ||
|
eab1d2f3d7 | ||
|
160a1d779c | ||
|
02ee5067dc | ||
|
311e61576a | ||
|
363026db34 | ||
|
ea0c88120e | ||
|
968ad765a9 | ||
|
82fb3f49c2 | ||
|
10480e9d12 | ||
|
523baec228 | ||
|
8e06968c92 | ||
|
79a180da27 | ||
|
b92645ea9c | ||
|
3d4174dbf5 | ||
|
0ddaf3ca3f | ||
|
971e284b60 | ||
|
bbe7eb52aa | ||
|
ebae5cee81 | ||
|
06c3f3a551 | ||
|
56689d8f71 | ||
|
c7bab6f874 | ||
|
33f56cc1ef | ||
|
e9542245b2 | ||
|
68de804037 | ||
|
22a37566e1 | ||
|
cb36b7b064 | ||
|
acfc9fc846 | ||
|
1b319a7ae6 | ||
|
0ad4b72404 | ||
|
de8531069f | ||
|
2af9b8ff01 | ||
|
8cae750416 | ||
|
656a8d69e8 | ||
|
a3d68bc6f4 | ||
|
806a9afa81 | ||
|
e135904846 | ||
|
931e87202e | ||
|
aaa42aa062 | ||
|
9ec89731c3 | ||
|
58838cffc6 | ||
|
9f3ba2c3a8 | ||
|
2bd7a04e91 | ||
|
db819a10bd | ||
|
d09fb0808a | ||
|
605617a3e2 | ||
|
66f63c74bb | ||
|
2c01d264ab | ||
|
d8028e1f20 | ||
|
a0231c4ff0 | ||
|
e43020d72a | ||
|
9e57efc106 | ||
|
27d925f9c0 | ||
|
24b3d93762 | ||
|
26b1e83940 | ||
|
081b216ccf | ||
|
0d98fecd83 | ||
|
031a2fcd4a | ||
|
96843aea6d | ||
|
8032b26298 | ||
|
dfd6a77317 | ||
|
e1ff6fb1c1 | ||
|
4145754745 | ||
|
16507ab8ef | ||
|
725e01551b | ||
|
32b7e669bc | ||
|
e2918bb1f8 | ||
|
3f51204e49 | ||
|
b7f3daa60e | ||
|
952b7b2e57 | ||
|
7a82e5f967 | ||
|
4655d13902 | ||
|
182ce0be58 | ||
|
bc05d62e37 | ||
|
8a8f91e859 | ||
|
34be59169b | ||
|
abbeba8940 | ||
|
d7e9c664d4 | ||
|
42ebe7fde9 | ||
|
7b547992bc | ||
|
a4f60bb28d | ||
|
5815a4b917 | ||
|
23faadfdeb | ||
|
b556f25b3c | ||
|
789f114c52 | ||
|
d36b91c294 | ||
|
a9eb115348 | ||
|
bd4fa7c900 | ||
|
38e1018663 | ||
|
21e9e6b47f | ||
|
dbe4fc23f1 | ||
|
dbb7ebcd4c | ||
|
ecb32920c6 | ||
|
046435d14c | ||
|
ca8befdfb6 | ||
|
d9c9b53e53 | ||
|
aebff4bd9c | ||
|
2bff406277 | ||
|
7a6f31107b | ||
|
57c4c9d189 | ||
|
3519a25e89 | ||
|
d073fb8ea7 | ||
|
9d1e0624a7 | ||
|
692c9c9dba | ||
|
ef6d5d0e99 | ||
|
d149ece3f4 | ||
|
f89fd48199 | ||
|
47ef1b2e7f | ||
|
7c0f80cbb8 | ||
|
3adb6d0473 | ||
|
03a8ce6d60 | ||
|
82d40c283a | ||
|
c683728f10 | ||
|
bf6479d5ec | ||
|
d6238b002a | ||
|
847b9efe2e | ||
|
019c5ec617 | ||
|
3dea681709 | ||
|
155e5ebdeb | ||
|
14117827cf | ||
|
e3c1789d3f | ||
|
24de455de2 | ||
|
0068957dcf | ||
|
8cca243457 | ||
|
c1ec8d27ed | ||
|
80ffcf7ac5 | ||
|
c9cf8614bf | ||
|
ca92b655d7 | ||
|
e637d2bbe4 | ||
|
f7e6ffb14d | ||
|
04092870fd | ||
|
15ace4fc54 | ||
|
66db41e5dd | ||
|
a54aa6ce0b | ||
|
0cb4e4ce8a | ||
|
c2b1114313 | ||
|
1ef822c9e7 | ||
|
0cf702c571 | ||
|
e0e0b2b842 | ||
|
d7b3f577a7 | ||
|
a3062e4021 | ||
|
0cea014686 | ||
|
c9cca96908 | ||
|
2e99f461f3 | ||
|
27463c1456 | ||
|
47f5f04922 | ||
|
6d0160cbf8 | ||
|
52b846a8b5 | ||
|
3f7fc68782 | ||
|
1eba11c6d8 | ||
|
552a57d5dc | ||
|
a83e3d11f6 | ||
|
2fc4c770fc | ||
|
0ea26a0a52 | ||
|
f1a742892f | ||
|
2031bb15ab | ||
|
17bf0db4b7 | ||
|
de85e3b9b1 | ||
|
3cfe3a4abb | ||
|
cbc59cf0d1 | ||
|
459a04b021 | ||
|
e2315b67db | ||
|
d6173a45d0 | ||
|
0e8f5bf773 | ||
|
349d20632d | ||
|
2221aee284 | ||
|
3b44ae5b24 | ||
|
323b871bbc | ||
|
a23373f4c8 | ||
|
e38f944096 | ||
|
3c5e1cac39 | ||
|
0f1139540c | ||
|
81218f8e0c | ||
|
cc439c2555 | ||
|
3efd423e8d | ||
|
effc519e1b | ||
|
cfaf0f0750 | ||
|
86abc3c6d2 | ||
|
c5ba143a4c | ||
|
a9d24cbbd7 | ||
|
2e6adf08a9 | ||
|
1c2ceb7f27 | ||
|
5f85afe386 | ||
|
05d79cc0e4 | ||
|
edcd1211b8 | ||
|
eb69bf92e7 | ||
|
92ed864d2e | ||
|
3eeea96a33 | ||
|
c701339303 | ||
|
e03e943597 | ||
|
50372b6518 | ||
|
b6b6b379de | ||
|
7d8fef21df | ||
|
0d0b9c12e8 | ||
|
7989493c23 | ||
|
f7e7174579 | ||
|
46a279bd0a | ||
|
4f796ce6b5 | ||
|
dd7bdbe4bf | ||
|
5e13907514 | ||
|
c0b0a00641 | ||
|
88688a2400 | ||
|
a50083874e | ||
|
8e84a3001a | ||
|
9a8fa77b90 | ||
|
677d5e3b79 | ||
|
abd6e0ea0b | ||
|
7778b2da3c | ||
|
bfee5ee11d | ||
|
608f9e14ec | ||
|
9381bb2c2c | ||
|
17e44d79cb | ||
|
25ef9ca970 | ||
|
170a3a0cf1 | ||
|
a76f44e7d8 | ||
|
8fa7dff7b9 | ||
|
face0856de | ||
|
ec66a939a9 | ||
|
c44dc93f23 | ||
|
d2a0133e31 | ||
|
455de4e66d | ||
|
61c1a4a9f5 | ||
|
604fe72b13 | ||
|
3c85045f6e | ||
|
d9fc28500d | ||
|
7d357a3513 | ||
|
b45661bc10 | ||
|
31c68b6041 | ||
|
d27d0c27ac | ||
|
4b1e98b37d | ||
|
5a72764667 | ||
|
30416f05a0 | ||
|
a555e8cdd0 | ||
|
c8710f274e | ||
|
40776d7557 | ||
|
9cb5ef734c | ||
|
62f96762dd | ||
|
84072ff78e | ||
|
a625c15a6b | ||
|
5545aac6a3 | ||
|
e09eda33b5 | ||
|
526ce234e5 | ||
|
507ec96a74 | ||
|
252bd8e8ba | ||
|
07341d3490 | ||
|
9df6f480ac | ||
|
6f4d254d44 | ||
|
a24255b274 | ||
|
c12092e88f | ||
|
031ba7f7a9 | ||
|
c8d4ef2f53 | ||
|
31c1b1aa98 | ||
|
31eb4eaded | ||
|
5f5f252fe2 | ||
|
c624d54a53 | ||
|
d735dc073f | ||
|
846e7ddcd9 | ||
|
d66278f1e9 | ||
|
1afd74ce23 | ||
|
c67416616c | ||
|
29052a94fb | ||
|
2d06cf1746 | ||
|
953db97e74 | ||
|
f7b4bdd2ad | ||
|
239c8dab36 | ||
|
237bd9f909 | ||
|
fef6a0f2be | ||
|
2d891f879c | ||
|
1e9c424622 | ||
|
cf670955c6 | ||
|
c49c2afa5d | ||
|
81871bcfd1 | ||
|
b2f426ba19 | ||
|
f8a3dc114e | ||
|
1330ad3e73 | ||
|
6efbbade29 | ||
|
3a91952989 | ||
|
5e676315e9 | ||
|
18dad33d2e | ||
|
945dc98b91 | ||
|
cac24f53b7 | ||
|
ab66454db6 | ||
|
a2527500a4 | ||
|
44d9998d44 | ||
|
b6bdfb3d14 | ||
|
c0cd965566 | ||
|
66268c5fbe | ||
|
2ab8c4423e | ||
|
2c52863893 | ||
|
77db3f966c | ||
|
797977b61a | ||
|
015f418198 | ||
|
88ae11c65f | ||
|
51e800db2c | ||
|
f05002851f | ||
|
b39364735e | ||
|
a657dba833 | ||
|
ba65924209 | ||
|
c0edea7835 | ||
|
a1145a6b27 | ||
|
83e5ccebf6 | ||
|
8457318a42 | ||
|
a422a812eb | ||
|
84836b13d8 | ||
|
360e5b76ee | ||
|
42ba3c24d6 | ||
|
4f5a3af221 | ||
|
f1690ab489 | ||
|
98d324947b | ||
|
5326fa0045 | ||
|
4d9aae64da | ||
|
d29c0cc90a | ||
|
28fa3382e3 | ||
|
715abd3467 | ||
|
01827479ce | ||
|
05fe2da5ec | ||
|
2a20098909 | ||
|
71a9ad5faf | ||
|
b814b8606f | ||
|
455ad55fab | ||
|
cde40a3b90 | ||
|
444727df93 | ||
|
aca98fe711 | ||
|
8078b42bbd | ||
|
1577f9c80c | ||
|
313d11ed7d | ||
|
907f20a45e | ||
|
639cd343e1 | ||
|
569abaa281 | ||
|
c57cc43669 | ||
|
322510a3ea | ||
|
185e7a2f8f | ||
|
5be60c708e | ||
|
825a50d3a2 | ||
|
8c13ec4e5d | ||
|
416b5d0b48 | ||
|
66a608006f | ||
|
f0ba586c1f | ||
|
b8fff06a27 | ||
|
5f1fec7010 | ||
|
601007b788 | ||
|
d2a913e97b | ||
|
7233bd71cb | ||
|
687f029324 | ||
|
f9990cd216 | ||
|
f30aa514f9 | ||
|
6b21f586ed | ||
|
535ed3a04b | ||
|
0078ef00ab | ||
|
776a285c4c | ||
|
0d51521d42 | ||
|
65ea3995bb | ||
|
653016502e | ||
|
4cb9697578 | ||
|
dd04c182af | ||
|
8c36daf744 | ||
|
0f97d97f47 | ||
|
27e48c2073 | ||
|
65466a27fa | ||
|
520b21135e | ||
|
369d614672 | ||
|
240da36b3d | ||
|
6897b1a051 | ||
|
4042cfe2d4 | ||
|
97bb55a183 | ||
|
744562230b | ||
|
1e0fb9b015 | ||
|
8bb781f27a | ||
|
c60079adbf | ||
|
f6781576ae | ||
|
c7b6fc977f | ||
|
579a4e6741 | ||
|
32a046958e | ||
|
7641ddf8a8 | ||
|
7261544346 | ||
|
b26535e6d1 | ||
|
e1c0a0543f | ||
|
2fdccc41f5 | ||
|
db0ea3f163 | ||
|
ed929be3ec | ||
|
76eaf57237 | ||
|
0fd20142bb | ||
|
3fc120753c | ||
|
8c99775d4b | ||
|
ea65405b36 | ||
|
7122616b22 | ||
|
39b10dd0d9 | ||
|
4593d99d2e | ||
|
30dacc8af6 | ||
|
464d9fd432 | ||
|
92ba55cf0d | ||
|
7cd2f0393b | ||
|
5077eeb6c1 | ||
|
d6d0cce229 | ||
|
e92337f3b6 | ||
|
bf4120ff3c | ||
|
61703f1af4 | ||
|
8b76d976da | ||
|
a2dc749409 | ||
|
aa94bc705d | ||
|
fdf641b40e | ||
|
12dfd24d9a | ||
|
01dfc8644b | ||
|
1ea20104d5 | ||
|
419d0912ea | ||
|
8c2f4f9823 | ||
|
4e6daa7065 | ||
|
ac77de69c2 | ||
|
7b2a3f3333 | ||
|
a904d1db61 | ||
|
6a290f7d5d | ||
|
97c6242097 | ||
|
5782ee83ad | ||
|
76503fda9a | ||
|
d36410f546 | ||
|
650217c0c5 | ||
|
a2a25205ce | ||
|
1aee3f97a3 | ||
|
c5c27dbc86 |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
dist/** linguist-generated=true
|
21
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
21
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Bug Report
|
name: 🐞 Bug Report
|
||||||
description: "Create a report to help us improve."
|
description: "Create a report to help us improve."
|
||||||
body:
|
body:
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
@@ -36,14 +36,29 @@ body:
|
|||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: config
|
id: workflow-file
|
||||||
attributes:
|
attributes:
|
||||||
label: Workflow file
|
label: Workflow file
|
||||||
value: |-
|
value: |-
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
<add your file content here>
|
||||||
```
|
```
|
||||||
<add you file here>
|
|
||||||
|
</details>
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: config
|
||||||
|
attributes:
|
||||||
|
label: Golangci-lint configuration
|
||||||
|
value: |-
|
||||||
|
<details>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
<add your file content here>
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
17
.github/ISSUE_TEMPLATE/config.yml
vendored
17
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,11 +1,14 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: Questions
|
- name: 📖 Golangci-lint documentation
|
||||||
url: https://github.com/golangci/golangci-lint-action/discussions
|
|
||||||
about: If you have a question, or are looking for advice, please post on our Discussions forum!
|
|
||||||
- name: golangci-lint main repository
|
|
||||||
url: https://github.com/golangci/golangci-lint
|
|
||||||
about: The main repository of golangci-lint.
|
|
||||||
- name: golangci-lint documentation
|
|
||||||
url: https://golangci-lint.run
|
url: https://golangci-lint.run
|
||||||
about: Please take a look to our documentation.
|
about: Please take a look to our documentation.
|
||||||
|
- name: ❓ Questions
|
||||||
|
url: https://github.com/golangci/golangci-lint-action/discussions
|
||||||
|
about: If you have a question, or are looking for advice, please post on our Discussions forum!
|
||||||
|
- name: 💬 Chat on Slack
|
||||||
|
url: https://gophers.slack.com/archives/CS0TBRKPC
|
||||||
|
about: Maybe chatting with the community can help
|
||||||
|
- name: 🏡 Golangci-lint main repository
|
||||||
|
url: https://github.com/golangci/golangci-lint
|
||||||
|
about: The main repository of golangci-lint.
|
||||||
|
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
2
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Feature request
|
name: 💡 Feature request
|
||||||
description: "Suggest an idea for this project."
|
description: "Suggest an idea for this project."
|
||||||
body:
|
body:
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
|
5
.github/dependabot.yml
vendored
5
.github/dependabot.yml
vendored
@@ -6,5 +6,10 @@ updates:
|
|||||||
interval: weekly
|
interval: weekly
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/"
|
directory: "/"
|
||||||
|
groups:
|
||||||
|
dev-dependencies:
|
||||||
|
dependency-type: development
|
||||||
|
dependencies:
|
||||||
|
dependency-type: production
|
||||||
schedule:
|
schedule:
|
||||||
interval: weekly
|
interval: weekly
|
||||||
|
15
.github/release.yml
vendored
Normal file
15
.github/release.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
changelog:
|
||||||
|
categories:
|
||||||
|
- title: Changes
|
||||||
|
labels:
|
||||||
|
- '*'
|
||||||
|
exclude:
|
||||||
|
labels:
|
||||||
|
- documentation
|
||||||
|
- dependencies
|
||||||
|
- title: Documentation
|
||||||
|
labels:
|
||||||
|
- documentation
|
||||||
|
- title: Dependencies
|
||||||
|
labels:
|
||||||
|
- dependencies
|
12
.github/workflows/codeql.yaml
vendored
12
.github/workflows/codeql.yaml
vendored
@@ -2,10 +2,12 @@ name: "Code Scanning - Action"
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ master ]
|
branches:
|
||||||
|
- main
|
||||||
pull_request:
|
pull_request:
|
||||||
# The branches below must be a subset of the branches above
|
# The branches below must be a subset of the branches above
|
||||||
branches: [ master ]
|
branches:
|
||||||
|
- main
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 17 * * 5'
|
- cron: '0 17 * * 5'
|
||||||
|
|
||||||
@@ -16,7 +18,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
# Must fetch at least the immediate parents so that if this is
|
# Must fetch at least the immediate parents so that if this is
|
||||||
# a pull request then we can checkout the head of the pull request.
|
# a pull request then we can checkout the head of the pull request.
|
||||||
@@ -31,7 +33,7 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v2
|
uses: github/codeql-action/init@v3
|
||||||
# Override language selection by uncommenting this and choosing your languages
|
# Override language selection by uncommenting this and choosing your languages
|
||||||
with:
|
with:
|
||||||
language: 'javascript'
|
language: 'javascript'
|
||||||
@@ -41,4 +43,4 @@ jobs:
|
|||||||
npm run all
|
npm run all
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v3
|
||||||
|
70
.github/workflows/test.yml
vendored
70
.github/workflows/test.yml
vendored
@@ -1,19 +1,24 @@
|
|||||||
name: "build-and-test"
|
name: "build-and-test"
|
||||||
on: # rebuild any PRs and main branch changes
|
on: # rebuild any PRs and main branch changes
|
||||||
pull_request:
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- main
|
||||||
- "releases/*"
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build: # make sure build/ci work properly
|
build: # make sure build/ci work properly
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- if: ${{ !(github.event_name == 'pull_request' && (github.event.pull_request.user.id == 49699333 || contains(github.event.pull_request.labels.*.name, 'dependencies'))) }}
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- if: github.event_name == 'pull_request' && (github.event.pull_request.user.id == 49699333 || contains(github.event.pull_request.labels.*.name, 'dependencies'))
|
||||||
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
ref: ${{ github.event.pull_request.head.ref }}
|
ref: ${{ github.event.pull_request.head.ref }}
|
||||||
|
|
||||||
- run: |
|
- run: |
|
||||||
npm install
|
npm install
|
||||||
npm run all
|
npm run all
|
||||||
@@ -43,41 +48,80 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
os:
|
os:
|
||||||
- ubuntu-latest
|
- ubuntu-latest
|
||||||
|
- ubuntu-22.04-arm
|
||||||
- macos-latest
|
- macos-latest
|
||||||
- windows-latest
|
- windows-latest
|
||||||
version:
|
version:
|
||||||
- ""
|
- ""
|
||||||
- "latest"
|
- "latest"
|
||||||
- "v1.49"
|
- "v2.1"
|
||||||
- "v1.49.0"
|
- "v2.1.0"
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
pull-requests: read
|
pull-requests: read
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: oldstable
|
||||||
- uses: ./
|
- uses: ./
|
||||||
with:
|
with:
|
||||||
version: ${{ matrix.version }}
|
version: ${{ matrix.version }}
|
||||||
args: --timeout=3m --issues-exit-code=0 ./sample/...
|
args: --timeout=5m --issues-exit-code=0 ./sample/...
|
||||||
only-new-issues: true
|
only-new-issues: true
|
||||||
|
|
||||||
test-go-mod-version:
|
test-go-install: # make sure the action works on a clean machine without building (go-install mode)
|
||||||
needs: [ build ]
|
needs: [ build ]
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os:
|
os:
|
||||||
- ubuntu-latest
|
- ubuntu-latest
|
||||||
|
- ubuntu-22.04-arm
|
||||||
- macos-latest
|
- macos-latest
|
||||||
- windows-latest
|
- windows-latest
|
||||||
|
version:
|
||||||
|
- ""
|
||||||
|
- "latest"
|
||||||
|
- "v2.1.0"
|
||||||
|
- "f6c2e6c999dfae444d1fe7f1b0d49becdae44547"
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: read
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: oldstable
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
version: ${{ matrix.version }}
|
||||||
|
args: --timeout=5m --issues-exit-code=0 ./sample/...
|
||||||
|
only-new-issues: true
|
||||||
|
install-mode: goinstall
|
||||||
|
|
||||||
|
test-go-mod:
|
||||||
|
needs: [ build ]
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os:
|
||||||
|
- ubuntu-latest
|
||||||
|
- ubuntu-22.04-arm
|
||||||
|
- macos-latest
|
||||||
|
- windows-latest
|
||||||
|
wd:
|
||||||
|
- sample-go-mod
|
||||||
|
- sample-go-tool
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: oldstable
|
||||||
- uses: ./
|
- uses: ./
|
||||||
with:
|
with:
|
||||||
working-directory: sample-go-mod
|
working-directory: ${{ matrix.wd }}
|
||||||
args: --timeout=3m --issues-exit-code=0 ./...
|
args: --timeout=5m --issues-exit-code=0 ./...
|
||||||
|
5
.gitignore
vendored
5
.gitignore
vendored
@@ -6,7 +6,7 @@ __tests__/runner/*
|
|||||||
node_modules/
|
node_modules/
|
||||||
lib/
|
lib/
|
||||||
|
|
||||||
# Rest pulled from https://github.com/github/gitignore/blob/master/Node.gitignore
|
# Rest pulled from https://github.com/github/gitignore/blob/HEAD/Node.gitignore
|
||||||
# Logs
|
# Logs
|
||||||
logs
|
logs
|
||||||
*.log
|
*.log
|
||||||
@@ -97,3 +97,6 @@ typings/
|
|||||||
|
|
||||||
# Text editor files
|
# Text editor files
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
|
# IntelliJ/WebStorm files
|
||||||
|
.idea
|
||||||
|
7
.golangci.yml
Normal file
7
.golangci.yml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
version: "2"
|
||||||
|
|
||||||
|
output:
|
||||||
|
show-stats: true
|
||||||
|
sort-order:
|
||||||
|
- file
|
||||||
|
- linter
|
43
CONTRIBUTING.md
Normal file
43
CONTRIBUTING.md
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
## How to contribute
|
||||||
|
|
||||||
|
### Did you find a bug?
|
||||||
|
|
||||||
|
* **Ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/golangci/golangci-lint-action/issues).
|
||||||
|
|
||||||
|
* If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/golangci/golangci-lint-action/issues/new).
|
||||||
|
Be sure to include a **title and clear description**, as much relevant information as possible,
|
||||||
|
and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring.
|
||||||
|
|
||||||
|
* **Do not open up a GitHub issue if the bug is a security vulnerability**,
|
||||||
|
and instead to refer to our [security policy](https://github.com/golangci/golangci-lint-action?tab=security-ov-file).
|
||||||
|
|
||||||
|
### Do you intend to add a new feature or change an existing one?
|
||||||
|
|
||||||
|
* Suggest your change inside an [issue](https://github.com/golangci/golangci-lint-action/issues).
|
||||||
|
|
||||||
|
* Do not open a pull request on GitHub until you have collected positive feedback about the change.
|
||||||
|
|
||||||
|
### Did you write a patch that fixes a bug?
|
||||||
|
|
||||||
|
* Open a new GitHub pull request with the patch.
|
||||||
|
|
||||||
|
* Ensure the PR description clearly describes the problem and solution.
|
||||||
|
Include the relevant issue number if applicable.
|
||||||
|
|
||||||
|
## Development of this action
|
||||||
|
|
||||||
|
1. Install [act](https://github.com/nektos/act#installation)
|
||||||
|
2. Make a symlink for `act` to work properly: `ln -s . golangci-lint-action`
|
||||||
|
3. Install dependencies: `npm install`
|
||||||
|
4. Build: `npm run build`
|
||||||
|
5. Run `npm run local` after any change to test it
|
||||||
|
|
||||||
|
### Releases
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm version <major | minor | patch> -m "Upgrade to %s"
|
||||||
|
```
|
||||||
|
|
||||||
|
- https://docs.npmjs.com/cli/v11/commands/npm-version
|
||||||
|
|
||||||
|
The "major tag" (ex: `v6`) should be deleted and then recreated manually.
|
557
README.md
557
README.md
@@ -3,142 +3,535 @@
|
|||||||
[](https://github.com/golangci/golangci-lint-action/actions)
|
[](https://github.com/golangci/golangci-lint-action/actions)
|
||||||
|
|
||||||
It's the official GitHub action for [golangci-lint](https://github.com/golangci/golangci-lint) from its authors.
|
It's the official GitHub action for [golangci-lint](https://github.com/golangci/golangci-lint) from its authors.
|
||||||
|
|
||||||
The action runs [golangci-lint](https://github.com/golangci/golangci-lint) and reports issues from linters.
|
The action runs [golangci-lint](https://github.com/golangci/golangci-lint) and reports issues from linters.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Compatibility
|

|
||||||
|
|
||||||
* `v3.0.0+` requires explicit setup-go installation step prior to using this action: `uses: actions/setup-go@v3`.
|
## Supporting Us
|
||||||
The `skip-go-installation` option has been removed.
|
|
||||||
* `v2.0.0+` works with `golangci-lint` version >= `v1.28.3`
|
[](https://github.com/sponsors/golangci)
|
||||||
* `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))
|
[](https://opencollective.com/golangci-lint)
|
||||||
* `v1.2.1` works with `golangci-lint` version >= `v1.14.0` ([issue](https://github.com/golangci/golangci-lint-action/issues/39))
|
[](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:
|
||||||
|
|
||||||
## How to use
|
## How to use
|
||||||
|
|
||||||
|
We recommend running this action in a job separate from other jobs (`go test`, etc.)
|
||||||
|
because different jobs [run in parallel](https://help.github.com/en/actions/getting-started-with-github-actions/core-concepts-for-github-actions#job).
|
||||||
|
|
||||||
Add `.github/workflows/golangci-lint.yml` with the following contents:
|
Add `.github/workflows/golangci-lint.yml` with the following contents:
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Simple Example</summary>
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
name: golangci-lint
|
name: golangci-lint
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags:
|
|
||||||
- v*
|
|
||||||
branches:
|
branches:
|
||||||
- master
|
|
||||||
- main
|
- main
|
||||||
|
- master
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
# Optional: allow read access to pull request. Use with `only-new-issues` option.
|
# Optional: allow read access to pull request. Use with `only-new-issues` option.
|
||||||
# pull-requests: read
|
# pull-requests: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
golangci:
|
golangci:
|
||||||
name: lint
|
name: lint
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: 1.17
|
go-version: stable
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: golangci-lint
|
- name: golangci-lint
|
||||||
uses: golangci/golangci-lint-action@v3
|
uses: golangci/golangci-lint-action@v8
|
||||||
with:
|
with:
|
||||||
# Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version
|
version: v2.1
|
||||||
version: v1.29
|
|
||||||
|
|
||||||
# Optional: working directory, useful for monorepos
|
|
||||||
# working-directory: somedir
|
|
||||||
|
|
||||||
# Optional: golangci-lint command line arguments.
|
|
||||||
# args: --issues-exit-code=0
|
|
||||||
|
|
||||||
# Optional: show only new issues if it's a pull request. The default value is `false`.
|
|
||||||
# only-new-issues: true
|
|
||||||
|
|
||||||
# Optional: if set to true then the all caching functionality will be complete disabled,
|
|
||||||
# takes precedence over all other caching options.
|
|
||||||
# skip-cache: true
|
|
||||||
|
|
||||||
# Optional: if set to true then the action don't cache or restore ~/go/pkg.
|
|
||||||
# skip-pkg-cache: true
|
|
||||||
|
|
||||||
# Optional: if set to true then the action don't cache or restore ~/.cache/go-build.
|
|
||||||
# skip-build-cache: true
|
|
||||||
```
|
```
|
||||||
|
|
||||||
We recommend running this action in a job separate from other jobs (`go test`, etc)
|
</details>
|
||||||
because different jobs [run in parallel](https://help.github.com/en/actions/getting-started-with-github-actions/core-concepts-for-github-actions#job).
|
|
||||||
|
|
||||||
### Multiple OS Support
|
<details>
|
||||||
|
<summary>Multiple OS Example</summary>
|
||||||
If you need to run linters for specific operating systems, you will need to use `v2` of the action. Here is a sample configuration file:
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
name: golangci-lint
|
name: golangci-lint
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags:
|
|
||||||
- v*
|
|
||||||
branches:
|
branches:
|
||||||
- master
|
|
||||||
- main
|
- main
|
||||||
|
- master
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
# Optional: allow read access to pull request. Use with `only-new-issues` option.
|
# Optional: allow read access to pull request. Use with `only-new-issues` option.
|
||||||
# pull-requests: read
|
# pull-requests: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
golangci:
|
golangci:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
go: [1.17]
|
go: [stable]
|
||||||
os: [macos-latest, windows-latest]
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
name: lint
|
name: lint
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: ${{ matrix.go }}
|
go-version: ${{ matrix.go }}
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: golangci-lint
|
- name: golangci-lint
|
||||||
uses: golangci/golangci-lint-action@v3
|
uses: golangci/golangci-lint-action@v8
|
||||||
with:
|
with:
|
||||||
# Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
|
version: v2.1
|
||||||
version: v1.29
|
|
||||||
# Optional: working directory, useful for monorepos
|
|
||||||
# working-directory: somedir
|
|
||||||
|
|
||||||
# Optional: golangci-lint command line arguments.
|
|
||||||
# args: --issues-exit-code=0
|
|
||||||
|
|
||||||
# Optional: show only new issues if it's a pull request. The default value is `false`.
|
|
||||||
# only-new-issues: true
|
|
||||||
```
|
```
|
||||||
|
|
||||||
You will also likely need to add the following `.gitattributes` file to ensure that line endings for windows builds are properly formatted:
|
You will also likely need to add the following `.gitattributes` file to ensure that line endings for Windows builds are properly formatted:
|
||||||
|
|
||||||
```.gitattributes
|
```.gitattributes
|
||||||
*.go text eol=lf
|
*.go text eol=lf
|
||||||
```
|
```
|
||||||
|
|
||||||
## Comments and Annotations
|
</details>
|
||||||
|
|
||||||
Currently, GitHub parses the action's output and creates [annotations](https://github.community/t5/GitHub-Actions/What-are-annotations/td-p/30770).
|
<details>
|
||||||
|
<summary>Go Workspace Example</summary>
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: golangci-lint
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- master
|
||||||
|
|
||||||
|
env:
|
||||||
|
GO_VERSION: stable
|
||||||
|
GOLANGCI_LINT_VERSION: v2.1
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
detect-modules:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
modules: ${{ steps.set-modules.outputs.modules }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
- id: set-modules
|
||||||
|
run: echo "modules=$(go list -m -json | jq -s '.' | jq -c '[.[].Dir]')" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
golangci-lint:
|
||||||
|
needs: detect-modules
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
modules: ${{ fromJSON(needs.detect-modules.outputs.modules) }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
- name: golangci-lint ${{ matrix.modules }}
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
version: ${{ env.GOLANGCI_LINT_VERSION }}
|
||||||
|
working-directory: ${{ matrix.modules }}
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Go Workspace Example (Multiple OS)</summary>
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ./.github/workflows/golangci-lint.yml
|
||||||
|
name: golangci-lint (multi OS)
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
golangci-lint:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
go-version: [ stable, oldstable ]
|
||||||
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
|
uses: ./.github/workflows/.golangci-lint-reusable.yml
|
||||||
|
with:
|
||||||
|
os: ${{ matrix.os }}
|
||||||
|
go-version: ${{ matrix.go-version }}
|
||||||
|
golangci-lint-version: v2.1
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ./.github/workflows/.golangci-lint-reusable.yml
|
||||||
|
name: golangci-lint-reusable
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
os:
|
||||||
|
description: 'OS'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
go-version:
|
||||||
|
description: 'Go version'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
default: stable
|
||||||
|
golangci-lint-version:
|
||||||
|
description: 'Golangci-lint version'
|
||||||
|
type: string
|
||||||
|
default: 'v2.1'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
detect-modules:
|
||||||
|
runs-on: ${{ inputs.os }}
|
||||||
|
outputs:
|
||||||
|
modules: ${{ steps.set-modules.outputs.modules }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: ${{ inputs.go-version }}
|
||||||
|
- id: set-modules
|
||||||
|
shell: bash # require for Windows to be able to use $GITHUB_OUTPUT https://github.com/actions/runner/issues/2224
|
||||||
|
run: echo "modules=$(go list -m -json | jq -s '.' | jq -c '[.[].Dir]')" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
golangci-lint:
|
||||||
|
needs: detect-modules
|
||||||
|
runs-on: ${{ inputs.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
modules: ${{ fromJSON(needs.detect-modules.outputs.modules) }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: ${{ inputs.go-version }}
|
||||||
|
- name: golangci-lint ${{ matrix.modules }}
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
version: ${{ inputs.golangci-lint-version }}
|
||||||
|
working-directory: ${{ matrix.modules }}
|
||||||
|
```
|
||||||
|
|
||||||
|
You will also likely need to add the following `.gitattributes` file to ensure that line endings for Windows builds are properly formatted:
|
||||||
|
|
||||||
|
```.gitattributes
|
||||||
|
*.go text eol=lf
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## Compatibility
|
||||||
|
|
||||||
|
* `v8.0.0` works with `golangci-lint` version >= `v2.1.0`
|
||||||
|
* `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 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
|
||||||
|
|
||||||
|
### `version`
|
||||||
|
|
||||||
|
(optional)
|
||||||
|
|
||||||
|
The version of golangci-lint to use.
|
||||||
|
|
||||||
|
When `install-mode` is:
|
||||||
|
* `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.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Example</summary>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
version: v2.1
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### `install-mode`
|
||||||
|
|
||||||
|
(optional)
|
||||||
|
|
||||||
|
The mode to install golangci-lint: it can be `binary`, `goinstall`, or `none`.
|
||||||
|
|
||||||
|
The default value is `binary`.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Example</summary>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
install-mode: "goinstall"
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### `github-token`
|
||||||
|
|
||||||
|
(optional)
|
||||||
|
|
||||||
|
When using `only-new-issues` option, the GitHub API is used, so a token is required.
|
||||||
|
|
||||||
|
By default, it uses the `github.token` from the action.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Example</summary>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
github-token: xxx
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### `verify`
|
||||||
|
|
||||||
|
(optional)
|
||||||
|
|
||||||
|
This option is `true` by default.
|
||||||
|
|
||||||
|
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 JSON Schema used to validate the configuration depends on the version of golangci-lint you are using.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Example</summary>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
verify: false
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### `only-new-issues`
|
||||||
|
|
||||||
|
(optional)
|
||||||
|
|
||||||
|
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 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.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Example</summary>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
only-new-issues: true
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### `working-directory`
|
||||||
|
|
||||||
|
(optional)
|
||||||
|
|
||||||
|
Working directory, useful for monorepos.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Example</summary>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
working-directory: somedir
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### `args`
|
||||||
|
|
||||||
|
(optional)
|
||||||
|
|
||||||
|
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=`.
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Adding a `=` between the flag name and its value is important because the action parses the arguments on spaces.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Example</summary>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
# 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
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### `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 default golangci-lint output (`text`).
|
||||||
|
|
||||||
|
Works only with `text` format (the golangci-lint default).
|
||||||
|
|
||||||
|
https://golangci-lint.run/usage/configuration/#output-configuration
|
||||||
|
|
||||||
|
The default value is `false`.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Example</summary>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
problem-matchers: true
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### `skip-cache`
|
||||||
|
|
||||||
|
(optional)
|
||||||
|
|
||||||
|
If set to `true`, then all caching functionality will be completely disabled,
|
||||||
|
takes precedence over all other caching options.
|
||||||
|
|
||||||
|
The default value is `false`.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Example</summary>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
skip-cache: true
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### `skip-save-cache`
|
||||||
|
|
||||||
|
(optional)
|
||||||
|
|
||||||
|
If set to `true`, caches will not be saved, but they may still be restored, requiring `skip-cache: false`.
|
||||||
|
|
||||||
|
The default value is `false`.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Example</summary>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
skip-save-cache: true
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### `cache-invalidation-interval`
|
||||||
|
|
||||||
|
(optional)
|
||||||
|
|
||||||
|
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`.
|
||||||
|
|
||||||
|
If the number is `<= 0`, the cache will always be invalidated (Not recommended).
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Example</summary>
|
||||||
|
|
||||||
|
```yml
|
||||||
|
uses: golangci/golangci-lint-action@v8
|
||||||
|
with:
|
||||||
|
cache-invalidation-interval: 15
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## Annotations
|
||||||
|
|
||||||
|
Currently, GitHub parses the action's output and creates [annotations](https://github.blog/2018-12-14-introducing-check-runs-and-annotations/).
|
||||||
|
|
||||||
The restrictions of annotations are the following:
|
The restrictions of annotations are the following:
|
||||||
|
|
||||||
1. Currently, they don't support markdown formatting (see the [feature request](https://github.community/t5/GitHub-API-Development-and/Checks-Ability-to-include-Markdown-in-line-annotations/m-p/56704))
|
1. Currently, they don't support Markdown formatting (see the [feature request](https://github.community/t5/GitHub-API-Development-and/Checks-Ability-to-include-Markdown-in-line-annotations/m-p/56704))
|
||||||
2. They aren't shown in list of comments like it was with [golangci.com](https://golangci.com). If you would like to have comments - please, up-vote [the issue](https://github.com/golangci/golangci-lint-action/issues/5).
|
2. They aren't shown in the list of comments.
|
||||||
|
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).
|
||||||
|
|
||||||
|
Permissions required:
|
||||||
|
|
||||||
|
```yaml annotate
|
||||||
|
permissions:
|
||||||
|
# Required: allow read access to the content for analysis.
|
||||||
|
contents: read
|
||||||
|
# Optional: allow read access to pull request. Use with `only-new-issues` option.
|
||||||
|
pull-requests: read
|
||||||
|
```
|
||||||
|
|
||||||
|
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
|
## Performance
|
||||||
|
|
||||||
The action was implemented with performance in mind:
|
The action was implemented with performance in mind:
|
||||||
|
|
||||||
1. We cache data by [@actions/cache](https://github.com/actions/toolkit/tree/master/packages/cache) between builds: Go build cache, Go modules cache, golangci-lint analysis 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.
|
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, go and golangci-lint binary in parallel.
|
3. We do as much as we can in parallel, e.g. we download cache, and golangci-lint binary in parallel.
|
||||||
|
|
||||||
For example, in a repository of [golangci-lint](https://github.com/golangci/golangci-lint) running this action without the cache takes 50s, but with cache takes 14s:
|
For example, in a repository of [golangci-lint](https://github.com/golangci/golangci-lint) running this action without the cache takes 50s, but with cache takes 14s:
|
||||||
* in parallel:
|
* in parallel:
|
||||||
@@ -148,34 +541,32 @@ For example, in a repository of [golangci-lint](https://github.com/golangci/gola
|
|||||||
|
|
||||||
## Internals
|
## Internals
|
||||||
|
|
||||||
We use JavaScript-based action. We don't use Docker-based action because:
|
We use JavaScript-based action.
|
||||||
|
We don't use Docker-based action because:
|
||||||
|
|
||||||
1. docker pulling is slow currently
|
1. Docker pulling is slow currently
|
||||||
2. it's easier to use caching from [@actions/cache](https://github.com/actions/toolkit/tree/master/packages/cache)
|
2. it's easier to use caching from [@actions/cache](https://github.com/actions/toolkit/tree/HEAD/packages/cache)
|
||||||
|
|
||||||
We support different platforms, such as `ubuntu`, `macos` and `windows` with `x32` and `x64` archs.
|
We support different platforms, such as `ubuntu`, `macos`, and `windows` with `x32` and `x64` archs.
|
||||||
|
|
||||||
Inside our action we perform 3 steps:
|
Inside our action, we perform 3 steps:
|
||||||
|
|
||||||
1. Setup environment running in parallel:
|
1. Setup environment running in parallel:
|
||||||
* restore [cache](https://github.com/actions/cache) of previous analyzes
|
* restore [cache](https://github.com/actions/cache) of previous analyses
|
||||||
* fetch [action config](https://github.com/golangci/golangci-lint/blob/master/assets/github-action-config.json) and find the latest `golangci-lint` patch version
|
* fetch [action config](https://github.com/golangci/golangci-lint/blob/HEAD/assets/github-action-config.json) and find the latest `golangci-lint` patch version for needed version
|
||||||
for needed version (users of this action can specify only minor version of `golangci-lint`). After that install [golangci-lint](https://github.com/golangci/golangci-lint) using [@actions/tool-cache](https://github.com/actions/toolkit/tree/master/packages/tool-cache)
|
(users of this action can specify only minor version of `golangci-lint`).
|
||||||
|
After that install [golangci-lint](https://github.com/golangci/golangci-lint) using [@actions/tool-cache](https://github.com/actions/toolkit/tree/HEAD/packages/tool-cache)
|
||||||
2. Run `golangci-lint` with specified by user `args`
|
2. Run `golangci-lint` with specified by user `args`
|
||||||
3. Save cache for later builds
|
3. Save cache for later builds
|
||||||
|
|
||||||
### Caching internals
|
### Caching internals
|
||||||
|
|
||||||
1. We save and restore the following directories: `~/.cache/golangci-lint`, `~/.cache/go-build`, `~/go/pkg`.
|
1. We save and restore the following directory: `~/.cache/golangci-lint`.
|
||||||
2. The primary caching key looks like `golangci-lint.cache-{platform-arch}-{interval_number}-{go.mod_hash}`. Interval number ensures that we periodically invalidate
|
2. The primary caching key looks like `golangci-lint.cache-{runner_os}-{working_directory}-{interval_number}-{go.mod_hash}`.
|
||||||
our cache (every 7 days). `go.mod` hash ensures that we invalidate the cache early - as soon as dependencies have changed.
|
Interval number ensures that we periodically invalidate our cache (every 7 days).
|
||||||
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}-`, `golangci-lint.cache-`. GitHub matches keys by prefix if we have no exact match for the primary cache.
|
`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-{runner_os}-{working_directory}-{interval_number}-`.
|
||||||
|
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.
|
||||||
|
|
||||||
## Development of this action
|
|
||||||
|
|
||||||
1. Install [act](https://github.com/nektos/act#installation)
|
|
||||||
2. Make a symlink for `act` to work properly: `ln -s . golangci-lint-action`
|
|
||||||
3. Prepare deps once: `npm run prepare-deps`
|
|
||||||
4. Run `npm run local` after any change to test it
|
|
||||||
|
50
action.yml
50
action.yml
@@ -1,13 +1,19 @@
|
|||||||
name: "Run golangci-lint"
|
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions
|
||||||
|
name: "Golangci-lint"
|
||||||
description: "Official golangci-lint action with line-attached annotations for found issues, caching and parallel execution."
|
description: "Official golangci-lint action with line-attached annotations for found issues, caching and parallel execution."
|
||||||
author: "golangci"
|
author: "golangci"
|
||||||
inputs:
|
inputs:
|
||||||
version:
|
version:
|
||||||
description: "version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version"
|
description: |
|
||||||
|
The version of golangci-lint to use.
|
||||||
|
When `install-mode` is:
|
||||||
|
- `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
|
required: false
|
||||||
args:
|
install-mode:
|
||||||
description: "golangci-lint command line arguments"
|
description: "The mode to install golangci-lint. It can be 'binary', 'goinstall', or 'none'."
|
||||||
default: ""
|
default: "binary"
|
||||||
required: false
|
required: false
|
||||||
working-directory:
|
working-directory:
|
||||||
description: "golangci-lint working directory, default is project root"
|
description: "golangci-lint working directory, default is project root"
|
||||||
@@ -16,28 +22,42 @@ inputs:
|
|||||||
description: "the token is used for fetching patch of a pull request to show only new issues"
|
description: "the token is used for fetching patch of a pull request to show only new issues"
|
||||||
default: ${{ github.token }}
|
default: ${{ github.token }}
|
||||||
required: false
|
required: false
|
||||||
|
verify:
|
||||||
|
description: "if set to true and the action verify the configuration file against the JSONSchema"
|
||||||
|
default: 'true'
|
||||||
|
required: false
|
||||||
only-new-issues:
|
only-new-issues:
|
||||||
description: "if set to true and the action runs on a pull request - the action outputs only newly found issues"
|
description: "if set to true and the action runs on a pull request - the action outputs only newly found issues"
|
||||||
default: false
|
default: 'false'
|
||||||
required: false
|
required: false
|
||||||
skip-cache:
|
skip-cache:
|
||||||
description: |
|
description: |
|
||||||
if set to true then the all caching functionality will be complete disabled,
|
if set to true then the all caching functionality will be complete disabled,
|
||||||
takes precedence over all other caching options.
|
takes precedence over all other caching options.
|
||||||
default: false
|
default: 'false'
|
||||||
required: false
|
required: false
|
||||||
skip-pkg-cache:
|
skip-save-cache:
|
||||||
description: "if set to true then the action doesn't cache or restore ~/go/pkg."
|
description: |
|
||||||
default: false
|
if set to true then the action will not save any caches, but it may still
|
||||||
|
restore existing caches, subject to other options.
|
||||||
|
default: 'false'
|
||||||
required: false
|
required: false
|
||||||
skip-build-cache:
|
problem-matchers:
|
||||||
description: "if set to true then the action doesn't cache or restore ~/.cache/go-build."
|
description: "Force the usage of the embedded problem matchers"
|
||||||
default: false
|
default: 'false'
|
||||||
|
required: false
|
||||||
|
args:
|
||||||
|
description: "golangci-lint command line arguments"
|
||||||
|
default: ""
|
||||||
|
required: false
|
||||||
|
cache-invalidation-interval:
|
||||||
|
description: "Periodically invalidate a cache because a new code being added. (number of days)"
|
||||||
|
default: '7'
|
||||||
required: false
|
required: false
|
||||||
runs:
|
runs:
|
||||||
using: "node16"
|
using: "node20"
|
||||||
main: "dist/run/index.js"
|
main: "dist/run/index.js"
|
||||||
post: "dist/post_run/index.js"
|
post: "dist/post_run/index.js"
|
||||||
branding:
|
branding:
|
||||||
icon: "shield"
|
icon: "shield"
|
||||||
color: "yellow"
|
color: "white"
|
||||||
|
53624
dist/post_run/index.js
generated
vendored
53624
dist/post_run/index.js
generated
vendored
File diff suppressed because one or more lines are too long
53624
dist/run/index.js
generated
vendored
53624
dist/run/index.js
generated
vendored
File diff suppressed because one or more lines are too long
2
go.mod
2
go.mod
@@ -1,3 +1,3 @@
|
|||||||
module github.com/golangci/golangci-lint-action
|
module github.com/golangci/golangci-lint-action
|
||||||
|
|
||||||
go 1.14
|
go 1.23
|
||||||
|
5083
package-lock.json
generated
5083
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
43
package.json
43
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "golanci-lint-action",
|
"name": "golanci-lint-action",
|
||||||
"version": "3.1.0",
|
"version": "8.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "golangci-lint github action",
|
"description": "golangci-lint github action",
|
||||||
"main": "dist/main.js",
|
"main": "dist/main.js",
|
||||||
@@ -24,27 +24,30 @@
|
|||||||
"author": "golangci",
|
"author": "golangci",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/cache": "^3.1.2",
|
"@actions/cache": "^4.0.3",
|
||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.11.1",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/github": "^5.1.1",
|
"@actions/github": "^6.0.0",
|
||||||
"@actions/http-client": "^2.0.1",
|
"@actions/http-client": "^2.2.3",
|
||||||
"@actions/tool-cache": "^2.0.1",
|
"@octokit/plugin-retry": "^6.1.0",
|
||||||
"@types/node": "^18.11.18",
|
"@actions/tool-cache": "^2.0.2",
|
||||||
"@types/semver": "^7.3.13",
|
"@types/node": "^22.14.1",
|
||||||
"@types/tmp": "^0.2.3",
|
"@types/semver": "^7.7.0",
|
||||||
"tmp": "^0.2.1"
|
"@types/tmp": "^0.2.6",
|
||||||
|
"@types/which": "^3.0.4",
|
||||||
|
"tmp": "^0.2.3",
|
||||||
|
"which": "^5.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
"@typescript-eslint/eslint-plugin": "^8.30.1",
|
||||||
"@typescript-eslint/parser": "^5.48.2",
|
"@typescript-eslint/parser": "^8.30.1",
|
||||||
"@vercel/ncc": "^0.36.0",
|
"@vercel/ncc": "^0.38.3",
|
||||||
"eslint": "^8.32.0",
|
"eslint": "^8.57.1",
|
||||||
"eslint-config-prettier": "^8.6.0",
|
"eslint-config-prettier": "^10.1.2",
|
||||||
"eslint-plugin-import": "^2.27.5",
|
"eslint-plugin-import": "^2.31.0",
|
||||||
"eslint-plugin-prettier": "^4.2.1",
|
"eslint-plugin-prettier": "^5.2.6",
|
||||||
"eslint-plugin-simple-import-sort": "^9.0.0",
|
"eslint-plugin-simple-import-sort": "^12.1.1",
|
||||||
"prettier": "^2.8.3",
|
"prettier": "^3.5.3",
|
||||||
"typescript": "^4.9.4"
|
"typescript": "^5.8.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
17
problem-matchers.json
Normal file
17
problem-matchers.json
Normal 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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
7
sample-go-mod/.golangci.yml
Normal file
7
sample-go-mod/.golangci.yml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
version: "2"
|
||||||
|
|
||||||
|
output:
|
||||||
|
show-stats: true
|
||||||
|
sort-order:
|
||||||
|
- file
|
||||||
|
- linter
|
@@ -1,174 +1,205 @@
|
|||||||
module sample
|
module sample
|
||||||
|
|
||||||
go 1.18
|
go 1.23.0
|
||||||
|
|
||||||
require github.com/golangci/golangci-lint v1.49.0
|
require github.com/golangci/golangci-lint/v2 v2.1.5
|
||||||
|
|
||||||
require (
|
require (
|
||||||
4d63.com/gochecknoglobals v0.1.0 // indirect
|
4d63.com/gocheckcompilerdirectives v1.3.0 // indirect
|
||||||
github.com/Antonboom/errname v0.1.7 // indirect
|
4d63.com/gochecknoglobals v0.2.2 // indirect
|
||||||
github.com/Antonboom/nilnil v0.1.1 // indirect
|
github.com/4meepo/tagalign v1.4.2 // indirect
|
||||||
github.com/BurntSushi/toml v1.2.0 // indirect
|
github.com/Abirdcfly/dupword v0.1.3 // indirect
|
||||||
|
github.com/Antonboom/errname v1.1.0 // indirect
|
||||||
|
github.com/Antonboom/nilnil v1.1.0 // indirect
|
||||||
|
github.com/Antonboom/testifylint v1.6.1 // indirect
|
||||||
|
github.com/BurntSushi/toml v1.5.0 // indirect
|
||||||
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect
|
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect
|
||||||
github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect
|
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 // indirect
|
||||||
github.com/Masterminds/semver v1.5.0 // indirect
|
github.com/Masterminds/semver/v3 v3.3.1 // indirect
|
||||||
github.com/OpenPeeDeeP/depguard v1.1.0 // indirect
|
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect
|
||||||
|
github.com/alecthomas/chroma/v2 v2.16.0 // indirect
|
||||||
|
github.com/alecthomas/go-check-sumtype v0.3.1 // indirect
|
||||||
|
github.com/alexkohler/nakedret/v2 v2.0.6 // indirect
|
||||||
github.com/alexkohler/prealloc v1.0.0 // indirect
|
github.com/alexkohler/prealloc v1.0.0 // indirect
|
||||||
github.com/alingse/asasalint v0.0.11 // indirect
|
github.com/alingse/asasalint v0.0.11 // indirect
|
||||||
github.com/ashanbrown/forbidigo v1.3.0 // indirect
|
github.com/alingse/nilnesserr v0.2.0 // indirect
|
||||||
github.com/ashanbrown/makezero v1.1.1 // indirect
|
github.com/ashanbrown/forbidigo v1.6.0 // indirect
|
||||||
|
github.com/ashanbrown/makezero v1.2.0 // indirect
|
||||||
|
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/bkielbasa/cyclop v1.2.0 // indirect
|
github.com/bkielbasa/cyclop v1.2.3 // indirect
|
||||||
github.com/blizzy78/varnamelen v0.8.0 // indirect
|
github.com/blizzy78/varnamelen v0.8.0 // indirect
|
||||||
github.com/bombsimon/wsl/v3 v3.3.0 // indirect
|
github.com/bombsimon/wsl/v4 v4.7.0 // indirect
|
||||||
github.com/breml/bidichk v0.2.3 // indirect
|
github.com/breml/bidichk v0.3.3 // indirect
|
||||||
github.com/breml/errchkjson v0.3.0 // indirect
|
github.com/breml/errchkjson v0.4.1 // indirect
|
||||||
github.com/butuzov/ireturn v0.1.1 // indirect
|
github.com/butuzov/ireturn v0.4.0 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
github.com/butuzov/mirror v1.3.0 // indirect
|
||||||
github.com/charithe/durationcheck v0.0.9 // indirect
|
github.com/catenacyber/perfsprint v0.9.1 // indirect
|
||||||
github.com/chavacava/garif v0.0.0-20220630083739-93517212f375 // indirect
|
github.com/ccojocar/zxcvbn-go v1.0.2 // indirect
|
||||||
github.com/curioswitch/go-reassign v0.1.2 // indirect
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
github.com/daixiang0/gci v0.6.3 // indirect
|
github.com/charithe/durationcheck v0.0.10 // indirect
|
||||||
|
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
|
||||||
|
github.com/charmbracelet/lipgloss v1.1.0 // indirect
|
||||||
|
github.com/charmbracelet/x/ansi v0.8.0 // indirect
|
||||||
|
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
|
||||||
|
github.com/charmbracelet/x/term v0.2.1 // indirect
|
||||||
|
github.com/chavacava/garif v0.1.0 // indirect
|
||||||
|
github.com/ckaznocha/intrange v0.3.1 // indirect
|
||||||
|
github.com/curioswitch/go-reassign v0.3.0 // indirect
|
||||||
|
github.com/daixiang0/gci v0.13.6 // indirect
|
||||||
|
github.com/dave/dst v0.27.3 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/denis-tingaikin/go-header v0.4.3 // indirect
|
github.com/denis-tingaikin/go-header v0.5.0 // indirect
|
||||||
github.com/esimonov/ifshort v1.0.4 // indirect
|
github.com/dlclark/regexp2 v1.11.5 // indirect
|
||||||
github.com/ettle/strcase v0.1.1 // indirect
|
github.com/ettle/strcase v0.2.0 // indirect
|
||||||
github.com/fatih/color v1.13.0 // indirect
|
github.com/fatih/color v1.18.0 // indirect
|
||||||
github.com/fatih/structtag v1.2.0 // indirect
|
github.com/fatih/structtag v1.2.0 // indirect
|
||||||
github.com/firefart/nonamedreturns v1.0.4 // indirect
|
github.com/firefart/nonamedreturns v1.0.6 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.5.4 // indirect
|
github.com/fsnotify/fsnotify v1.5.4 // indirect
|
||||||
github.com/fzipp/gocyclo v0.6.0 // indirect
|
github.com/fzipp/gocyclo v0.6.0 // indirect
|
||||||
github.com/go-critic/go-critic v0.6.4 // indirect
|
github.com/ghostiam/protogetter v0.3.15 // indirect
|
||||||
github.com/go-toolsmith/astcast v1.0.0 // indirect
|
github.com/go-critic/go-critic v0.13.0 // indirect
|
||||||
github.com/go-toolsmith/astcopy v1.0.1 // indirect
|
github.com/go-toolsmith/astcast v1.1.0 // indirect
|
||||||
github.com/go-toolsmith/astequal v1.0.2 // indirect
|
github.com/go-toolsmith/astcopy v1.1.0 // indirect
|
||||||
github.com/go-toolsmith/astfmt v1.0.0 // indirect
|
github.com/go-toolsmith/astequal v1.2.0 // indirect
|
||||||
github.com/go-toolsmith/astp v1.0.0 // indirect
|
github.com/go-toolsmith/astfmt v1.1.0 // indirect
|
||||||
github.com/go-toolsmith/strparse v1.0.0 // indirect
|
github.com/go-toolsmith/astp v1.1.0 // indirect
|
||||||
github.com/go-toolsmith/typep v1.0.2 // indirect
|
github.com/go-toolsmith/strparse v1.1.0 // indirect
|
||||||
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect
|
github.com/go-toolsmith/typep v1.1.0 // indirect
|
||||||
|
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
|
||||||
|
github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect
|
||||||
github.com/gobwas/glob v0.2.3 // indirect
|
github.com/gobwas/glob v0.2.3 // indirect
|
||||||
github.com/gofrs/flock v0.8.1 // indirect
|
github.com/gofrs/flock v0.12.1 // indirect
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect
|
github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect
|
||||||
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect
|
github.com/golangci/go-printf-func-name v0.1.0 // indirect
|
||||||
github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe // indirect
|
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect
|
||||||
github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a // indirect
|
github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 // indirect
|
||||||
github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect
|
github.com/golangci/misspell v0.6.0 // indirect
|
||||||
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect
|
github.com/golangci/plugin-module-register v0.1.1 // indirect
|
||||||
github.com/golangci/misspell v0.3.5 // indirect
|
github.com/golangci/revgrep v0.8.0 // indirect
|
||||||
github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect
|
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect
|
||||||
github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect
|
github.com/google/go-cmp v0.7.0 // indirect
|
||||||
github.com/google/go-cmp v0.5.8 // indirect
|
github.com/gordonklaus/ineffassign v0.1.0 // indirect
|
||||||
github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8 // indirect
|
|
||||||
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
|
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
|
||||||
github.com/gostaticanalysis/comment v1.4.2 // indirect
|
github.com/gostaticanalysis/comment v1.5.0 // indirect
|
||||||
github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect
|
github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect
|
||||||
github.com/gostaticanalysis/nilerr v0.1.1 // indirect
|
github.com/gostaticanalysis/nilerr v0.1.1 // indirect
|
||||||
github.com/hashicorp/errwrap v1.0.0 // indirect
|
github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect
|
||||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
github.com/hashicorp/go-version v1.7.0 // indirect
|
||||||
github.com/hashicorp/go-version v1.6.0 // indirect
|
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
||||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
github.com/hexops/gotextdiff v1.0.3 // indirect
|
github.com/hexops/gotextdiff v1.0.3 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
github.com/jgautheron/goconst v1.5.1 // indirect
|
github.com/jgautheron/goconst v1.8.1 // indirect
|
||||||
github.com/jingyugao/rowserrcheck v1.1.1 // indirect
|
github.com/jingyugao/rowserrcheck v1.1.1 // indirect
|
||||||
github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect
|
github.com/jjti/go-spancheck v0.6.4 // indirect
|
||||||
github.com/julz/importas v0.1.0 // indirect
|
github.com/julz/importas v0.2.0 // indirect
|
||||||
github.com/kisielk/errcheck v1.6.2 // indirect
|
github.com/karamaru-alpha/copyloopvar v1.2.1 // indirect
|
||||||
github.com/kisielk/gotool v1.0.0 // indirect
|
github.com/kisielk/errcheck v1.9.0 // indirect
|
||||||
|
github.com/kkHAIKE/contextcheck v1.1.6 // indirect
|
||||||
github.com/kulti/thelper v0.6.3 // indirect
|
github.com/kulti/thelper v0.6.3 // indirect
|
||||||
github.com/kunwardeep/paralleltest v1.0.6 // indirect
|
github.com/kunwardeep/paralleltest v1.0.14 // indirect
|
||||||
github.com/kyoh86/exportloopref v0.1.8 // indirect
|
github.com/lasiar/canonicalheader v1.1.2 // indirect
|
||||||
github.com/ldez/gomoddirectives v0.2.3 // indirect
|
github.com/ldez/exptostd v0.4.3 // indirect
|
||||||
github.com/ldez/tagliatelle v0.3.1 // indirect
|
github.com/ldez/gomoddirectives v0.6.1 // indirect
|
||||||
github.com/leonklingele/grouper v1.1.0 // indirect
|
github.com/ldez/grignotin v0.9.0 // indirect
|
||||||
github.com/lufeee/execinquery v1.2.1 // indirect
|
github.com/ldez/tagliatelle v0.7.1 // indirect
|
||||||
|
github.com/ldez/usetesting v0.4.3 // indirect
|
||||||
|
github.com/leonklingele/grouper v1.1.2 // indirect
|
||||||
|
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
||||||
|
github.com/macabu/inamedparam v0.2.0 // indirect
|
||||||
github.com/magiconair/properties v1.8.6 // indirect
|
github.com/magiconair/properties v1.8.6 // indirect
|
||||||
github.com/maratori/testpackage v1.1.0 // indirect
|
github.com/manuelarte/funcorder v0.2.1 // indirect
|
||||||
github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 // indirect
|
github.com/maratori/testableexamples v1.0.0 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
github.com/maratori/testpackage v1.1.1 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.16 // indirect
|
github.com/matoous/godox v1.1.0 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.9 // indirect
|
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
|
github.com/mattn/go-runewidth v0.0.16 // indirect
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
|
||||||
github.com/mbilski/exhaustivestruct v1.2.0 // indirect
|
github.com/mgechev/revive v1.9.0 // indirect
|
||||||
github.com/mgechev/revive v1.2.3 // indirect
|
|
||||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
github.com/moricho/tparallel v0.2.1 // indirect
|
github.com/moricho/tparallel v0.3.2 // indirect
|
||||||
|
github.com/muesli/termenv v0.16.0 // indirect
|
||||||
github.com/nakabonne/nestif v0.3.1 // indirect
|
github.com/nakabonne/nestif v0.3.1 // indirect
|
||||||
github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect
|
github.com/nishanths/exhaustive v0.12.0 // indirect
|
||||||
github.com/nishanths/exhaustive v0.8.1 // indirect
|
|
||||||
github.com/nishanths/predeclared v0.2.2 // indirect
|
github.com/nishanths/predeclared v0.2.2 // indirect
|
||||||
|
github.com/nunnatsa/ginkgolinter v0.19.1 // indirect
|
||||||
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
||||||
github.com/pelletier/go-toml v1.9.5 // indirect
|
github.com/pelletier/go-toml v1.9.5 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.0.2 // indirect
|
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
||||||
github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d // indirect
|
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/polyfloyd/go-errorlint v1.0.2 // indirect
|
github.com/polyfloyd/go-errorlint v1.8.0 // indirect
|
||||||
github.com/prometheus/client_golang v1.12.1 // indirect
|
github.com/prometheus/client_golang v1.12.1 // indirect
|
||||||
github.com/prometheus/client_model v0.2.0 // indirect
|
github.com/prometheus/client_model v0.2.0 // indirect
|
||||||
github.com/prometheus/common v0.32.1 // indirect
|
github.com/prometheus/common v0.32.1 // indirect
|
||||||
github.com/prometheus/procfs v0.7.3 // indirect
|
github.com/prometheus/procfs v0.7.3 // indirect
|
||||||
github.com/quasilyte/go-ruleguard v0.3.17 // indirect
|
github.com/quasilyte/go-ruleguard v0.4.4 // indirect
|
||||||
github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5 // indirect
|
github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect
|
||||||
github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 // indirect
|
github.com/quasilyte/gogrep v0.5.0 // indirect
|
||||||
|
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
|
||||||
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
|
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
|
||||||
github.com/ryancurrah/gomodguard v1.2.4 // indirect
|
github.com/raeperd/recvcheck v0.2.0 // indirect
|
||||||
github.com/ryanrolds/sqlclosecheck v0.3.0 // indirect
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
github.com/sanposhiho/wastedassign/v2 v2.0.6 // indirect
|
github.com/rogpeppe/go-internal v1.14.1 // indirect
|
||||||
|
github.com/ryancurrah/gomodguard v1.4.1 // indirect
|
||||||
|
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
|
||||||
|
github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect
|
||||||
|
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect
|
||||||
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
|
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
|
||||||
github.com/sashamelentyev/usestdlibvars v1.13.0 // indirect
|
github.com/sashamelentyev/usestdlibvars v1.28.0 // indirect
|
||||||
github.com/securego/gosec/v2 v2.13.1 // indirect
|
github.com/securego/gosec/v2 v2.22.3 // indirect
|
||||||
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect
|
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||||
github.com/sirupsen/logrus v1.9.0 // indirect
|
github.com/sivchari/containedctx v1.0.3 // indirect
|
||||||
github.com/sivchari/containedctx v1.0.2 // indirect
|
github.com/sonatard/noctx v0.1.0 // indirect
|
||||||
github.com/sivchari/nosnakecase v1.7.0 // indirect
|
github.com/sourcegraph/go-diff v0.7.0 // indirect
|
||||||
github.com/sivchari/tenv v1.7.0 // indirect
|
github.com/spf13/afero v1.14.0 // indirect
|
||||||
github.com/sonatard/noctx v0.0.1 // indirect
|
|
||||||
github.com/sourcegraph/go-diff v0.6.1 // indirect
|
|
||||||
github.com/spf13/afero v1.8.2 // indirect
|
|
||||||
github.com/spf13/cast v1.5.0 // indirect
|
github.com/spf13/cast v1.5.0 // indirect
|
||||||
github.com/spf13/cobra v1.5.0 // indirect
|
github.com/spf13/cobra v1.9.1 // indirect
|
||||||
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.6 // indirect
|
||||||
github.com/spf13/viper v1.12.0 // indirect
|
github.com/spf13/viper v1.12.0 // indirect
|
||||||
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
|
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
|
||||||
github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect
|
github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect
|
||||||
github.com/stretchr/objx v0.4.0 // indirect
|
github.com/stretchr/objx v0.5.2 // indirect
|
||||||
github.com/stretchr/testify v1.8.0 // indirect
|
github.com/stretchr/testify v1.10.0 // indirect
|
||||||
github.com/subosito/gotenv v1.4.0 // indirect
|
github.com/subosito/gotenv v1.4.1 // indirect
|
||||||
github.com/sylvia7788/contextcheck v1.0.6 // indirect
|
github.com/tdakkota/asciicheck v0.4.1 // indirect
|
||||||
github.com/tdakkota/asciicheck v0.1.1 // indirect
|
github.com/tetafro/godot v1.5.0 // indirect
|
||||||
github.com/tetafro/godot v1.4.11 // indirect
|
github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect
|
||||||
github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 // indirect
|
github.com/timonwong/loggercheck v0.11.0 // indirect
|
||||||
github.com/timonwong/logrlint v0.1.0 // indirect
|
github.com/tomarrell/wrapcheck/v2 v2.11.0 // indirect
|
||||||
github.com/tomarrell/wrapcheck/v2 v2.6.2 // indirect
|
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
|
||||||
github.com/tommy-muehle/go-mnd/v2 v2.5.0 // indirect
|
github.com/ultraware/funlen v0.2.0 // indirect
|
||||||
github.com/ultraware/funlen v0.0.3 // indirect
|
github.com/ultraware/whitespace v0.2.0 // indirect
|
||||||
github.com/ultraware/whitespace v0.0.5 // indirect
|
github.com/uudashr/gocognit v1.2.0 // indirect
|
||||||
github.com/uudashr/gocognit v1.0.6 // indirect
|
github.com/uudashr/iface v1.3.1 // indirect
|
||||||
|
github.com/xen0n/gosmopolitan v1.3.0 // indirect
|
||||||
|
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
|
||||||
github.com/yagipy/maintidx v1.0.0 // indirect
|
github.com/yagipy/maintidx v1.0.0 // indirect
|
||||||
github.com/yeya24/promlinter v0.2.0 // indirect
|
github.com/yeya24/promlinter v0.3.0 // indirect
|
||||||
gitlab.com/bosi/decorder v0.2.3 // indirect
|
github.com/ykadowak/zerologlint v0.1.5 // indirect
|
||||||
|
gitlab.com/bosi/decorder v0.4.2 // indirect
|
||||||
|
go-simpler.org/musttag v0.13.0 // indirect
|
||||||
|
go-simpler.org/sloglint v0.11.0 // indirect
|
||||||
|
go.augendre.info/fatcontext v0.8.0 // indirect
|
||||||
go.uber.org/atomic v1.7.0 // indirect
|
go.uber.org/atomic v1.7.0 // indirect
|
||||||
|
go.uber.org/automaxprocs v1.6.0 // indirect
|
||||||
go.uber.org/multierr v1.6.0 // indirect
|
go.uber.org/multierr v1.6.0 // indirect
|
||||||
go.uber.org/zap v1.17.0 // indirect
|
go.uber.org/zap v1.24.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect
|
golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect
|
||||||
golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d // indirect
|
golang.org/x/mod v0.24.0 // indirect
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
|
golang.org/x/sync v0.13.0 // indirect
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect
|
golang.org/x/sys v0.32.0 // indirect
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect
|
golang.org/x/text v0.24.0 // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/tools v0.32.0 // indirect
|
||||||
golang.org/x/tools v0.1.12 // indirect
|
google.golang.org/protobuf v1.36.6 // indirect
|
||||||
google.golang.org/protobuf v1.28.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/ini.v1 v1.66.6 // indirect
|
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
honnef.co/go/tools v0.3.3 // indirect
|
honnef.co/go/tools v0.6.1 // indirect
|
||||||
mvdan.cc/gofumpt v0.3.1 // indirect
|
mvdan.cc/gofumpt v0.8.0 // indirect
|
||||||
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect
|
mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 // indirect
|
||||||
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect
|
|
||||||
mvdan.cc/unparam v0.0.0-20220706161116-678bad134442 // indirect
|
|
||||||
)
|
)
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
// +build tools
|
//go:build tools
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/golangci/golangci-lint/cmd/golangci-lint"
|
_ "github.com/golangci/golangci-lint/v2/cmd/golangci-lint"
|
||||||
)
|
)
|
||||||
|
7
sample-go-tool/.golangci.yml
Normal file
7
sample-go-tool/.golangci.yml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
version: "2"
|
||||||
|
|
||||||
|
output:
|
||||||
|
show-stats: true
|
||||||
|
sort-order:
|
||||||
|
- file
|
||||||
|
- linter
|
210
sample-go-tool/go.mod
Normal file
210
sample-go-tool/go.mod
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
module sample
|
||||||
|
|
||||||
|
go 1.24
|
||||||
|
|
||||||
|
toolchain go1.24.0
|
||||||
|
|
||||||
|
tool github.com/golangci/golangci-lint/v2/cmd/golangci-lint
|
||||||
|
|
||||||
|
require (
|
||||||
|
4d63.com/gocheckcompilerdirectives v1.3.0 // indirect
|
||||||
|
4d63.com/gochecknoglobals v0.2.2 // indirect
|
||||||
|
github.com/4meepo/tagalign v1.4.2 // indirect
|
||||||
|
github.com/Abirdcfly/dupword v0.1.3 // indirect
|
||||||
|
github.com/Antonboom/errname v1.1.0 // indirect
|
||||||
|
github.com/Antonboom/nilnil v1.1.0 // indirect
|
||||||
|
github.com/Antonboom/testifylint v1.6.1 // indirect
|
||||||
|
github.com/BurntSushi/toml v1.5.0 // indirect
|
||||||
|
github.com/Crocmagnon/fatcontext v0.7.1 // indirect
|
||||||
|
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect
|
||||||
|
github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 // indirect
|
||||||
|
github.com/Masterminds/semver/v3 v3.3.1 // indirect
|
||||||
|
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect
|
||||||
|
github.com/alecthomas/chroma/v2 v2.17.2 // indirect
|
||||||
|
github.com/alecthomas/go-check-sumtype v0.3.1 // indirect
|
||||||
|
github.com/alexkohler/nakedret/v2 v2.0.6 // indirect
|
||||||
|
github.com/alexkohler/prealloc v1.0.0 // indirect
|
||||||
|
github.com/alingse/asasalint v0.0.11 // indirect
|
||||||
|
github.com/alingse/nilnesserr v0.2.0 // indirect
|
||||||
|
github.com/ashanbrown/forbidigo v1.6.0 // indirect
|
||||||
|
github.com/ashanbrown/makezero v1.2.0 // indirect
|
||||||
|
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
|
||||||
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
|
github.com/bkielbasa/cyclop v1.2.3 // indirect
|
||||||
|
github.com/blizzy78/varnamelen v0.8.0 // indirect
|
||||||
|
github.com/bombsimon/wsl/v4 v4.7.0 // indirect
|
||||||
|
github.com/breml/bidichk v0.3.3 // indirect
|
||||||
|
github.com/breml/errchkjson v0.4.1 // indirect
|
||||||
|
github.com/butuzov/ireturn v0.4.0 // indirect
|
||||||
|
github.com/butuzov/mirror v1.3.0 // indirect
|
||||||
|
github.com/catenacyber/perfsprint v0.9.1 // indirect
|
||||||
|
github.com/ccojocar/zxcvbn-go v1.0.2 // indirect
|
||||||
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
|
github.com/charithe/durationcheck v0.0.10 // indirect
|
||||||
|
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
|
||||||
|
github.com/charmbracelet/lipgloss v1.1.0 // indirect
|
||||||
|
github.com/charmbracelet/x/ansi v0.8.0 // indirect
|
||||||
|
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
|
||||||
|
github.com/charmbracelet/x/term v0.2.1 // indirect
|
||||||
|
github.com/chavacava/garif v0.1.0 // indirect
|
||||||
|
github.com/ckaznocha/intrange v0.3.1 // indirect
|
||||||
|
github.com/curioswitch/go-reassign v0.3.0 // indirect
|
||||||
|
github.com/daixiang0/gci v0.13.6 // indirect
|
||||||
|
github.com/dave/dst v0.27.3 // indirect
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/denis-tingaikin/go-header v0.5.0 // indirect
|
||||||
|
github.com/dlclark/regexp2 v1.11.5 // indirect
|
||||||
|
github.com/ettle/strcase v0.2.0 // indirect
|
||||||
|
github.com/fatih/color v1.18.0 // indirect
|
||||||
|
github.com/fatih/structtag v1.2.0 // indirect
|
||||||
|
github.com/firefart/nonamedreturns v1.0.6 // indirect
|
||||||
|
github.com/fsnotify/fsnotify v1.5.4 // indirect
|
||||||
|
github.com/fzipp/gocyclo v0.6.0 // indirect
|
||||||
|
github.com/ghostiam/protogetter v0.3.15 // indirect
|
||||||
|
github.com/go-critic/go-critic v0.13.0 // indirect
|
||||||
|
github.com/go-toolsmith/astcast v1.1.0 // indirect
|
||||||
|
github.com/go-toolsmith/astcopy v1.1.0 // indirect
|
||||||
|
github.com/go-toolsmith/astequal v1.2.0 // indirect
|
||||||
|
github.com/go-toolsmith/astfmt v1.1.0 // indirect
|
||||||
|
github.com/go-toolsmith/astp v1.1.0 // indirect
|
||||||
|
github.com/go-toolsmith/strparse v1.1.0 // indirect
|
||||||
|
github.com/go-toolsmith/typep v1.1.0 // indirect
|
||||||
|
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
|
||||||
|
github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect
|
||||||
|
github.com/gobwas/glob v0.2.3 // indirect
|
||||||
|
github.com/gofrs/flock v0.12.1 // indirect
|
||||||
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
|
github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // 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/v2 v2.1.6 // indirect
|
||||||
|
github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 // 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
|
||||||
|
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect
|
||||||
|
github.com/google/go-cmp v0.7.0 // indirect
|
||||||
|
github.com/gordonklaus/ineffassign v0.1.0 // indirect
|
||||||
|
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
|
||||||
|
github.com/gostaticanalysis/comment v1.5.0 // indirect
|
||||||
|
github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect
|
||||||
|
github.com/gostaticanalysis/nilerr v0.1.1 // indirect
|
||||||
|
github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect
|
||||||
|
github.com/hashicorp/go-version v1.7.0 // indirect
|
||||||
|
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
||||||
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
|
github.com/hexops/gotextdiff v1.0.3 // indirect
|
||||||
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
|
github.com/jgautheron/goconst v1.8.1 // indirect
|
||||||
|
github.com/jingyugao/rowserrcheck v1.1.1 // indirect
|
||||||
|
github.com/jjti/go-spancheck v0.6.4 // indirect
|
||||||
|
github.com/julz/importas v0.2.0 // indirect
|
||||||
|
github.com/karamaru-alpha/copyloopvar v1.2.1 // indirect
|
||||||
|
github.com/kisielk/errcheck v1.9.0 // indirect
|
||||||
|
github.com/kkHAIKE/contextcheck v1.1.6 // indirect
|
||||||
|
github.com/kulti/thelper v0.6.3 // indirect
|
||||||
|
github.com/kunwardeep/paralleltest v1.0.14 // indirect
|
||||||
|
github.com/lasiar/canonicalheader v1.1.2 // indirect
|
||||||
|
github.com/ldez/exptostd v0.4.3 // indirect
|
||||||
|
github.com/ldez/gomoddirectives v0.6.1 // indirect
|
||||||
|
github.com/ldez/grignotin v0.9.0 // indirect
|
||||||
|
github.com/ldez/tagliatelle v0.7.1 // indirect
|
||||||
|
github.com/ldez/usetesting v0.4.3 // indirect
|
||||||
|
github.com/leonklingele/grouper v1.1.2 // indirect
|
||||||
|
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
||||||
|
github.com/macabu/inamedparam v0.2.0 // indirect
|
||||||
|
github.com/magiconair/properties v1.8.6 // indirect
|
||||||
|
github.com/manuelarte/funcorder v0.2.1 // indirect
|
||||||
|
github.com/maratori/testableexamples v1.0.0 // indirect
|
||||||
|
github.com/maratori/testpackage v1.1.1 // indirect
|
||||||
|
github.com/matoous/godox v1.1.0 // indirect
|
||||||
|
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
|
github.com/mattn/go-runewidth v0.0.16 // indirect
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
|
||||||
|
github.com/mgechev/revive v1.9.0 // indirect
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
|
github.com/moricho/tparallel v0.3.2 // indirect
|
||||||
|
github.com/muesli/termenv v0.16.0 // indirect
|
||||||
|
github.com/nakabonne/nestif v0.3.1 // indirect
|
||||||
|
github.com/nishanths/exhaustive v0.12.0 // indirect
|
||||||
|
github.com/nishanths/predeclared v0.2.2 // indirect
|
||||||
|
github.com/nunnatsa/ginkgolinter v0.19.1 // indirect
|
||||||
|
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
||||||
|
github.com/pelletier/go-toml v1.9.5 // indirect
|
||||||
|
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
github.com/polyfloyd/go-errorlint v1.8.0 // indirect
|
||||||
|
github.com/prometheus/client_golang v1.12.1 // indirect
|
||||||
|
github.com/prometheus/client_model v0.2.0 // indirect
|
||||||
|
github.com/prometheus/common v0.32.1 // indirect
|
||||||
|
github.com/prometheus/procfs v0.7.3 // indirect
|
||||||
|
github.com/quasilyte/go-ruleguard v0.4.4 // indirect
|
||||||
|
github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect
|
||||||
|
github.com/quasilyte/gogrep v0.5.0 // indirect
|
||||||
|
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
|
||||||
|
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
|
||||||
|
github.com/raeperd/recvcheck v0.2.0 // indirect
|
||||||
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
|
github.com/rogpeppe/go-internal v1.14.1 // indirect
|
||||||
|
github.com/ryancurrah/gomodguard v1.4.1 // indirect
|
||||||
|
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
|
||||||
|
github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect
|
||||||
|
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect
|
||||||
|
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
|
||||||
|
github.com/sashamelentyev/usestdlibvars v1.28.0 // indirect
|
||||||
|
github.com/securego/gosec/v2 v2.22.3 // indirect
|
||||||
|
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||||
|
github.com/sivchari/containedctx v1.0.3 // indirect
|
||||||
|
github.com/sivchari/tenv v1.12.1 // indirect
|
||||||
|
github.com/sonatard/noctx v0.1.0 // indirect
|
||||||
|
github.com/sourcegraph/go-diff v0.7.0 // indirect
|
||||||
|
github.com/spf13/afero v1.14.0 // indirect
|
||||||
|
github.com/spf13/cast v1.5.0 // indirect
|
||||||
|
github.com/spf13/cobra v1.9.1 // indirect
|
||||||
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||||
|
github.com/spf13/pflag v1.0.6 // indirect
|
||||||
|
github.com/spf13/viper v1.12.0 // indirect
|
||||||
|
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
|
||||||
|
github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect
|
||||||
|
github.com/stretchr/objx v0.5.2 // indirect
|
||||||
|
github.com/stretchr/testify v1.10.0 // indirect
|
||||||
|
github.com/subosito/gotenv v1.4.1 // indirect
|
||||||
|
github.com/tdakkota/asciicheck v0.4.1 // indirect
|
||||||
|
github.com/tetafro/godot v1.5.1 // indirect
|
||||||
|
github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect
|
||||||
|
github.com/timonwong/loggercheck v0.11.0 // indirect
|
||||||
|
github.com/tomarrell/wrapcheck/v2 v2.11.0 // indirect
|
||||||
|
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
|
||||||
|
github.com/ultraware/funlen v0.2.0 // indirect
|
||||||
|
github.com/ultraware/whitespace v0.2.0 // indirect
|
||||||
|
github.com/uudashr/gocognit v1.2.0 // indirect
|
||||||
|
github.com/uudashr/iface v1.3.1 // indirect
|
||||||
|
github.com/xen0n/gosmopolitan v1.3.0 // indirect
|
||||||
|
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
|
||||||
|
github.com/yagipy/maintidx v1.0.0 // indirect
|
||||||
|
github.com/yeya24/promlinter v0.3.0 // indirect
|
||||||
|
github.com/ykadowak/zerologlint v0.1.5 // indirect
|
||||||
|
gitlab.com/bosi/decorder v0.4.2 // indirect
|
||||||
|
go-simpler.org/musttag v0.13.1 // indirect
|
||||||
|
go-simpler.org/sloglint v0.11.0 // indirect
|
||||||
|
go.augendre.info/fatcontext v0.8.0 // indirect
|
||||||
|
go.uber.org/atomic v1.7.0 // indirect
|
||||||
|
go.uber.org/automaxprocs v1.6.0 // indirect
|
||||||
|
go.uber.org/multierr v1.6.0 // indirect
|
||||||
|
go.uber.org/zap v1.24.0 // indirect
|
||||||
|
golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect
|
||||||
|
golang.org/x/mod v0.24.0 // indirect
|
||||||
|
golang.org/x/sync v0.13.0 // indirect
|
||||||
|
golang.org/x/sys v0.32.0 // indirect
|
||||||
|
golang.org/x/text v0.24.0 // indirect
|
||||||
|
golang.org/x/tools v0.32.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.36.6 // indirect
|
||||||
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
honnef.co/go/tools v0.6.1 // indirect
|
||||||
|
mvdan.cc/gofumpt v0.8.0 // indirect
|
||||||
|
mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 // indirect
|
||||||
|
)
|
1079
sample-go-tool/go.sum
Normal file
1079
sample-go-tool/go.sum
Normal file
File diff suppressed because it is too large
Load Diff
26
sample-go-tool/sample.go
Normal file
26
sample-go-tool/sample.go
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
// Package main is used as test input for golangci action.
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/hex"
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Hash~
|
||||||
|
func Hash(data string) string {
|
||||||
|
retError()
|
||||||
|
retError2()
|
||||||
|
|
||||||
|
h := md5.New()
|
||||||
|
h.Write([]byte(data))
|
||||||
|
return hex.EncodeToString(h.Sum(nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
func retError() error {
|
||||||
|
return errors.New("err")
|
||||||
|
}
|
||||||
|
|
||||||
|
func retError2() error {
|
||||||
|
return errors.New("err2")
|
||||||
|
}
|
58
src/cache.ts
58
src/cache.ts
@@ -20,31 +20,18 @@ function checksumFile(hashName: string, path: string): Promise<string> {
|
|||||||
const pathExists = async (path: string): Promise<boolean> => !!(await fs.promises.stat(path).catch(() => false))
|
const pathExists = async (path: string): Promise<boolean> => !!(await fs.promises.stat(path).catch(() => false))
|
||||||
|
|
||||||
const getLintCacheDir = (): string => {
|
const getLintCacheDir = (): string => {
|
||||||
return path.resolve(`${process.env.HOME}/.cache/golangci-lint`)
|
const home = process.platform === "win32" ? process.env.USERPROFILE : process.env.HOME
|
||||||
}
|
|
||||||
|
|
||||||
const getCacheDirs = (): string[] => {
|
return path.resolve(`${home}`, `.cache`, `golangci-lint`)
|
||||||
// Not existing dirs are ok here: it works.
|
|
||||||
const skipPkgCache = core.getInput(`skip-pkg-cache`, { required: true }).trim()
|
|
||||||
const skipBuildCache = core.getInput(`skip-build-cache`, { required: true }).trim()
|
|
||||||
const dirs = [getLintCacheDir()]
|
|
||||||
|
|
||||||
if (skipBuildCache.toLowerCase() == "true") {
|
|
||||||
core.info(`Omitting ~/.cache/go-build from cache directories`)
|
|
||||||
} else {
|
|
||||||
dirs.push(path.resolve(`${process.env.HOME}/.cache/go-build`))
|
|
||||||
}
|
|
||||||
if (skipPkgCache.toLowerCase() == "true") {
|
|
||||||
core.info(`Omitting ~/go/pkg from cache directories`)
|
|
||||||
} else {
|
|
||||||
dirs.push(path.resolve(`${process.env.HOME}/go/pkg`))
|
|
||||||
}
|
|
||||||
|
|
||||||
return dirs
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
@@ -52,28 +39,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(
|
||||||
@@ -97,7 +98,7 @@ export async function restoreCache(): Promise<void> {
|
|||||||
}
|
}
|
||||||
core.saveState(State.CachePrimaryKey, primaryKey)
|
core.saveState(State.CachePrimaryKey, primaryKey)
|
||||||
try {
|
try {
|
||||||
const cacheKey = await cache.restoreCache(getCacheDirs(), primaryKey, restoreKeys)
|
const cacheKey = await cache.restoreCache([getLintCacheDir()], primaryKey, restoreKeys)
|
||||||
if (!cacheKey) {
|
if (!cacheKey) {
|
||||||
core.info(`Cache not found for input keys: ${[primaryKey, ...restoreKeys].join(", ")}`)
|
core.info(`Cache not found for input keys: ${[primaryKey, ...restoreKeys].join(", ")}`)
|
||||||
return
|
return
|
||||||
@@ -115,7 +116,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.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()) {
|
||||||
@@ -127,7 +129,7 @@ export async function saveCache(): Promise<void> {
|
|||||||
|
|
||||||
const startedAt = Date.now()
|
const startedAt = Date.now()
|
||||||
|
|
||||||
const cacheDirs = getCacheDirs()
|
const cacheDirs = [getLintCacheDir()]
|
||||||
const primaryKey = core.getState(State.CachePrimaryKey)
|
const primaryKey = core.getState(State.CachePrimaryKey)
|
||||||
if (!primaryKey) {
|
if (!primaryKey) {
|
||||||
utils.logWarning(`Error retrieving key from state.`)
|
utils.logWarning(`Error retrieving key from state.`)
|
||||||
|
184
src/install.ts
184
src/install.ts
@@ -1,43 +1,131 @@
|
|||||||
import * as core from "@actions/core"
|
import * as core from "@actions/core"
|
||||||
import * as tc from "@actions/tool-cache"
|
import * as tc from "@actions/tool-cache"
|
||||||
|
import { exec, ExecOptions } from "child_process"
|
||||||
import os from "os"
|
import os from "os"
|
||||||
import path from "path"
|
import path from "path"
|
||||||
|
import { promisify } from "util"
|
||||||
|
import which from "which"
|
||||||
|
|
||||||
import { VersionConfig } from "./version"
|
import { getVersion, VersionInfo } from "./version"
|
||||||
|
|
||||||
const downloadURL = "https://github.com/golangci/golangci-lint/releases/download"
|
const execShellCommand = promisify(exec)
|
||||||
|
|
||||||
const getAssetURL = (versionConfig: VersionConfig): string => {
|
export enum InstallMode {
|
||||||
let ext = "tar.gz"
|
Binary = "binary",
|
||||||
let platform = os.platform().toString()
|
GoInstall = "goinstall",
|
||||||
switch (platform) {
|
None = "none",
|
||||||
case "win32":
|
|
||||||
platform = "windows"
|
|
||||||
ext = "zip"
|
|
||||||
break
|
|
||||||
}
|
|
||||||
let arch = os.arch()
|
|
||||||
switch (arch) {
|
|
||||||
case "x64":
|
|
||||||
arch = "amd64"
|
|
||||||
break
|
|
||||||
case "x32":
|
|
||||||
case "ia32":
|
|
||||||
arch = "386"
|
|
||||||
break
|
|
||||||
}
|
|
||||||
const noPrefix = versionConfig.TargetVersion.slice(1)
|
|
||||||
|
|
||||||
return `${downloadURL}/${versionConfig.TargetVersion}/golangci-lint-${noPrefix}-${platform}-${arch}.${ext}`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// The installLint returns path to installed binary of golangci-lint.
|
type ExecRes = {
|
||||||
export async function installLint(versionConfig: VersionConfig): Promise<string> {
|
stdout: string
|
||||||
core.info(`Installing golangci-lint ${versionConfig.TargetVersion}...`)
|
stderr: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const printOutput = (res: ExecRes): void => {
|
||||||
|
if (res.stdout) {
|
||||||
|
core.info(res.stdout)
|
||||||
|
}
|
||||||
|
if (res.stderr) {
|
||||||
|
core.info(res.stderr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Install golangci-lint.
|
||||||
|
*
|
||||||
|
* @returns path to installed binary of golangci-lint.
|
||||||
|
*/
|
||||||
|
export async function install(): Promise<string> {
|
||||||
|
const mode = core.getInput("install-mode").toLowerCase()
|
||||||
|
|
||||||
|
if (mode === InstallMode.None) {
|
||||||
|
const binPath = await which("golangci-lint", { nothrow: true })
|
||||||
|
if (!binPath) {
|
||||||
|
throw new Error("golangci-lint binary not found in the PATH")
|
||||||
|
}
|
||||||
|
return binPath
|
||||||
|
}
|
||||||
|
|
||||||
|
const versionInfo = await getVersion(<InstallMode>mode)
|
||||||
|
|
||||||
|
return await installBinary(versionInfo, <InstallMode>mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Install golangci-lint.
|
||||||
|
*
|
||||||
|
* @param versionInfo information about version to install.
|
||||||
|
* @param mode installation mode.
|
||||||
|
* @returns path to installed binary of golangci-lint.
|
||||||
|
*/
|
||||||
|
export async function installBinary(versionInfo: VersionInfo, mode: InstallMode): Promise<string> {
|
||||||
|
core.info(`Installation mode: ${mode}`)
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
case InstallMode.Binary:
|
||||||
|
return installBin(versionInfo)
|
||||||
|
case InstallMode.GoInstall:
|
||||||
|
return goInstall(versionInfo)
|
||||||
|
default:
|
||||||
|
return installBin(versionInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Install golangci-lint via `go install`.
|
||||||
|
*
|
||||||
|
* @param versionInfo information about version to install.
|
||||||
|
* @returns path to installed binary of golangci-lint.
|
||||||
|
*/
|
||||||
|
async function goInstall(versionInfo: VersionInfo): Promise<string> {
|
||||||
|
core.info(`Installing golangci-lint ${versionInfo.TargetVersion}...`)
|
||||||
|
|
||||||
const startedAt = Date.now()
|
const startedAt = Date.now()
|
||||||
const assetURL = getAssetURL(versionConfig)
|
|
||||||
core.info(`Downloading ${assetURL} ...`)
|
const options: ExecOptions = { env: { ...process.env, CGO_ENABLED: "1" } }
|
||||||
|
|
||||||
|
const exres = await execShellCommand(
|
||||||
|
`go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@${versionInfo.TargetVersion}`,
|
||||||
|
options
|
||||||
|
)
|
||||||
|
printOutput(exres)
|
||||||
|
|
||||||
|
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 <path_to_the_binary>`.
|
||||||
|
const binPath = res.stderr
|
||||||
|
.split(/\r?\n/)
|
||||||
|
.map((v) => v.trimStart().trimEnd())
|
||||||
|
.filter((v) => v.startsWith("touch "))
|
||||||
|
.reduce((a, b) => a + b, "")
|
||||||
|
.split(` `, 2)[1]
|
||||||
|
|
||||||
|
core.info(`Installed golangci-lint into ${binPath} in ${Date.now() - startedAt}ms`)
|
||||||
|
|
||||||
|
return binPath
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Install golangci-lint via the precompiled binary.
|
||||||
|
*
|
||||||
|
* @param versionInfo information about version to install.
|
||||||
|
* @returns path to installed binary of golangci-lint.
|
||||||
|
*/
|
||||||
|
async function installBin(versionInfo: VersionInfo): Promise<string> {
|
||||||
|
core.info(`Installing golangci-lint binary ${versionInfo.TargetVersion}...`)
|
||||||
|
|
||||||
|
const startedAt = Date.now()
|
||||||
|
|
||||||
|
const assetURL = getAssetURL(versionInfo)
|
||||||
|
|
||||||
|
core.info(`Downloading binary ${assetURL} ...`)
|
||||||
|
|
||||||
const archivePath = await tc.downloadTool(assetURL)
|
const archivePath = await tc.downloadTool(assetURL)
|
||||||
|
|
||||||
let extractedDir = ""
|
let extractedDir = ""
|
||||||
let repl = /\.tar\.gz$/
|
let repl = /\.tar\.gz$/
|
||||||
if (assetURL.endsWith("zip")) {
|
if (assetURL.endsWith("zip")) {
|
||||||
@@ -54,7 +142,39 @@ export async function installLint(versionConfig: VersionConfig): Promise<string>
|
|||||||
|
|
||||||
const urlParts = assetURL.split(`/`)
|
const urlParts = assetURL.split(`/`)
|
||||||
const dirName = urlParts[urlParts.length - 1].replace(repl, ``)
|
const dirName = urlParts[urlParts.length - 1].replace(repl, ``)
|
||||||
const lintPath = path.join(extractedDir, dirName, `golangci-lint`)
|
const binPath = path.join(extractedDir, dirName, `golangci-lint`)
|
||||||
core.info(`Installed golangci-lint into ${lintPath} in ${Date.now() - startedAt}ms`)
|
|
||||||
return lintPath
|
core.info(`Installed golangci-lint into ${binPath} in ${Date.now() - startedAt}ms`)
|
||||||
|
|
||||||
|
return binPath
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAssetURL(versionInfo: VersionInfo): string {
|
||||||
|
let ext = "tar.gz"
|
||||||
|
|
||||||
|
let platform = os.platform().toString()
|
||||||
|
switch (platform) {
|
||||||
|
case "win32":
|
||||||
|
platform = "windows"
|
||||||
|
ext = "zip"
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
let arch = os.arch()
|
||||||
|
switch (arch) {
|
||||||
|
case "arm64":
|
||||||
|
arch = "arm64"
|
||||||
|
break
|
||||||
|
case "x64":
|
||||||
|
arch = "amd64"
|
||||||
|
break
|
||||||
|
case "x32":
|
||||||
|
case "ia32":
|
||||||
|
arch = "386"
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
const noPrefix = versionInfo.TargetVersion.slice(1)
|
||||||
|
|
||||||
|
return `https://github.com/golangci/golangci-lint/releases/download/${versionInfo.TargetVersion}/golangci-lint-${noPrefix}-${platform}-${arch}.${ext}`
|
||||||
}
|
}
|
||||||
|
120
src/patch.ts
Normal file
120
src/patch.ts
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
import * as core from "@actions/core"
|
||||||
|
import * as github from "@actions/github"
|
||||||
|
import { Context } from "@actions/github/lib/context"
|
||||||
|
import * as pluginRetry from "@octokit/plugin-retry"
|
||||||
|
import fs from "fs"
|
||||||
|
import path from "path"
|
||||||
|
import { dir } from "tmp"
|
||||||
|
import { promisify } from "util"
|
||||||
|
|
||||||
|
import { alterDiffPatch } from "./utils/diffUtils"
|
||||||
|
|
||||||
|
const writeFile = promisify(fs.writeFile)
|
||||||
|
const createTempDir = promisify(dir)
|
||||||
|
|
||||||
|
export function isOnlyNewIssues(): boolean {
|
||||||
|
return core.getBooleanInput(`only-new-issues`, { required: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function fetchPatch(): Promise<string> {
|
||||||
|
if (!isOnlyNewIssues()) {
|
||||||
|
return ``
|
||||||
|
}
|
||||||
|
|
||||||
|
const ctx = github.context
|
||||||
|
|
||||||
|
switch (ctx.eventName) {
|
||||||
|
case `pull_request`:
|
||||||
|
case `pull_request_target`:
|
||||||
|
return await fetchPullRequestPatch(ctx)
|
||||||
|
case `push`:
|
||||||
|
return await fetchPushPatch(ctx)
|
||||||
|
case `merge_group`:
|
||||||
|
return ``
|
||||||
|
default:
|
||||||
|
core.info(`Not fetching patch for showing only new issues because it's not a pull request context: event name is ${ctx.eventName}`)
|
||||||
|
return ``
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function fetchPullRequestPatch(ctx: Context): Promise<string> {
|
||||||
|
const pr = ctx.payload.pull_request
|
||||||
|
if (!pr) {
|
||||||
|
core.warning(`No pull request in context`)
|
||||||
|
return ``
|
||||||
|
}
|
||||||
|
|
||||||
|
const octokit = github.getOctokit(core.getInput(`github-token`, { required: true }), {}, pluginRetry.retry)
|
||||||
|
|
||||||
|
let patch: string
|
||||||
|
try {
|
||||||
|
const patchResp = await octokit.rest.pulls.get({
|
||||||
|
owner: ctx.repo.owner,
|
||||||
|
repo: ctx.repo.repo,
|
||||||
|
[`pull_number`]: pr.number,
|
||||||
|
mediaType: {
|
||||||
|
format: `diff`,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
if (patchResp.status !== 200) {
|
||||||
|
core.warning(`failed to fetch pull request patch: response status is ${patchResp.status}`)
|
||||||
|
return `` // don't fail the action, but analyze without patch
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
patch = patchResp.data as any
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(`failed to fetch pull request patch:`, err)
|
||||||
|
return `` // don't fail the action, but analyze without patch
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const tempDir = await createTempDir()
|
||||||
|
const patchPath = path.join(tempDir, "pull.patch")
|
||||||
|
core.info(`Writing patch to ${patchPath}`)
|
||||||
|
await writeFile(patchPath, alterDiffPatch(patch))
|
||||||
|
return patchPath
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(`failed to save pull request patch:`, err)
|
||||||
|
return `` // don't fail the action, but analyze without patch
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function fetchPushPatch(ctx: Context): Promise<string> {
|
||||||
|
const octokit = github.getOctokit(core.getInput(`github-token`, { required: true }), {}, pluginRetry.retry)
|
||||||
|
|
||||||
|
let patch: string
|
||||||
|
try {
|
||||||
|
const patchResp = await octokit.rest.repos.compareCommitsWithBasehead({
|
||||||
|
owner: ctx.repo.owner,
|
||||||
|
repo: ctx.repo.repo,
|
||||||
|
basehead: `${ctx.payload.before}...${ctx.payload.after}`,
|
||||||
|
mediaType: {
|
||||||
|
format: `diff`,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
if (patchResp.status !== 200) {
|
||||||
|
core.warning(`failed to fetch push patch: response status is ${patchResp.status}`)
|
||||||
|
return `` // don't fail the action, but analyze without patch
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
patch = patchResp.data as any
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(`failed to fetch push patch:`, err)
|
||||||
|
return `` // don't fail the action, but analyze without patch
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const tempDir = await createTempDir()
|
||||||
|
const patchPath = path.join(tempDir, "push.patch")
|
||||||
|
core.info(`Writing patch to ${patchPath}`)
|
||||||
|
await writeFile(patchPath, alterDiffPatch(patch))
|
||||||
|
return patchPath
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(`failed to save pull request patch:`, err)
|
||||||
|
return `` // don't fail the action, but analyze without patch
|
||||||
|
}
|
||||||
|
}
|
225
src/run.ts
225
src/run.ts
@@ -3,79 +3,16 @@ import * as github from "@actions/github"
|
|||||||
import { exec, ExecOptions } from "child_process"
|
import { exec, ExecOptions } from "child_process"
|
||||||
import * as fs from "fs"
|
import * as fs from "fs"
|
||||||
import * as path from "path"
|
import * as path from "path"
|
||||||
import { dir } from "tmp"
|
|
||||||
import { promisify } from "util"
|
import { promisify } from "util"
|
||||||
|
|
||||||
import { restoreCache, saveCache } from "./cache"
|
import { restoreCache, saveCache } from "./cache"
|
||||||
import { installLint } from "./install"
|
import { install } from "./install"
|
||||||
import { findLintVersion } from "./version"
|
import { fetchPatch, isOnlyNewIssues } from "./patch"
|
||||||
|
|
||||||
const execShellCommand = promisify(exec)
|
const execShellCommand = promisify(exec)
|
||||||
const writeFile = promisify(fs.writeFile)
|
|
||||||
const createTempDir = promisify(dir)
|
|
||||||
|
|
||||||
async function prepareLint(): Promise<string> {
|
|
||||||
const versionConfig = await findLintVersion()
|
|
||||||
return await installLint(versionConfig)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchPatch(): Promise<string> {
|
|
||||||
const onlyNewIssues = core.getInput(`only-new-issues`, { required: true }).trim()
|
|
||||||
if (onlyNewIssues !== `false` && onlyNewIssues !== `true`) {
|
|
||||||
throw new Error(`invalid value of "only-new-issues": "${onlyNewIssues}", expected "true" or "false"`)
|
|
||||||
}
|
|
||||||
if (onlyNewIssues === `false`) {
|
|
||||||
return ``
|
|
||||||
}
|
|
||||||
|
|
||||||
const ctx = github.context
|
|
||||||
if (ctx.eventName !== `pull_request`) {
|
|
||||||
core.info(`Not fetching patch for showing only new issues because it's not a pull request context: event name is ${ctx.eventName}`)
|
|
||||||
return ``
|
|
||||||
}
|
|
||||||
const pull = ctx.payload.pull_request
|
|
||||||
if (!pull) {
|
|
||||||
core.warning(`No pull request in context`)
|
|
||||||
return ``
|
|
||||||
}
|
|
||||||
const octokit = github.getOctokit(core.getInput(`github-token`, { required: true }))
|
|
||||||
let patch: string
|
|
||||||
try {
|
|
||||||
const patchResp = await octokit.rest.pulls.get({
|
|
||||||
owner: ctx.repo.owner,
|
|
||||||
repo: ctx.repo.repo,
|
|
||||||
[`pull_number`]: pull.number,
|
|
||||||
mediaType: {
|
|
||||||
format: `diff`,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
if (patchResp.status !== 200) {
|
|
||||||
core.warning(`failed to fetch pull request patch: response status is ${patchResp.status}`)
|
|
||||||
return `` // don't fail the action, but analyze without patch
|
|
||||||
}
|
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
||||||
patch = patchResp.data as any
|
|
||||||
} catch (err) {
|
|
||||||
console.warn(`failed to fetch pull request patch:`, err)
|
|
||||||
return `` // don't fail the action, but analyze without patch
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const tempDir = await createTempDir()
|
|
||||||
const patchPath = path.join(tempDir, "pull.patch")
|
|
||||||
core.info(`Writing patch to ${patchPath}`)
|
|
||||||
await writeFile(patchPath, patch)
|
|
||||||
return patchPath
|
|
||||||
} catch (err) {
|
|
||||||
console.warn(`failed to save pull request patch:`, err)
|
|
||||||
return `` // don't fail the action, but analyze without patch
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Env = {
|
type Env = {
|
||||||
lintPath: string
|
binPath: string
|
||||||
patchPath: string
|
patchPath: string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,16 +20,14 @@ async function prepareEnv(): Promise<Env> {
|
|||||||
const startedAt = Date.now()
|
const startedAt = Date.now()
|
||||||
|
|
||||||
// Prepare cache, lint and go in parallel.
|
// Prepare cache, lint and go in parallel.
|
||||||
const restoreCachePromise = restoreCache()
|
await restoreCache()
|
||||||
const prepareLintPromise = prepareLint()
|
|
||||||
const patchPromise = fetchPatch()
|
|
||||||
|
|
||||||
const lintPath = await prepareLintPromise
|
const binPath = await install()
|
||||||
await restoreCachePromise
|
const patchPath = await fetchPatch()
|
||||||
const patchPath = await patchPromise
|
|
||||||
|
|
||||||
core.info(`Prepared env in ${Date.now() - startedAt}ms`)
|
core.info(`Prepared env in ${Date.now() - startedAt}ms`)
|
||||||
return { lintPath, patchPath }
|
|
||||||
|
return { binPath, patchPath }
|
||||||
}
|
}
|
||||||
|
|
||||||
type ExecRes = {
|
type ExecRes = {
|
||||||
@@ -109,58 +44,99 @@ const printOutput = (res: ExecRes): void => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function runLint(lintPath: string, patchPath: string): Promise<void> {
|
async function runLint(binPath: string, patchPath: string): Promise<void> {
|
||||||
const debug = core.getInput(`debug`)
|
const debug = core.getInput(`debug`)
|
||||||
if (debug.split(`,`).includes(`cache`)) {
|
if (debug.split(`,`).includes(`cache`)) {
|
||||||
const res = await execShellCommand(`${lintPath} cache status`)
|
const res = await execShellCommand(`${binPath} cache status`)
|
||||||
printOutput(res)
|
printOutput(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
const userArgs = core.getInput(`args`)
|
const userArgs = core.getInput(`args`)
|
||||||
const addedArgs: string[] = []
|
const addedArgs: string[] = []
|
||||||
|
|
||||||
const userArgNames = new Set<string>(
|
const userArgsList = userArgs
|
||||||
userArgs
|
.trim()
|
||||||
.trim()
|
.split(/\s+/)
|
||||||
.split(/\s+/)
|
.filter((arg) => arg.startsWith(`-`))
|
||||||
.map((arg) => arg.split(`=`)[0])
|
.map((arg) => arg.replace(/^-+/, ``))
|
||||||
.filter((arg) => arg.startsWith(`-`))
|
.map((arg) => arg.split(/=(.*)/, 2))
|
||||||
.map((arg) => arg.replace(/^-+/, ``))
|
.map<[string, string]>(([key, value]) => [key.toLowerCase(), value ?? ""])
|
||||||
)
|
|
||||||
if (userArgNames.has(`out-format`)) {
|
|
||||||
throw new Error(`please, don't change out-format for golangci-lint: it can be broken in a future`)
|
|
||||||
}
|
|
||||||
addedArgs.push(`--out-format=github-actions`)
|
|
||||||
|
|
||||||
if (patchPath) {
|
const userArgsMap = new Map<string, string>(userArgsList)
|
||||||
if (userArgNames.has(`new`) || userArgNames.has(`new-from-rev`) || userArgNames.has(`new-from-patch`)) {
|
const userArgNames = new Set<string>(userArgsList.map(([key]) => key))
|
||||||
|
|
||||||
|
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 (isOnlyNewIssues()) {
|
||||||
|
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`)
|
throw new Error(`please, don't specify manually --new* args when requesting only new issues`)
|
||||||
}
|
}
|
||||||
addedArgs.push(`--new-from-patch=${patchPath}`)
|
|
||||||
|
|
||||||
// Override config values.
|
const ctx = github.context
|
||||||
addedArgs.push(`--new=false`)
|
|
||||||
addedArgs.push(`--new-from-rev=`)
|
core.info(`only new issues on ${ctx.eventName}: ${patchPath}`)
|
||||||
|
|
||||||
|
switch (ctx.eventName) {
|
||||||
|
case `pull_request`:
|
||||||
|
case `pull_request_target`:
|
||||||
|
case `push`:
|
||||||
|
if (patchPath) {
|
||||||
|
addedArgs.push(`--new-from-patch=${patchPath}`)
|
||||||
|
|
||||||
|
// Override config values.
|
||||||
|
addedArgs.push(`--new=false`)
|
||||||
|
addedArgs.push(`--new-from-rev=`)
|
||||||
|
addedArgs.push(`--new-from-merge-base=`)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
case `merge_group`:
|
||||||
|
addedArgs.push(`--new-from-rev=${ctx.payload.merge_group.base_sha}`)
|
||||||
|
|
||||||
|
// Override config values.
|
||||||
|
addedArgs.push(`--new=false`)
|
||||||
|
addedArgs.push(`--new-from-patch=`)
|
||||||
|
addedArgs.push(`--new-from-merge-base=`)
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const workingDirectory = core.getInput(`working-directory`)
|
|
||||||
const cmdArgs: ExecOptions = {}
|
const cmdArgs: ExecOptions = {}
|
||||||
|
|
||||||
|
const workingDirectory = core.getInput(`working-directory`)
|
||||||
if (workingDirectory) {
|
if (workingDirectory) {
|
||||||
if (patchPath) {
|
|
||||||
// TODO: make them compatible
|
|
||||||
throw new Error(`options working-directory and only-new-issues aren't compatible`)
|
|
||||||
}
|
|
||||||
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`)
|
||||||
}
|
}
|
||||||
if (!userArgNames.has(`path-prefix`)) {
|
|
||||||
addedArgs.push(`--path-prefix=${workingDirectory}`)
|
if (!userArgNames.has(`path-prefix`) && !userArgNames.has(`path-mode`)) {
|
||||||
|
addedArgs.push(`--path-mode=abs`)
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdArgs.cwd = path.resolve(workingDirectory)
|
cmdArgs.cwd = path.resolve(workingDirectory)
|
||||||
}
|
}
|
||||||
|
|
||||||
const cmd = `${lintPath} run ${addedArgs.join(` `)} ${userArgs}`.trimRight()
|
await runVerify(binPath, userArgsMap, cmdArgs)
|
||||||
core.info(`Running [${cmd}] in [${cmdArgs.cwd || ``}] ...`)
|
|
||||||
|
const cmd = `${binPath} run ${addedArgs.join(` `)} ${userArgs}`.trimEnd()
|
||||||
|
|
||||||
|
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)
|
||||||
@@ -168,7 +144,6 @@ async function runLint(lintPath: string, patchPath: string): Promise<void> {
|
|||||||
core.info(`golangci-lint found no issues`)
|
core.info(`golangci-lint found no issues`)
|
||||||
} catch (exc) {
|
} catch (exc) {
|
||||||
// This logging passes issues to GitHub annotations but comments can be more convenient for some users.
|
// 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)
|
printOutput(exc)
|
||||||
|
|
||||||
if (exc.code === 1) {
|
if (exc.code === 1) {
|
||||||
@@ -181,11 +156,49 @@ async function runLint(lintPath: string, patchPath: string): Promise<void> {
|
|||||||
core.info(`Ran golangci-lint in ${Date.now() - startedAt}ms`)
|
core.info(`Ran golangci-lint in ${Date.now() - startedAt}ms`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function runVerify(binPath: string, userArgsMap: Map<string, string>, cmdArgs: ExecOptions): Promise<void> {
|
||||||
|
const verify = core.getBooleanInput(`verify`, { required: true })
|
||||||
|
if (!verify) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const cfgPath = await getConfigPath(binPath, userArgsMap, cmdArgs)
|
||||||
|
if (!cfgPath) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let cmdVerify = `${binPath} config verify`
|
||||||
|
if (userArgsMap.get("config")) {
|
||||||
|
cmdVerify += ` --config=${userArgsMap.get("config")}`
|
||||||
|
}
|
||||||
|
|
||||||
|
core.info(`Running [${cmdVerify}] in [${cmdArgs.cwd || process.cwd()}] ...`)
|
||||||
|
|
||||||
|
const res = await execShellCommand(cmdVerify, cmdArgs)
|
||||||
|
printOutput(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getConfigPath(binPath: string, userArgsMap: Map<string, string>, cmdArgs: ExecOptions): Promise<string> {
|
||||||
|
let cmdConfigPath = `${binPath} config path`
|
||||||
|
if (userArgsMap.get("config")) {
|
||||||
|
cmdConfigPath += ` --config=${userArgsMap.get("config")}`
|
||||||
|
}
|
||||||
|
|
||||||
|
core.info(`Running [${cmdConfigPath}] in [${cmdArgs.cwd || process.cwd()}] ...`)
|
||||||
|
|
||||||
|
try {
|
||||||
|
const resPath = await execShellCommand(cmdConfigPath, cmdArgs)
|
||||||
|
return resPath.stderr.trim()
|
||||||
|
} catch {
|
||||||
|
return ``
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export async function run(): Promise<void> {
|
export async function run(): Promise<void> {
|
||||||
try {
|
try {
|
||||||
const { lintPath, patchPath } = await core.group(`prepare environment`, prepareEnv)
|
const { binPath, patchPath } = await core.group(`prepare environment`, prepareEnv)
|
||||||
core.addPath(path.dirname(lintPath))
|
core.addPath(path.dirname(binPath))
|
||||||
await core.group(`run golangci-lint`, () => runLint(lintPath, patchPath))
|
await core.group(`run golangci-lint`, () => runLint(binPath, patchPath))
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
core.error(`Failed to run: ${error}, ${error.stack}`)
|
core.error(`Failed to run: ${error}, ${error.stack}`)
|
||||||
core.setFailed(error.message)
|
core.setFailed(error.message)
|
||||||
|
56
src/utils/diffUtils.ts
Normal file
56
src/utils/diffUtils.ts
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import * as core from "@actions/core"
|
||||||
|
import * as path from "path"
|
||||||
|
|
||||||
|
// If needed alter diff file to be compatible with working directory
|
||||||
|
export function alterDiffPatch(patch: string): string {
|
||||||
|
const workingDirectory = core.getInput(`working-directory`)
|
||||||
|
|
||||||
|
if (workingDirectory) {
|
||||||
|
return alterPatchWithWorkingDirectory(patch, workingDirectory)
|
||||||
|
}
|
||||||
|
|
||||||
|
return patch
|
||||||
|
}
|
||||||
|
|
||||||
|
function alterPatchWithWorkingDirectory(patch: string, workingDirectory: string): string {
|
||||||
|
const workspace = process.env["GITHUB_WORKSPACE"] || ""
|
||||||
|
|
||||||
|
const wd = path.relative(workspace, workingDirectory)
|
||||||
|
|
||||||
|
// ignore diff sections not related to the working directory
|
||||||
|
let ignore = false
|
||||||
|
|
||||||
|
const lines = patch.split("\n")
|
||||||
|
const filteredLines = []
|
||||||
|
|
||||||
|
// starts with "--- a/xxx/" or "+++ a/xxx/" or "--- b/xxx/" or "+++ b/xxx/"
|
||||||
|
const cleanDiff = new RegExp(`^((?:\\+{3}|-{3}) [ab]\\/)${escapeRegExp(wd)}\\/(.*)`, "gm")
|
||||||
|
|
||||||
|
// contains " a/xxx/" or " b/xxx/"
|
||||||
|
const firstLine = new RegExp(`( [ab]\\/)${escapeRegExp(wd)}\\/(.*)`, "gm")
|
||||||
|
|
||||||
|
for (const line of lines) {
|
||||||
|
if (line.startsWith("diff --git")) {
|
||||||
|
ignore = !line.includes(` a/${wd}/`)
|
||||||
|
if (ignore) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
filteredLines.push(line.replaceAll(firstLine, "$1$2"))
|
||||||
|
} else {
|
||||||
|
if (ignore) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
filteredLines.push(line.replaceAll(cleanDiff, "$1$2"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Join the modified lines back into a diff string
|
||||||
|
return filteredLines.join("\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
|
||||||
|
function escapeRegExp(exp: string): string {
|
||||||
|
return exp.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") // $& means the whole matched string
|
||||||
|
}
|
@@ -3,6 +3,8 @@ import * as httpm from "@actions/http-client"
|
|||||||
import * as fs from "fs"
|
import * as fs from "fs"
|
||||||
import path from "path"
|
import path from "path"
|
||||||
|
|
||||||
|
import { InstallMode } from "./install"
|
||||||
|
|
||||||
// TODO: make a class
|
// TODO: make a class
|
||||||
export type Version = {
|
export type Version = {
|
||||||
major: number
|
major: number
|
||||||
@@ -11,17 +13,22 @@ export type Version = {
|
|||||||
} | null
|
} | null
|
||||||
|
|
||||||
const versionRe = /^v(\d+)\.(\d+)(?:\.(\d+))?$/
|
const versionRe = /^v(\d+)\.(\d+)(?:\.(\d+))?$/
|
||||||
const modVersionRe = /github.com\/golangci\/golangci-lint\s(v.+)/
|
const modVersionRe = /github.com\/golangci\/golangci-lint\/v2\s(v\S+)/
|
||||||
|
|
||||||
const parseVersion = (s: string): Version => {
|
const parseVersion = (s: string): Version => {
|
||||||
if (s == "latest" || s == "") {
|
if (s == "latest" || s == "") {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
const match = s.match(versionRe)
|
const match = s.match(versionRe)
|
||||||
if (!match) {
|
if (!match) {
|
||||||
throw new Error(`invalid version string '${s}', expected format v1.2 or v1.2.3`)
|
throw new Error(`invalid version string '${s}', expected format v1.2 or v1.2.3`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
return {
|
||||||
major: parseInt(match[1]),
|
major: parseInt(match[1]),
|
||||||
minor: parseInt(match[2]),
|
minor: parseInt(match[2]),
|
||||||
@@ -37,9 +44,9 @@ export const stringifyVersion = (v: Version): string => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const minVersion = {
|
const minVersion = {
|
||||||
major: 1,
|
major: 2,
|
||||||
minor: 28,
|
minor: 1,
|
||||||
patch: 3,
|
patch: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
const isLessVersion = (a: Version, b: Version): boolean => {
|
const isLessVersion = (a: Version, b: Version): boolean => {
|
||||||
@@ -53,61 +60,63 @@ const isLessVersion = (a: Version, b: Version): boolean => {
|
|||||||
return a.major < b.major
|
return a.major < b.major
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do not compare patch parts because if the min version has a non zero value
|
// Do not compare patch parts because if the min version has a non-zero value
|
||||||
// then it returns false, since the patch version of requested is always zero
|
// then it returns false, since the patch version of requested is always zero
|
||||||
return a.minor < b.minor
|
return a.minor < b.minor
|
||||||
}
|
}
|
||||||
|
|
||||||
const getRequestedLintVersion = (): Version => {
|
const getRequestedVersion = (): Version => {
|
||||||
let requestedLintVersion = core.getInput(`version`)
|
let requestedVersion = core.getInput(`version`)
|
||||||
const workingDirectory = core.getInput(`working-directory`)
|
const workingDirectory = core.getInput(`working-directory`)
|
||||||
|
|
||||||
let goMod = "go.mod"
|
let goMod = "go.mod"
|
||||||
if (workingDirectory) {
|
if (workingDirectory) {
|
||||||
goMod = path.join(workingDirectory, goMod)
|
goMod = path.join(workingDirectory, goMod)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requestedLintVersion == "" && fs.existsSync(goMod)) {
|
if (requestedVersion == "" && fs.existsSync(goMod)) {
|
||||||
const content = fs.readFileSync(goMod, "utf-8")
|
const content = fs.readFileSync(goMod, "utf-8")
|
||||||
const match = content.match(modVersionRe)
|
const match = content.match(modVersionRe)
|
||||||
if (match) {
|
if (match) {
|
||||||
requestedLintVersion = match[1]
|
requestedVersion = match[1]
|
||||||
core.info(`Found golangci-lint version '${requestedLintVersion}' in '${goMod}' file`)
|
core.info(`Found golangci-lint version '${requestedVersion}' in '${goMod}' file`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const parsedRequestedLintVersion = parseVersion(requestedLintVersion)
|
const parsedRequestedVersion = parseVersion(requestedVersion)
|
||||||
if (parsedRequestedLintVersion == null) {
|
if (parsedRequestedVersion == null) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
if (isLessVersion(parsedRequestedLintVersion, minVersion)) {
|
|
||||||
|
if (isLessVersion(parsedRequestedVersion, minVersion)) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`requested golangci-lint version '${requestedLintVersion}' isn't supported: we support only ${stringifyVersion(
|
`requested golangci-lint version '${requestedVersion}' isn't supported: we support only ${stringifyVersion(
|
||||||
minVersion
|
minVersion
|
||||||
)} and later versions`
|
)} and later versions`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
return parsedRequestedLintVersion
|
|
||||||
|
return parsedRequestedVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
export type VersionConfig = {
|
export type VersionInfo = {
|
||||||
Error?: string
|
Error?: string
|
||||||
TargetVersion: string
|
TargetVersion: string
|
||||||
AssetURL: string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Config = {
|
type VersionMapping = {
|
||||||
MinorVersionToConfig: {
|
MinorVersionToConfig: {
|
||||||
[minorVersion: string]: VersionConfig
|
[minorVersion: string]: VersionInfo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const getConfig = async (): Promise<Config> => {
|
const fetchVersionMapping = async (): Promise<VersionMapping> => {
|
||||||
const http = new httpm.HttpClient(`golangci/golangci-lint-action`, [], {
|
const http = new httpm.HttpClient(`golangci/golangci-lint-action`, [], {
|
||||||
allowRetries: true,
|
allowRetries: true,
|
||||||
maxRetries: 5,
|
maxRetries: 5,
|
||||||
})
|
})
|
||||||
try {
|
try {
|
||||||
const url = `https://raw.githubusercontent.com/golangci/golangci-lint/master/assets/github-action-config.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)
|
const response: httpm.HttpClientResponse = await http.get(url)
|
||||||
if (response.message.statusCode !== 200) {
|
if (response.message.statusCode !== 200) {
|
||||||
throw new Error(`failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`)
|
throw new Error(`failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`)
|
||||||
@@ -120,40 +129,47 @@ const getConfig = async (): Promise<Config> => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function findLintVersion(): Promise<VersionConfig> {
|
export async function getVersion(mode: InstallMode): Promise<VersionInfo> {
|
||||||
core.info(`Finding needed golangci-lint version...`)
|
core.info(`Finding needed golangci-lint version...`)
|
||||||
const reqLintVersion = getRequestedLintVersion()
|
|
||||||
|
if (mode == InstallMode.GoInstall) {
|
||||||
|
const v: string = core.getInput(`version`)
|
||||||
|
|
||||||
|
return { TargetVersion: v ? v : "latest" }
|
||||||
|
}
|
||||||
|
|
||||||
|
const reqVersion = getRequestedVersion()
|
||||||
|
|
||||||
// if the patched version is passed, just use it
|
// if the patched version is passed, just use it
|
||||||
if (reqLintVersion?.major !== null && reqLintVersion?.minor != null && reqLintVersion?.patch !== null) {
|
if (reqVersion?.major === 2 && reqVersion?.minor != null && reqVersion?.patch !== null) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
const versionWithoutV = `${reqLintVersion.major}.${reqLintVersion.minor}.${reqLintVersion.patch}`
|
const versionWithoutV = `${reqVersion.major}.${reqVersion.minor}.${reqVersion.patch}`
|
||||||
resolve({
|
resolve({ TargetVersion: `v${versionWithoutV}` })
|
||||||
TargetVersion: `v${versionWithoutV}`,
|
|
||||||
AssetURL: `https://github.com/golangci/golangci-lint/releases/download/v${versionWithoutV}/golangci-lint-${versionWithoutV}-linux-amd64.tar.gz`,
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const startedAt = Date.now()
|
const startedAt = Date.now()
|
||||||
|
|
||||||
const config = await getConfig()
|
const mapping = await fetchVersionMapping()
|
||||||
if (!config.MinorVersionToConfig) {
|
if (!mapping.MinorVersionToConfig) {
|
||||||
core.warning(JSON.stringify(config))
|
core.warning(JSON.stringify(mapping))
|
||||||
throw new Error(`invalid config: no MinorVersionToConfig field`)
|
throw new Error(`invalid config: no MinorVersionToConfig field`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const versionConfig = config.MinorVersionToConfig[stringifyVersion(reqLintVersion)]
|
const versionInfo = mapping.MinorVersionToConfig[stringifyVersion(reqVersion)]
|
||||||
if (!versionConfig) {
|
if (!versionInfo) {
|
||||||
throw new Error(`requested golangci-lint version '${stringifyVersion(reqLintVersion)}' doesn't exist`)
|
throw new Error(`requested golangci-lint version '${stringifyVersion(reqVersion)}' doesn't exist`)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (versionConfig.Error) {
|
if (versionInfo.Error) {
|
||||||
throw new Error(`failed to use requested golangci-lint version '${stringifyVersion(reqLintVersion)}': ${versionConfig.Error}`)
|
throw new Error(`failed to use requested golangci-lint version '${stringifyVersion(reqVersion)}': ${versionInfo.Error}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
core.info(
|
core.info(
|
||||||
`Requested golangci-lint '${stringifyVersion(reqLintVersion)}', using '${versionConfig.TargetVersion}', calculation took ${
|
`Requested golangci-lint '${stringifyVersion(reqVersion)}', using '${versionInfo.TargetVersion}', calculation took ${
|
||||||
Date.now() - startedAt
|
Date.now() - startedAt
|
||||||
}ms`
|
}ms`
|
||||||
)
|
)
|
||||||
return versionConfig
|
|
||||||
|
return versionInfo
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 90 KiB |
BIN
static/colored-line-number.png
Normal file
BIN
static/colored-line-number.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 70 KiB |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
|
"target": "ES2021", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
|
||||||
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
|
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
|
||||||
"outDir": "./lib", /* Redirect output structure to the directory. */
|
"outDir": "./lib", /* Redirect output structure to the directory. */
|
||||||
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
||||||
|
Reference in New Issue
Block a user