DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»

DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’» is a community of 966,904 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Create account Log in
Anadea
Anadea

Posted on

pre-commit-config-shellcheck for syntax and semantic checks automation

The reasoning

Second-checking of an already written code may be an exhausting and unreliable task for most of the programmers involved in custom software development. While refactoring the code a few days ago, we found some mistakes in shell code in the pre-commit config file. These errors have been there for a long time without any warnings. That's why we thought if these code checks either were more reliable or proceeded automatically. Thereafter, pre-commit-config-shellcheck was created for this very purpose.

What’s the difference

This tool will automatically detect and help you to resolve mistakes in your project’s .pre-commit-config.yaml file. All the syntax and most semantic checks are done for you. Also, you will receive bug fixing recommendations. This is done by automatic check of all the shell code entries in the config file with the other toolβ€”Shellcheck.

How it works

Shellcheck

Shellcheck is a shell script static analysis tool. The main purpose of this tool is to find popular syntax mistakes as well as to point out corner cases that may cause scripts to fail under future circumstances while giving suggestions for fixing those.

File checking

All the checks of this tool are done on the .pre-commit-config.yaml file, but this file can’t be directly analyzed by Shellcheck due to the structure of the file, which includes not only shell code but other configuration points. We found the workaround for this in creating a list of temporary files with found shell entry points and checking them separately.

Subprocesses

The main way of using Shellcheck is through a terminal, and this tool doesn’t have an adaptor for different programming languages, so we use the Python subprocess module in order to perform checks on each temporary file. Then the output from subprocesses is collected and the tool forms a single pre-commit-config-shellcheck output with the list of warnings and their locations.

Example of usage and output:

; pre_commit_config_shellcheck.py .pre-commit-config.yaml                                                                                                                                                                               

In entry "seed-isort-config" on line 9:                                                                                                                                                                                                 
var = 42                                                                                                                                                                                                                                
    ^-- SC2283 (error): Remove spaces around = to assign (or use [ ] to compare, or quote '=' if literal).                                                                                                                              


In entry "seed-isort-config" on line 10:                                                                                                                                                                                                
echo '$var'                                                                                                                                                                                                                             
     ^----^ SC2016 (info): Expressions don't expand in single quotes, use double quotes for that.                                                                                                                                       

For more information:                                                                                                                                                                                                                   
  https://www.shellcheck.net/wiki/SC2283 -- Remove spaces around = to assign ...                                                                                                                                                        
  https://www.shellcheck.net/wiki/SC2016 -- Expressions don't expand in singl...                                                                                                                                                        

In entry "removestar" on line 19:                                                                                                                                                                                                       
removestar -i ${NAME}                                                                                                                                                                                                                   
              ^-----^ SC2086 (info): Double quote to prevent globbing and word splitting.                                                                                                                                               

Did you mean:                                                                                                                                                                                                                           
removestar -i "${NAME}"                                                                                                                                                                                                                 

For more information:                                                                                                                                                                                                                   
  https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...    
Enter fullscreen mode Exit fullscreen mode

Easy to use

For the sake of keeping this tool simple for users, there are a few ways to use pre-commit-config-shellcheck:

As a command-line tool

$ pip install pre-commit-config-shellcheck
$ pre_commit_config_shellcheck.py .pre-commit-config.yaml
Enter fullscreen mode Exit fullscreen mode

As the pre-commit hook

# .pre-commit-config.yaml
- repo: "https://github.com/Anadea/pre-commit-config-shellcheck"
  rev: "0.3.4"
  hooks:
    - id: "pre-commit-config-shellcheck"
Enter fullscreen mode Exit fullscreen mode

And also as a GitHub action

- name: "pre-commit-config-shellcheck"
  uses: "action/pre-commit-config-shellcheck@0.3.4"
  id: "pre-commit-config-shellcheck"
  with:
    config: ".pre-commit-config.yaml"
Enter fullscreen mode Exit fullscreen mode

Conclusion

Pre-commit-config-shellcheck was successfully created, tested and deployed for third-party usage according to the licensing. This tool, additional information and licensing can be found on GitHub.

Top comments (0)

🌚 Friends don't let friends browse without dark mode.

Sorry, it's true.