diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..94f480d --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf \ No newline at end of file diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 107bbc6..bb1bfbf 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -2,9 +2,12 @@ on: push name: 'Trigger: Push' jobs: shellcheck: - name: Shellcheck + name: ShellCheck runs-on: ubuntu-latest steps: - - uses: actions/checkout@master - - name: Shellcheck - uses: ludeeus/action-shellcheck@master + - name: Checkout + uses: actions/checkout@master + - name: Run ShellCheck + uses: ./ + with: + ignore: ignore diff --git a/Dockerfile b/Dockerfile index 49165ef..eddf64c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,12 +3,4 @@ FROM alpine:3.11.6 RUN apk add --no-cache shellcheck bash COPY runaction.sh /action/runaction.sh -ENTRYPOINT ["bash", "/action/runaction.sh"] - -LABEL "name"="ShellCheck" -LABEL "maintainer"="Ludeeus " -LABEL "version"="0.1.0" -LABEL "com.github.actions.name"="ShellCheck" -LABEL "com.github.actions.description"="GitHub action for ShellCheck." -LABEL "com.github.actions.icon"="terminal" -LABEL "com.github.actions.color"="black" +ENTRYPOINT ["bash", "/action/runaction.sh"] \ No newline at end of file diff --git a/README.md b/README.md index 37a1dfd..cc5e239 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,6 @@ jobs: uses: ludeeus/action-shellcheck@master ``` - - ## Globally disable checks To disable specific checks add it to a `SHELLCHECK_OPTS` env key in the job definition. @@ -37,3 +35,25 @@ example: env: SHELLCHECK_OPTS: -e SC2059 -e SC2034 -e SC1090 ``` + +## Ignore paths + +You can use the `ignore` input to disable specific directories. + +```text +sample structure: +sample/directory/with/files/toignore/test.sh +sample/directory/with/files/test.sh +``` + +example: + +```yaml + ... + - name: Run ShellCheck + uses: ludeeus/action-shellcheck@master + with: + ignore: toignore +``` + +This will skip `sample/directory/with/files/toignore/test.sh` diff --git a/action.yaml b/action.yaml new file mode 100644 index 0000000..5009b95 --- /dev/null +++ b/action.yaml @@ -0,0 +1,14 @@ +name: "ShellCheck" +author: "Ludeeus " +description: "GitHub action for ShellCheck." +inputs: + ignore: + description: 'Paths to ignore when running ShellCheck' + required: false + default: '' +runs: + using: 'docker' + image: 'Dockerfile' +branding: + icon: 'terminal' + color: 'gray-dark' \ No newline at end of file diff --git a/runaction.sh b/runaction.sh index 9f1aefe..0107ce5 100755 --- a/runaction.sh +++ b/runaction.sh @@ -2,13 +2,22 @@ cd "$GITHUB_WORKSPACE" || exit 1 -declare err +declare statuscode declare -a filepaths +declare -a excludes declare -a tmp -err=0 +statuscode=0 -readarray -d '' filepaths < <(find . '(' \ +excludes+=( ! -path *./.git/* ) +for path in ${INPUT_IGNORE}; do + echo "::debug:: Adding '${path}' to excludes" + excludes+=(! -path "*./${path}/*" ) + excludes+=(! -path "*/${path}/*" ) +done + +readarray -d '' filepaths < <(find . "${excludes[@]}" \ + '(' \ \ -name '*.bash' \ -o -path '*/.bash*' \ @@ -37,19 +46,19 @@ readarray -d '' filepaths < <(find . '(' \ -print0) -readarray -d '' tmp < <(find . -type f ! -name '*.*' -perm /111 -print0) +readarray -d '' tmp < <(find . "${excludes[@]}" -type f ! -name '*.*' -perm /111 -print0) for file in "${tmp[@]}"; do head -n1 "$file" | grep -Eqs "^#! */[^ ]*/[abkz]*sh" || continue filepaths+=("$file") done -if find . -path '*bin/*/*' -type f -perm /111 -print | +if find . "${excludes[@]}" -path '*bin/*/*' -type f -perm /111 -print | grep . then echo >&2 "::warning:: subdirectories of bin directories are not usable via PATH" fi -if find . -path '*bin/*' -name '*.*' -type f -perm /111 -perm /444 -print | +if find . "${excludes[@]}" -path '*bin/*' -name '*.*' -type f -perm /111 -perm /444 -print | grep . then echo >&2 "::warning:: programs in PATH should not have a filename suffix" @@ -57,7 +66,7 @@ fi for file in "${filepaths[@]}"; do echo "::debug:: Checking $file" - shellcheck "$file" || err=$? + shellcheck "$file" || statuscode=$? done -exit "$err" \ No newline at end of file +exit "$statuscode" \ No newline at end of file diff --git a/testfiles/ignore/ignore.sh b/testfiles/ignore/ignore.sh new file mode 100644 index 0000000..a77dd19 --- /dev/null +++ b/testfiles/ignore/ignore.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +echo $test \ No newline at end of file diff --git a/testfiles/test b/testfiles/test new file mode 100644 index 0000000..9470e18 --- /dev/null +++ b/testfiles/test @@ -0,0 +1,4 @@ +#!/bin/bash + +test="test" +echo "$test" \ No newline at end of file diff --git a/testfiles/test.bash b/testfiles/test.bash new file mode 100644 index 0000000..3ea25c6 --- /dev/null +++ b/testfiles/test.bash @@ -0,0 +1,3 @@ +#!/bin/bash +test="test" +echo "$test" \ No newline at end of file diff --git a/testfiles/test.sh b/testfiles/test.sh new file mode 100644 index 0000000..cfb414c --- /dev/null +++ b/testfiles/test.sh @@ -0,0 +1,4 @@ +#!/usr/bin/sh + +test="test" +echo "$test" \ No newline at end of file