diff --git a/.automation/cleanup-docker.sh b/.automation/cleanup-docker.sh index e6a81770..838119c4 100755 --- a/.automation/cleanup-docker.sh +++ b/.automation/cleanup-docker.sh @@ -8,7 +8,7 @@ # Its based on being built from a GitHub Action, but could be easily updated # To be ran in a different medium. # -# PRE-Reqs: +# PRE-Requirements: # - Dockerfile # - System with Docker installed # - Global variables met diff --git a/.automation/test/ansible/ghe-initialize/templates/ghe-config-apply.sh b/.automation/test/ansible/ghe-initialize/templates/ghe-config-apply.sh index 6ddf4d71..5a0f32dd 100644 --- a/.automation/test/ansible/ghe-initialize/templates/ghe-config-apply.sh +++ b/.automation/test/ansible/ghe-initialize/templates/ghe-config-apply.sh @@ -35,7 +35,7 @@ CheckGHEPid() ################################################ if [ ! -f "$GHE_CONFIG_PID" ]; then # File not found - echo "Were good to move forward, no .pid file found at:[$GHE_CONFIG_PID]" + echo "We're good to move forward, no .pid file found at:[$GHE_CONFIG_PID]" else # Found the pid running, need to sleep echo "Current PID found, sleeping $SLEEP_SECONDS seconds before next check..." @@ -189,10 +189,10 @@ CheckGHEProcess #################### RunConfigApply -########################################## -# Were going to run it again after a nap # -# to make sure there is no crazy actions # -########################################## +########################################### +# We're going to run it again after a nap # +# to make sure there is no crazy actions # +########################################### sleep 300s ###################### diff --git a/.automation/test/clojure/README.md b/.automation/test/clojure/README.md new file mode 100644 index 00000000..6606ef5b --- /dev/null +++ b/.automation/test/clojure/README.md @@ -0,0 +1,13 @@ +# Clojure Test Cases +This folder holds the test cases for **Clojure**. + +## Additional Docs +No Additional information is needed for this test case. + +## Good Test Cases +The test cases denoted: `LANGUAGE_good_FILE.EXTENSION` are all valid, and should pass successfully when linted. +- **Note:** They are linted utilizing the default linter rules. + +## Bad Test Cases +The test cases denoted: `LANGUAGE_bad_FILE.EXTENSION` are **NOT** valid, and should trigger errors when linted. +- **Note:** They are linted utilizing the default linter rules. diff --git a/.automation/test/clojure/clojure_bad_1.clj b/.automation/test/clojure/clojure_bad_1.clj new file mode 100644 index 00000000..c8366066 --- /dev/null +++ b/.automation/test/clojure/clojure_bad_1.clj @@ -0,0 +1,64 @@ +(ns foo + (:require + [clojure.string :as str] + ;; We're never using this namespace. Also, the namespaces aren't sorted. + [clojure.set :as set])) + +;; Here we made a typo, so the symbol is unresolved: +(but-last [1 2 3]) + +;; Clj-kondo knows about arities of clojure namespaces, but you can also teach +;; it about your libraries or own namespaces +(str/join) + +;; foo has an arity of 2, but we're not actually using y +(defn foo-fn [x y] + ;; this do is redundant: + (do + ;; this is handy for debugging, but please remove it before pushing your code: + (def tmp_x x) + (let [y (fn [] (inc x))] + ;; the next let can be squashed together with the previous: + (let [z y] + ;; whoopsy, calling a local function with an incorrect number of args: + (y x) + ;; also wrong: + (recur))))) + +(letfn + [(f [] (h 1)) + (h [] (f 1))]) + +(defn- private-fn []) +;; redefining it... +(defn- private-fn []) + +(defn foo [] :foo) +;; Type error, because foo doesn't return a number! +(inc (foo)) + +;; I'm tired now, let's sleep... +;; Oops, not happening because of wrong amount of args: +(Thread/sleep 1000 1 2) + +;; Here we switch to another namespace and require the previous: +(ns bar (:require [foo :as f])) + +;; Wrong arity when calling a function from the previous namespace: +(f/foo-fn) + +;; private: +(f/private-fn) + +;; this won't pass the reader: +{:a 1 :a 2} +;; and neither will this: +#{1 1} +;; nor this: +{:a 1 :b} + +(ns bar-test (:require [clojure.test :as t])) + +(t/deftest my-tests + ;; you're not actually testing something here: + (odd? (inc 1))) \ No newline at end of file diff --git a/.automation/test/clojure/clojure_good_1.clj b/.automation/test/clojure/clojure_good_1.clj new file mode 100644 index 00000000..391f4688 --- /dev/null +++ b/.automation/test/clojure/clojure_good_1.clj @@ -0,0 +1,34 @@ +(ns foo + (:require + [clojure.string :as str])) + +(butlast [1 2 3]) + +(str/join "" "") + +(defn foo-fn [x] + (let [y (fn [] (inc x))] + (y))) + +(letfn + [(f [g] (h g)) + (h [i] (f i))]) + +(defn foo [] 1) +(inc (foo)) + +(Thread/sleep 1000 1) + +;; Here we switch to another namespace and require the previous: +(ns bar (:require [foo :as f])) + +(f/foo-fn 1) + +{:a 1 :b 2} +#{1 2} +{:a 1 :b 2} + +(ns bar-test (:require [clojure.test :as t])) + +(t/deftest my-tests + (t/is (odd? (inc 1)))) \ No newline at end of file diff --git a/.automation/test/coffeescript/coffeescript_bad_1.coffee b/.automation/test/coffeescript/coffeescript_bad_1.coffee index 5efeeacb..e388e7cc 100644 --- a/.automation/test/coffeescript/coffeescript_bad_1.coffee +++ b/.automation/test/coffeescript/coffeescript_bad_1.coffee @@ -6,7 +6,7 @@ # `mona echo *` - repeats what you say # # Author: -# admiralAwkbar@github.com +# admiralawkbar@github.com ############################### # Drop Hammer array of images # diff --git a/.automation/test/coffeescript/coffeescript_good_1.coffee b/.automation/test/coffeescript/coffeescript_good_1.coffee index 62f2a4fe..064f850e 100644 --- a/.automation/test/coffeescript/coffeescript_good_1.coffee +++ b/.automation/test/coffeescript/coffeescript_good_1.coffee @@ -6,7 +6,7 @@ # `mona echo *` - repeats what you say # # Author: -# admiralAwkbar@github.com +# admiralawkbar@github.com ############################### # Drop Hammer array of images # diff --git a/.automation/test/css/css_bad_01.css b/.automation/test/css/css_bad_01.css index 3c600b36..6ae90d7e 100644 --- a/.automation/test/css/css_bad_01.css +++ b/.automation/test/css/css_bad_01.css @@ -1,5 +1,5 @@ /* Bad */ -/* Multiline */ +/* Multi-line */ /* Comment */ .selector-3[type="text"] { background: linear-gradient(#FFFFFF, rgba(0, 0, 0, 0.8)); diff --git a/.automation/test/markdown/markdown_bad_1.md b/.automation/test/markdown/markdown_bad_1.md index 47aa18af..6599ac74 100644 --- a/.automation/test/markdown/markdown_bad_1.md +++ b/.automation/test/markdown/markdown_bad_1.md @@ -16,5 +16,5 @@ ls -la # Walk away -Were all done **here**. +We're all done **here**. - [Link Action]https://github.com diff --git a/.automation/test/markdown/markdown_good_1.md b/.automation/test/markdown/markdown_good_1.md index 5634a455..7a0aef45 100644 --- a/.automation/test/markdown/markdown_good_1.md +++ b/.automation/test/markdown/markdown_good_1.md @@ -16,5 +16,5 @@ ls -la ### Walk away -Were all done **here**. +We're all done **here**. - [Link Action](https://github.com) diff --git a/.automation/test/perl/perl_bad_1.pl b/.automation/test/perl/perl_bad_1.pl index e3626f88..7b127b99 100644 --- a/.automation/test/perl/perl_bad_1.pl +++ b/.automation/test/perl/perl_bad_1.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl ################################################################################ ################################################################################ -######### Script action @admiralAwkbar ######################################### +######### Script action @admiralawkbar ######################################### ################################################################################ ############# diff --git a/.automation/test/perl/perl_good_1.pl b/.automation/test/perl/perl_good_1.pl index f35c1409..caca0994 100644 --- a/.automation/test/perl/perl_good_1.pl +++ b/.automation/test/perl/perl_good_1.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl ################################################################################ ################################################################################ -######### Script action @admiralAwkbar ######################################### +######### Script action @admiralawkbar ######################################### ################################################################################ ############# diff --git a/.automation/upload-docker.sh b/.automation/upload-docker.sh index 4902edfb..12c15635 100755 --- a/.automation/upload-docker.sh +++ b/.automation/upload-docker.sh @@ -9,7 +9,7 @@ # Its based on being built from a GitHub Action, but could be easily updated # To be ran in a different medium. # -# PRE-Reqs: +# PRE-Requirements: # - Dockerfile # - System with Docker installed # - Global variables met diff --git a/.github/actions/spelling/allow/Dockerfile.txt b/.github/actions/spelling/allow/Dockerfile.txt new file mode 100644 index 00000000..bb490a92 --- /dev/null +++ b/.github/actions/spelling/allow/Dockerfile.txt @@ -0,0 +1,7 @@ +musl +nvq +rdoc +setuptools +uninstall +wget +WORKDIR diff --git a/.github/actions/spelling/allow/cleanup-docker.sh.txt b/.github/actions/spelling/allow/cleanup-docker.sh.txt new file mode 100644 index 00000000..1efe4ad7 --- /dev/null +++ b/.github/actions/spelling/allow/cleanup-docker.sh.txt @@ -0,0 +1 @@ +alnum diff --git a/.github/actions/spelling/allow/disabling-linters.md.txt b/.github/actions/spelling/allow/disabling-linters.md.txt new file mode 100644 index 00000000..fe1303c8 --- /dev/null +++ b/.github/actions/spelling/allow/disabling-linters.md.txt @@ -0,0 +1,3 @@ +noqa +toc +todo diff --git a/.github/actions/spelling/allow/emoji.txt b/.github/actions/spelling/allow/emoji.txt new file mode 100644 index 00000000..5b4b2b08 --- /dev/null +++ b/.github/actions/spelling/allow/emoji.txt @@ -0,0 +1,48 @@ +abcd +bangbang +bento +bullettrain +busstop +cn +couplekiss +dango +dvd +facepunch +feelsgood +finnadie +fuelpump +gb +goberserk +godmode +gua +hankey +heartpulse +hocho +hurtrealbad +icecream +inbox +iphone +izakaya +jp +keycap +mega +minidisc +moyai +neckbeard +octocat +oden +ramen +ru +scorpius +shipit +snowboarder +tada +tanabata +thumbsdown +thumbsup +tophat +trollface +tshirt +uk +vhs +zzz diff --git a/.github/actions/spelling/allow/ghe-api-config-apply.yml.txt b/.github/actions/spelling/allow/ghe-api-config-apply.yml.txt new file mode 100644 index 00000000..8d39ee0b --- /dev/null +++ b/.github/actions/spelling/allow/ghe-api-config-apply.yml.txt @@ -0,0 +1,2 @@ +configcheck +nohup diff --git a/.github/actions/spelling/allow/ghe-config-apply.sh.txt b/.github/actions/spelling/allow/ghe-config-apply.sh.txt new file mode 100644 index 00000000..0570567b --- /dev/null +++ b/.github/actions/spelling/allow/ghe-config-apply.sh.txt @@ -0,0 +1,2 @@ +args +pid diff --git a/.github/actions/spelling/allow/ghe-initial-configuration.yml.txt b/.github/actions/spelling/allow/ghe-initial-configuration.yml.txt new file mode 100644 index 00000000..a09f0564 --- /dev/null +++ b/.github/actions/spelling/allow/ghe-initial-configuration.yml.txt @@ -0,0 +1 @@ +initialconfig diff --git a/.github/actions/spelling/allow/ghe-ldap-configuration.yml.txt b/.github/actions/spelling/allow/ghe-ldap-configuration.yml.txt new file mode 100644 index 00000000..04b1c12f --- /dev/null +++ b/.github/actions/spelling/allow/ghe-ldap-configuration.yml.txt @@ -0,0 +1,2 @@ +ldapconfig +openldap diff --git a/.github/actions/spelling/allow/gitignore.txt b/.github/actions/spelling/allow/gitignore.txt new file mode 100644 index 00000000..6fcb9a9c --- /dev/null +++ b/.github/actions/spelling/allow/gitignore.txt @@ -0,0 +1,8 @@ +cov +eslintcache +jscoverage +jspm +nyc +tgz +typings +wscript diff --git a/.github/actions/spelling/allow/linter.sh.txt b/.github/actions/spelling/allow/linter.sh.txt new file mode 100644 index 00000000..9bd25b2f --- /dev/null +++ b/.github/actions/spelling/allow/linter.sh.txt @@ -0,0 +1,7 @@ +cw +Mstrict +printenv +rcfile +tf +tolower +whoami diff --git a/.github/actions/spelling/allow/main.yml.txt b/.github/actions/spelling/allow/main.yml.txt new file mode 100644 index 00000000..877e71bb --- /dev/null +++ b/.github/actions/spelling/allow/main.yml.txt @@ -0,0 +1,8 @@ +Autobots +basemap +cas +cn +crt +rsa +tlsv +tmp diff --git a/.github/actions/spelling/allow/settings.json.j2.txt b/.github/actions/spelling/allow/settings.json.j2.txt new file mode 100644 index 00000000..7f01269b --- /dev/null +++ b/.github/actions/spelling/allow/settings.json.j2.txt @@ -0,0 +1,4 @@ +dotcom +identicons +oauth +timezone diff --git a/.github/actions/spelling/allow/words.txt b/.github/actions/spelling/allow/words.txt new file mode 100644 index 00000000..0e91754b --- /dev/null +++ b/.github/actions/spelling/allow/words.txt @@ -0,0 +1,158 @@ +admiralawkbar +ansible +api +apk +aws +baz +beardofedu +certs +changeset +codebase +CODEOWNERS +coffeelint +coffeescript +collectd +concat +config +configs +css +dest +devops +dirname +dockerfile +dockerfilelint +dockerfilelintrc +dotenv +elif +emails +entrypoint +Errorf +eslint +eslintrc +filetype +func +gcc +getenv +ghe +GHES +ghl +github +globals +golang +golangci +Google +gpg +gql +Grafana +graphql +grep +homepage +hookshot +hostname +hostvars +http +https +hubot +idp +ip +Jani +javascript +jq +json +jsonlint +jwiebalk +JWT +ldap +len +lfs +libxml +linted +linting +loadbalancer +localhost +loglevel +markdownlint +millis +mkdir +nodejs +NONINFRINGEMENT +noproxy +noreply +npm +ntp +opensource +opensourcefriday +perl +plugin +posix +pprint +Prego +prettyjson +Println +probot +px +py +pylint +rb +readlines +README +regex +regexp +resqued +rgba +rien +Rubo +rubocop +saml +screenshots +shellcheck +signup +smtp +snmp +socio +splunk +src +ssh +ssl +sso +stackoverflow +stacktraces +standardjs +stringify +stylelint +stylelintrc +subdomain +subfolders +sudo +sys +syslog +taz +terraform +tflint +tileserver +tls +typeof +ubuntu +udp +uid +undef +uniq +uri +url +urlencode +username +usr +utils +Vape +vnd +webhook +wiki +wildcards +workflow +xml +xmllint +yaml +yamllint +yml +yq +zkoppert diff --git a/.github/actions/spelling/excludes.txt b/.github/actions/spelling/excludes.txt new file mode 100644 index 00000000..549b89c5 --- /dev/null +++ b/.github/actions/spelling/excludes.txt @@ -0,0 +1,2 @@ +^\.github/linters/ +^TEMPLATES/\.\S* diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt new file mode 100644 index 00000000..64d9960d --- /dev/null +++ b/.github/actions/spelling/expect.txt @@ -0,0 +1,39 @@ +cdxml +changelog +chmod +Dockerhub +EOL +GPR +IAm +icu +jre +kotlin +krb +ktlint +libgcc +libintl +libssl +libstdc +linux +lttng +microsoft +ncurses +nq +openjdk +php +powershell +println +psd +psm +psrc +pssc +psscriptanalyzer +pwsh +rcu +rhc +ry +terminfo +tzdata +userspace +xargs +zlib diff --git a/.github/actions/spelling/patterns.txt b/.github/actions/spelling/patterns.txt new file mode 100644 index 00000000..5c595e9b --- /dev/null +++ b/.github/actions/spelling/patterns.txt @@ -0,0 +1,7 @@ +https?:\S* +# ignore long runs of a single character: +([A-Za-z])\1{3,} +# Any CLI args (-xzf -aef) +\ -\w+\b +# Hex colors (dummy group to not be treated as comment) +(?:#)([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}) diff --git a/.github/linters/.clj-kondo/config.edn b/.github/linters/.clj-kondo/config.edn new file mode 100644 index 00000000..30cae4c6 --- /dev/null +++ b/.github/linters/.clj-kondo/config.edn @@ -0,0 +1,2 @@ +{:linters {:unresolved-symbol {:exclude [(compojure.api.sweet/defroutes)]} + :refer-all {:exclude [clj-time.jdbc]}}} diff --git a/.github/workflows/check-spelling.yml b/.github/workflows/check-spelling.yml new file mode 100644 index 00000000..b99524b0 --- /dev/null +++ b/.github/workflows/check-spelling.yml @@ -0,0 +1,48 @@ +--- +#################### +## Check spelling ## +#################### + +# +# Documentation: +# https://help.github.com/en/articles/workflow-syntax-for-github-actions +# + +name: Spell checking +############################# +# Start the job on all push # +############################# +on: + push: + branches-ignore: + - 'master' + +############### +# Set the Job # +############### +jobs: + build: + # Name the Job + name: Spell checking + # Set the agent to run on + runs-on: ubuntu-latest + ################## + # Load all steps # + ################## + steps: + ########################## + # Checkout the code base # + ########################## + - name: Checkout Code + uses: actions/checkout@v2 + + ############################# + # Run check spelling action # + ############################# + - name: Check spelling + uses: check-spelling/check-spelling@0.0.16-alpha + with: + bucket: .github/actions + project: spelling + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/welcome_new_people.yml b/.github/workflows/welcome_new_people.yml new file mode 100644 index 00000000..985ee57e --- /dev/null +++ b/.github/workflows/welcome_new_people.yml @@ -0,0 +1,13 @@ +name: Greetings + +on: [pull_request, issues] + +jobs: + greeting: + runs-on: ubuntu-latest + steps: + - uses: actions/first-interaction@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + issue-message: 'Thanks for opening your first issue in the **super-linter** repo! :tada:' + pr-message: 'Thanks for opening your first pr in the **super-linter** repo! :tada: This project is built on contributions just like this.' diff --git a/.gitignore b/.gitignore index ad46b308..e529ffb7 100644 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,7 @@ bower_components # node-waf configuration .lock-wscript -# Compiled binary addons (https://nodejs.org/api/addons.html) +# Compiled binary add-ons (https://nodejs.org/api/addons.html) build/Release # Dependency directories @@ -59,3 +59,6 @@ typings/ # next.js build output .next + +# clj-kondo cache +.cache \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index b25a7b1f..d0c3a70b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -132,6 +132,15 @@ RUN curl -Ls "$(curl -Ls https://api.github.com/repos/terraform-linters/tflint/r RUN wget "https://github.com/dotenv-linter/dotenv-linter/releases/latest/download/dotenv-linter-alpine-x86_64.tar.gz" -O - -q | tar -xzf - \ && mv "dotenv-linter" /usr/bin +##################### +# Install clj-kondo # +##################### +ARG CLJ_KONDO_VERSION='2020.06.12' +RUN curl -sLO https://github.com/borkdude/clj-kondo/releases/download/v${CLJ_KONDO_VERSION}/clj-kondo-${CLJ_KONDO_VERSION}-linux-static-amd64.zip \ + && unzip clj-kondo-${CLJ_KONDO_VERSION}-linux-static-amd64.zip \ + && rm clj-kondo-${CLJ_KONDO_VERSION}-linux-static-amd64.zip \ + && mv clj-kondo /usr/bin/ + ################## # Install ktlint # ################## @@ -167,6 +176,7 @@ ENV GITHUB_SHA=${GITHUB_SHA} \ VALIDATE_TERRAFORM=${VALIDATE_TERRAFORM} \ VALIDATE_CSS=${VALIDATE_CSS} \ VALIDATE_ENV=${VALIDATE_ENV} \ + VALIDATE_CLOJURE=${VALIDATE_CLOJURE} \ VALIDATE_KOTLIN=${VALIDATE_KOTLIN} \ VALIDATE_POWERSHELL=${VALIDATE_POWERSHELL} \ VALIDATE_OPENAPI=${VALIDATE_OPENAPI} \ diff --git a/README.md b/README.md index 638ed28b..35d707ba 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,26 @@ The end goal of this tool: - Build guidelines for code layout and format - Automate the process to help streamline code reviews + +## Table of Contents + +- [How it works](#how-it-works) +- [Supported linters](#supported-linters) +- [Usage](#how-to-use) +- [Environment variables](#environment-variables) +- [Disable rules](#disabling-rules) +- [Docker Hub](#docker-hub) +- [Run Super-Linter locally](#running-super-linter-locally-troubleshootingdebuggingenhancements) + - [CI / CT/ CD](#cictcd) +- [Limitations](#limitations) +- [Contributing](#how-to-contribute) + ## How it Works The super-linter finds issues and reports them to the console output. Fixes are suggested in the console output but not automatically fixed, and a status check will show up as failed on the pull request. +The design of the **Super-Linter** is currently to allow linting to occur in **GitHub Actions** as a part of continuous integration occurring on pull requests as the commits get pushed. It works best when commits are being pushed early and often to a branch with an open or draft pull request. There is some desire to move this closer to local development for faster feedback on linting errors but this is not yet supported. + ## Supported Linters Developers on **GitHub** can call the **GitHub Action** to lint their code base with the following list of linters: @@ -20,6 +36,7 @@ Developers on **GitHub** can call the **GitHub Action** to lint their code base | --- | --- | | **Ansible** | [ansible-lint](https://github.com/ansible/ansible-lint) | | **CSS** | [stylelint](https://stylelint.io/) | +| **Clojure** | [clj-kondo](https://github.com/borkdude/clj-kondo) | | **CoffeeScript** | [coffeelint](https://coffeelint.github.io/) | | **Dockerfile** | [dockerfilelint](https://github.com/replicatedhq/dockerfilelint.git) | | **Golang** | [golangci-lint](https://github.com/golangci/golangci-lint) | @@ -144,6 +161,7 @@ and won't run anything unexpected. | **VALIDATE_TERRAFORM** | `true` | Flag to enable or disable the linting process of the language. | | **VALIDATE_CSS** | `true` | Flag to enable or disable the linting process of the language. | | **VALIDATE_ENV** | `true` | Flag to enable or disable the linting process of the language. | +| **VALIDATE_CLOJURE** | `true` | Flag to enable or disable the linting process of the language. | | **VALIDATE_KOTLIN** | `true` | Flag to enable or disable the linting process of the language. | | **VALIDATE_OPENAPI** | `true` | Flag to enable or disable the linting process of the language. | | **ANSIBLE_DIRECTORY** | `/ansible` | Flag to set the root directory for Ansible file location(s). | @@ -165,6 +183,8 @@ The **Docker** container that is built from this repository is located at `https ## Running Super-Linter locally (troubleshooting/debugging/enhancements) If you find that you need to run super-linter locally, you can follow the documentation at [Running super-linter locally](https://github.com/github/super-linter/blob/master/docs/run-linter-locally.md) +Check out the [note](#how-it-works) in **How it Works** to understand more about the **Super-Linter** linting locally versus via continuous integration. + ### CI/CT/CD The **Super-Linter** has *CI/CT/CD* configured utilizing **GitHub** Actions. - When a branch is created and code is pushed, a **GitHub** Action is triggered for building the new **Docker** container with the new codebase diff --git a/TEMPLATES/.clj-kondo/config.edn b/TEMPLATES/.clj-kondo/config.edn new file mode 100644 index 00000000..30cae4c6 --- /dev/null +++ b/TEMPLATES/.clj-kondo/config.edn @@ -0,0 +1,2 @@ +{:linters {:unresolved-symbol {:exclude [(compojure.api.sweet/defroutes)]} + :refer-all {:exclude [clj-time.jdbc]}}} diff --git a/docs/disabling-linters.md b/docs/disabling-linters.md index 2f36d22d..408eba19 100644 --- a/docs/disabling-linters.md +++ b/docs/disabling-linters.md @@ -157,9 +157,9 @@ This line is waaaaaaaaaay too long # yamllint disable-line ### Yamllint disable code block ```yml # yamllint disable rule:colons -- Lorem : ipsum - dolor : sit amet, - consectetur : adipiscing elit +- Key : value + dolor : sit, + foo : bar # yamllint enable ``` @@ -223,9 +223,9 @@ class Foo(object): def meth3(self): """test one line disabling""" # no error - print(self.bla) # pylint: disable=no-member + print(self.baz) # pylint: disable=no-member # error - print(self.blop) + print(self.baz) ``` ### Pylint disable entire file @@ -629,3 +629,23 @@ import package.b.* ### OpenAPI disable entire file - There is currently **No** way to disable rules inline of the file(s) - However, you can make [rule exceptions](https://stoplight.io/p/docs/gh/stoplightio/spectral/docs/guides/6-exceptions.md?srn=gh/stoplightio/spectral/docs/guides/6-exceptions.md) in the config for individual file(s). + +-------------------------------------------------------------------------------- + +## Clojure +- [clj-kondo](https://github.com/borkdude/clj-kondo) +- Since clj-kondo approaches static analysis in a very Clojure way, it is advised to read the [configuration docs](https://github.com/borkdude/clj-kondo/blob/master/doc/config.md) + +### clj-kondo standard Config file +- `.github/linters/.clj-kondo/config.edn` + +### clj-kondo disable single line +- There is currently **No** way to disable rules in a single line + +### clj-kondo disable code block +- There is currently **No** way to disable rules in a code block + +### clj-kondo disable entire file +```clojure +{:output {:exclude-files ["path/to/file"]}} +``` diff --git a/lib/linter.sh b/lib/linter.sh index b23b96e6..a89bb3fe 100755 --- a/lib/linter.sh +++ b/lib/linter.sh @@ -3,7 +3,7 @@ ################################################################################ ################################################################################ -########### Super-Linter (Lint all the code) @AdmiralAwkbar #################### +########### Super-Linter (Lint all the code) @admiralawkbar #################### ################################################################################ ################################################################################ @@ -27,7 +27,7 @@ RUBY_FILE_NAME='.ruby-lint.yml' # Name of th RUBY_LINTER_RULES="$DEFAULT_RULES_LOCATION/$RUBY_FILE_NAME" # Path to the ruby lint rules # Coffee Vars COFFEE_FILE_NAME='.coffee-lint.json' # Name of the file -COFFEESCRIPT_LINTER_RULES="$DEFAULT_RULES_LOCATION/$COFFEE_FILE_NAME" # Path to the coffescript lint rules +COFFEESCRIPT_LINTER_RULES="$DEFAULT_RULES_LOCATION/$COFFEE_FILE_NAME" # Path to the coffeescript lint rules # Javascript Vars JAVASCRIPT_FILE_NAME='.eslintrc.yml' # Name of the file JAVASCRIPT_LINTER_RULES="$DEFAULT_RULES_LOCATION/$JAVASCRIPT_FILE_NAME" # Path to the Javascript lint rules @@ -57,6 +57,9 @@ CSS_LINTER_RULES="$DEFAULT_RULES_LOCATION/$CSS_FILE_NAME" # Path to th # OpenAPI Vars OPENAPI_FILE_NAME='.openapirc.yml' # Name of the file OPENAPI_LINTER_RULES="$DEFAULT_RULES_LOCATION/$OPENAPI_FILE_NAME" # Path to the OpenAPI lint rules +# Clojure Vars +CLOJURE_FILE_NAME='.clj-kondo/config.edn' +CLOJURE_LINTER_RULES="$DEFAULT_RULES_LOCATION/$CLOJURE_FILE_NAME" ####################################### # Linter array for information prints # @@ -64,7 +67,7 @@ OPENAPI_LINTER_RULES="$DEFAULT_RULES_LOCATION/$OPENAPI_FILE_NAME" # Path to th LINTER_ARRAY=("jsonlint" "yamllint" "xmllint" "markdownlint" "shellcheck" "pylint" "perl" "rubocop" "coffeelint" "eslint" "standard" "ansible-lint" "/dockerfilelint/bin/dockerfilelint" "golangci-lint" "tflint" - "stylelint" "dotenv-linter" "powershell" "ktlint" "spectral") + "stylelint" "dotenv-linter" "powershell" "ktlint" "clj-kondo" "spectral") ############################# # Language array for prints # @@ -72,7 +75,7 @@ LINTER_ARRAY=("jsonlint" "yamllint" "xmllint" "markdownlint" "shellcheck" LANGUAGE_ARRAY=('YML' 'JSON' 'XML' 'MARKDOWN' 'BASH' 'PERL' 'PHP' 'RUBY' 'PYTHON' 'COFFEESCRIPT' 'ANSIBLE' 'JAVASCRIPT_STANDARD' 'JAVASCRIPT_ES' 'TYPESCRIPT_STANDARD' 'TYPESCRIPT_ES' 'DOCKER' 'GO' 'TERRAFORM' - 'ENV' 'POWERSHELL' 'KOTLIN' 'OPENAPI') + 'CSS' 'ENV' 'POWERSHELL' 'KOTLIN' 'CLOJURE' 'OPENAPI') ################### # GitHub ENV Vars # @@ -102,6 +105,7 @@ VALIDATE_DOCKER="${VALIDATE_DOCKER}" # Boolean to validate lang VALIDATE_GO="${VALIDATE_GO}" # Boolean to validate language VALIDATE_CSS="${VALIDATE_CSS}" # Boolean to validate language VALIDATE_ENV="${VALIDATE_ENV}" # Boolean to validate language +VALIDATE_CLOJURE="${VALIDATE_CLOJURE}" # Boolean to validate language VALIDATE_TERRAFORM="${VALIDATE_TERRAFORM}" # Boolean to validate language VALIDATE_POWERSHELL="${VALIDATE_POWERSHELL}" # Boolean to validate language VALIDATE_KOTLIN="${VALIDATE_KOTLIN}" # Boolean to validate language @@ -118,16 +122,16 @@ ACTIONS_RUNNER_DEBUG="${ACTIONS_RUNNER_DEBUG}" # Boolean to see even more info ################ # Default Vars # ################ -DEFAULT_VALIDATE_ALL_CODEBASE='true' # Default value for validate all files -DEFAULT_WORKSPACE="${DEFAULT_WORKSPACE:-/tmp/lint}" # Default workspace if running locally -DEFAULT_ANSIBLE_DIRECTORY="$GITHUB_WORKSPACE/ansible" # Default Ansible Directory -DEFAULT_RUN_LOCAL='false' # Default value for debugging locally -DEFAULT_TEST_CASE_RUN='false' # Flag to tell code to run only test cases -DEFAULT_ACTIONS_RUNNER_DEBUG='false' # Default value for debugging output -RAW_FILE_ARRAY=() # Array of all files that were changed -READ_ONLY_CHANGE_FLAG=0 # Flag set to 1 if files changed are not txt or md -TEST_CASE_FOLDER='.automation/test' # Folder for test cases we should always ignore -DEFAULT_DISABLE_ERRORS='false' # Default to enabling errors +DEFAULT_VALIDATE_ALL_CODEBASE='true' # Default value for validate all files +DEFAULT_WORKSPACE="${DEFAULT_WORKSPACE:-/tmp/lint}" # Default workspace if running locally +DEFAULT_ANSIBLE_DIRECTORY="$GITHUB_WORKSPACE/ansible" # Default Ansible Directory +DEFAULT_RUN_LOCAL='false' # Default value for debugging locally +DEFAULT_TEST_CASE_RUN='false' # Flag to tell code to run only test cases +DEFAULT_ACTIONS_RUNNER_DEBUG='false' # Default value for debugging output +RAW_FILE_ARRAY=() # Array of all files that were changed +READ_ONLY_CHANGE_FLAG=0 # Flag set to 1 if files changed are not txt or md +TEST_CASE_FOLDER='.automation/test' # Folder for test cases we should always ignore +DEFAULT_DISABLE_ERRORS='false' # Default to enabling errors ########################## # Array of changed files # @@ -152,6 +156,7 @@ FILE_ARRAY_TERRAFORM=() # Array of files to check FILE_ARRAY_POWERSHELL=() # Array of files to check FILE_ARRAY_CSS=() # Array of files to check FILE_ARRAY_ENV=() # Array of files to check +FILE_ARRAY_CLOJURE=() # Array of files to check FILE_ARRAY_KOTLIN=() # Array of files to check FILE_ARRAY_OPENAPI=() # Array of files to check @@ -179,6 +184,7 @@ ERRORS_FOUND_TERRAFORM=0 # Count of errors found ERRORS_FOUND_POWERSHELL=0 # Count of errors found ERRORS_FOUND_CSS=0 # Count of errors found ERRORS_FOUND_ENV=0 # Count of errors found +ERRORS_FOUND_CLOJURE=0 # Count of errors found ERRORS_FOUND_KOTLIN=0 # Count of errors found ERRORS_FOUND_OPENAPI=0 # Count of errors found @@ -774,6 +780,7 @@ GetValidationInfo() VALIDATE_POWERSHELL=$(echo "$VALIDATE_POWERSHELL" | awk '{print tolower($0)}') VALIDATE_CSS=$(echo "$VALIDATE_CSS" | awk '{print tolower($0)}') VALIDATE_ENV=$(echo "$VALIDATE_ENV" | awk '{print tolower($0)}') + VALIDATE_CLOJURE=$(echo "$VALIDATE_CLOJURE" | awk '{print tolower($0)') VALIDATE_KOTLIN=$(echo "$VALIDATE_KOTLIN" | awk '{print tolower($0)}') VALIDATE_OPENAPI=$(echo "$VALIDATE_OPENAPI" | awk '{print tolower($0)}') @@ -802,8 +809,9 @@ GetValidationInfo() -n "$VALIDATE_POWERSHELL" || \ -n "$VALIDATE_CSS" || \ -n "$VALIDATE_ENV" || \ - -n "$VALIDATE_KOTLIN" || \ - -n "$VALIDATE_OPENAPI" ]]; then + -n "$VALIDATE_CLOJURE" || \ + -n "$VALIDATE_OPENAPI" ]] \ + -n "$VALIDATE_KOTLIN" ]]; then ANY_SET="true" fi @@ -1129,6 +1137,20 @@ GetValidationInfo() VALIDATE_OPENAPI="true" fi + ####################################### + # Validate if we should check Clojure # + ####################################### + if [[ "$ANY_SET" == "true" ]]; then + # Some linter flags were set - only run those set to true + if [[ -z "$VALIDATE_CLOJURE" ]]; then + # Clojure flag was not set - default to false + VALIDATE_CLOJURE="false" + fi + else + # No linter flags were set - default all to true + VALIDATE_CLOJURE="true" + fi + ####################################### # Print which linters we are enabling # ####################################### @@ -1232,6 +1254,11 @@ GetValidationInfo() else PRINT_ARRAY+=("- Excluding [CSS] files in code base...") fi + if [[ "$VALIDATE_CLOJURE" == "true" ]]; then + PRINT_ARRAY+=("- Validating [CLOJURE] files in code base...") + else + PRINT_ARRAY+=("- Excluding [CLOJURE] files in code base...") + fi if [[ "$VALIDATE_ENV" == "true" ]]; then PRINT_ARRAY+=("- Validating [ENV] files in code base...") else @@ -1644,6 +1671,15 @@ BuildFileList() # Set the READ_ONLY_CHANGE_FLAG since this could be exec # ########################################################## READ_ONLY_CHANGE_FLAG=1 + elif [ "$FILE" == "clj" ] || [ "$FILE" == "cljs" ] || [ "$FILE" == "cljc" ] || [ "$FILE" == "edn" ]; then + ################################ + # Append the file to the array # + ################################ + FILE_ARRAY_CLOJURE+=("$FILE") + ########################################################## + # Set the READ_ONLY_CHANGE_FLAG since this could be exec # + ########################################################## + READ_ONLY_CHANGE_FLAG=1 else ############################################## # Use file to see if we can parse what it is # @@ -1873,7 +1909,7 @@ LintCodebase() # Lint the file with the rules # ################################ # Need to append "'" to make the pwsh call syntax correct, also exit with exit code from inner subshell - LINT_CMD=$(cd "$GITHUB_WORKSPACE/$TEST_CASE_FOLDER" || exit; $LINTER_COMMAND "$FILE"; exit $? 2>&1) + LINT_CMD=$(cd "$GITHUB_WORKSPACE" || exit; $LINTER_COMMAND "$FILE"; exit $? 2>&1) else ################################ # Lint the file with the rules # @@ -2173,8 +2209,9 @@ Footer() [ "$ERRORS_FOUND_RUBY" -ne 0 ] || \ [ "$ERRORS_FOUND_CSS" -ne 0 ] || \ [ "$ERRORS_FOUND_ENV" -ne 0 ] || \ - [ "$ERRORS_FOUND_KOTLIN" -ne 0 ] || \ - [ "$ERRORS_FOUND_OPENAPI" -ne 0 ]; then + [ "$ERRORS_FOUND_OPENAPI" -ne 0 ] \ + [ "$ERRORS_FOUND_CLOJURE" -ne 0 ] || \ + [ "$ERRORS_FOUND_KOTLIN" -ne 0 ]; then # Failed exit echo "Exiting with errors found!" exit 1 @@ -2235,6 +2272,7 @@ RunTestCases() TestCodebase "POWERSHELL" "pwsh" "pwsh -c Invoke-ScriptAnalyzer -EnableExit -Settings $POWERSHELL_LINTER_RULES -Path" ".*\.\(ps1\|psm1\|psd1\|ps1xml\|pssc\|psrc\|cdxml\)\$" TestCodebase "CSS" "stylelint" "stylelint --config $CSS_LINTER_RULES" ".*\.\(css\)\$" TestCodebase "ENV" "dotenv-linter" "dotenv-linter" ".*\.\(env\)\$" + TestCodebase "CLOJURE" "clj-kondo" "clj-kondo --config $CLOJURE_LINTER_RULES --lint" ".*\.\(clj\|cljs\|cljc\|edn\)\$" TestCodebase "KOTLIN" "ktlint" "ktlint" ".*\.\(kt\|kts\)\$" TestCodebase "OPENAPI" "spectral" "spectral lint -r $OPENAPI_LINTER_RULES" ".*\.\(ymlopenapi\|jsonopenapi\)\$" @@ -2568,6 +2606,20 @@ if [ "$VALIDATE_DOCKER" == "true" ]; then LintCodebase "DOCKER" "/dockerfilelint/bin/dockerfilelint" "/dockerfilelint/bin/dockerfilelint" ".*\(Dockerfile\)\$" "${FILE_ARRAY_DOCKER[@]}" fi +################### +# CLOJURE LINTING # +################### +if [ "$VALIDATE_CLOJURE" == "true" ]; then + ################################# + # Get Clojure standard rules # + ################################# + GetStandardRules "clj-kondo" + ######################### + # Lint the Clojure files # + ######################### + LintCodebase "CLOJURE" "clj-kondo" "clj-kondo --config $CLOJURE_LINTER_RULES --lint" ".*\.\(clj\|cljs\|cljc\|edn\)\$" "${FILE_ARRAY_CLOJURE[@]}" +fi + ###################### # POWERSHELL LINTING # ######################