All Projects → Lucas-C → pre-commit-hooks

Lucas-C / pre-commit-hooks

Licence: MIT license
git pre-commit hooks

Programming Languages

python
139335 projects - #7 most used programming language
groovy
2714 projects
CSS
56736 projects
Jinja
831 projects
C++
36643 projects - #6 most used programming language
PHP
23972 projects - #3 most used programming language

Projects that are alternatives of or similar to pre-commit-hooks

detect-secrets
A developer-friendly secrets detection tool for CI and pre-commit hooks based on Yelp's detect-secrets
Stars: ✭ 43 (-39.44%)
Mutual labels:  pre-commit, git-hooks
pre-commit-opa
Pre-commit git hooks for Open Policy Agent (OPA) and Rego development
Stars: ✭ 53 (-25.35%)
Mutual labels:  pre-commit, git-hooks
Husky.Net
Git hooks made easy with Husky.Net internal task runner! 🐶 It brings the dev-dependency concept to the .NET world!
Stars: ✭ 394 (+454.93%)
Mutual labels:  pre-commit, git-hooks
vlsi-release-plugins
A set of plugins to simplify Gradle release tasks
Stars: ✭ 30 (-57.75%)
Mutual labels:  license, crlf
pre-commit-hooks-safety
A pre-commit hook to check your Python dependencies against safety-db
Stars: ✭ 69 (-2.82%)
Mutual labels:  pre-commit, git-hooks
Tabbed-Container-Extension
A Qlik Extension that groups Sense objects in a container and displays tabs as a way of navigating through them
Stars: ✭ 21 (-70.42%)
Mutual labels:  tabs
pre-commit-mirror-maker
Scripts for creating mirror repositories that do not have .pre-commit-hooks.yaml
Stars: ✭ 19 (-73.24%)
Mutual labels:  pre-commit
alfred-browser-tabs
🔍 Search browser tabs from Chrome, Brave, Safari, etc..
Stars: ✭ 302 (+325.35%)
Mutual labels:  tabs
pre-commit
pre-commit hook terraform; pre-commit hook prometheus
Stars: ✭ 35 (-50.7%)
Mutual labels:  pre-commit
Krypton-Toolkit-Suite-NET-Core
A update to Component factory's krypton toolkit to support .NET Framework 3.5 to .NET Core
Stars: ✭ 27 (-61.97%)
Mutual labels:  tabs
autogen
Automatically generate boilerplate license comments.
Stars: ✭ 76 (+7.04%)
Mutual labels:  license
ocflib
Python libraries for account and server management
Stars: ✭ 13 (-81.69%)
Mutual labels:  pre-commit
RickUmaliVanityWebsite
This is the Perl source code that generates my vanity webpage (hosted at rickumali.com).
Stars: ✭ 19 (-73.24%)
Mutual labels:  tabs
license-checker-php
CLI tool to verify used licenses in composer dependencies
Stars: ✭ 28 (-60.56%)
Mutual labels:  license
seed-isort-config
Statically populate the `known_third_party` `isort` setting.
Stars: ✭ 67 (-5.63%)
Mutual labels:  pre-commit
cursive-tabs
Tabs for gyscos/cursive views 🖥️
Stars: ✭ 21 (-70.42%)
Mutual labels:  tabs
PagerSlidingTabStrip
An interactive indicator to navigate between the different pages of a ViewPager
Stars: ✭ 2,194 (+2990.14%)
Mutual labels:  tabs
hugo-dynamic-tabs
A Hugo theme component that allows you to add dynamic tabs in your markdown files.
Stars: ✭ 36 (-49.3%)
Mutual labels:  tabs
react-context-tabs
Flexible tabs for React
Stars: ✭ 31 (-56.34%)
Mutual labels:  tabs
IndicatorView
IndicatorView Library For Android
Stars: ✭ 41 (-42.25%)
Mutual labels:  tabs

build status

A few useful git hooks to integrate with pre-commit.

The last version of this hook to support Python 2.7 & 3.6 is v1.1.15

Hooks specific to a language, or with more dependencies have been extracted into separate repos:

Usage

- repo: https://github.com/Lucas-C/pre-commit-hooks
  rev: v1.3.1
  hooks:
    - id: forbid-crlf
    - id: remove-crlf
    - id: forbid-tabs
    - id: remove-tabs
      args: [--whitespaces-count, '2']  # defaults to: 4
    - id: insert-license
      files: \.groovy$
      args:
        - --license-filepath
        - src/license_header.txt        # defaults to: LICENSE.txt
        - --comment-style
        - //                            # defaults to:  #

insert-license

Comment styles

The following styles can be used for example:

  • For Java / Javascript / CSS/ C / C++ (multi-line comments) set /*| *| */ ;
  • For Java / Javascript / CSS/ C / C++ (single line comments) set // ;
  • For HTML files: <!--| ~| --> ;
  • For Python: # ;
  • For Jinja templates: '{#||#}' .

How to specify in how many lines to search for the license header in each file

You can add --detect-license-in-X-top-lines=<X> to search for the license in top X lines (default 5).

Removing old license and replacing it with a new one

In case you want to remove the comment headers introduced by insert-license hook, e.g. because you want to change the wording of your LICENSE.txt and update the comments in your source files:

  1. Temporarily add the --remove-header arg in your .pre-commit-config.yaml ;
  2. Run the hook on all your files: pre-commit run insert-license --all-files ;
  3. Remove the --remove-header arg and update your LICENSE.txt ;
  4. Re-run the hook on all your files.

Fuzzy license matching

In some cases your license files can contain several slightly different variants of the license - either containing slight modifications or differently broken lines of the license text.
By default the plugin does exact matching when searching for the license and in such case it will add second license on top - leaving the non-perfectly matched one in the source code.
You can prevent that and add --fuzzy-match-generates-todo flag in which case fuzzy matching is performed based on Levenshtein distance of set of tokens in expected and actual license text (partial match in two sets is used).
The license is detected if the ratio is > than --fuzzy-ratio-cut-off parameter (default 85) - ration corresponds roughly to how well the expected and actual license match (scale 0 - 100). Additionally --fuzzy-match-extra-lines-to-check lines in this case are checked for the license in case it has lines broken differently and takes more lines (default 3).

If a fuzzy match is found (and no exact match), a TODO comment is inserted at the beginning of the match found. The comment inserted can be overridden by --fuzzy-match-todo-comment=<COMMENT> flag.
By default the inserted comment is TODO: This license is not consistent with license used in the project Additionally instructions on what to do are inserted in this case.
By default instructions are:
Delete the inconsistent license and above line and rerun pre-commit to insert a good license..
You can change it via --fuzzy-match-todo-instructions argument of the hook.

When the TODO comment is committed, pre-commit will fail with appropriate message. The check will fails systematically if the --fuzzy-match-generates-todo flag is set or not.
You will need to remove the TODO comment and license so that it gets re-added in order to get rid of the error.

License insertion can be skipped altogether if the file contains the SKIP LICENSE INSERTION in the first X top lines. This can also be overridden by --skip-license-insertion-comment=<COMMENT> flag.

Handy shell functions

pre_commit_all_cache_repos () {  # Requires sqlite3
    sqlite3 -header -column ~/.cache/pre-commit/db.db < <(echo -e ".width 50\nSELECT repo, ref, path FROM repos ORDER BY repo;")
}

pre_commit_local_cache_repos () {  # Requires PyYaml & sqlite3
    < $(git rev-parse --show-toplevel)/.pre-commit-config.yaml \
        python -c "from __future__ import print_function; import sys, yaml; print('\n'.join(h['repo']+' '+h['sha'] for h in yaml.load(sys.stdin) if h['repo'] != 'local'))" \
        | while read repo sha; do
            echo $repo
            sqlite3 ~/.cache/pre-commit/db.db "SELECT ref, path FROM repos WHERE repo = '$repo' AND ref = '$sha';"
            echo
        done
}

pre_commit_db_rm_repo () {  # Requires sqlite3
    local repo=${1?'Missing parameter'}
    local repo_path=$(sqlite3 ~/.cache/pre-commit/db.db "SELECT path FROM repos WHERE repo LIKE '%${repo}%';")
    if [ -z "$repo_path" ]; then
        echo "No repository known for repo $repo"
        return 1
    fi
    rm -rf "$repo_path"
    sqlite3 ~/.cache/pre-commit/db.db "DELETE FROM repos WHERE repo LIKE '%${repo}%';";
}

Useful local hooks

Forbid / remove some unicode characters

- repo: local
  hooks:
    - id: forbid-unicode-non-breaking-spaces
      name: Detect unicode non-breaking space character U+00A0 aka M-BM-
      language: system
      entry: perl -ne 'print if $m = /\xc2\xa0/; $t ||= $m; END{{exit $t}}'
      files: ''
    - id: remove-unicode-non-breaking-spaces
      name: Remove unicode non-breaking space character U+00A0 aka M-BM-
      language: system
      entry: perl -pi* -e 's/\xc2\xa0/ /g && ($t = 1) && print STDERR $_; END{{exit
        $t}}'
      files: ''
    - id: forbid-en-dashes
      name: Detect the EXTREMELY confusing unicode character U+2013
      language: system
      entry: perl -ne 'print if $m = /\xe2\x80\x93/; $t ||= $m; END{{exit $t}}'
      files: ''
    - id: remove-en-dashes
      name: Remove the EXTREMELY confusing unicode character U+2013
      language: system
      entry: perl -pi* -e 's/\xe2\x80\x93/-/g && ($t = 1) && print STDERR $_; END{{exit
        $t}}'
      files: ''

Bash syntax validation

- repo: local
  hooks:
  - id: check-bash-syntax
    name: Check Shell scripts syntax correctness
    language: system
    entry: bash -n
    files: \.sh$

For Groovy-like Jenkins pipelines

- repo: local
  hooks:
  - id: forbid-abstract-classes-and-traits
    name: Ensure neither abstract classes nor traits are used
    language: pygrep
    entry: "^(abstract|trait) "
    files: ^src/.*\.groovy$

Rationale: abstract classes & traits do not work in Jenkins pipelines : cf. https://issues.jenkins-ci.org/browse/JENKINS-39329 & https://issues.jenkins-ci.org/browse/JENKINS-46145 .

- repo: local
  hooks:
  - id: force-JsonSlurperClassic
    name: Ensure JsonSlurperClassic is used instead of non-serializable JsonSlurper
    language: pygrep
    entry: JsonSlurper[^C]
    files: \.groovy$

Rationale: cf. http://stackoverflow.com/a/38439681/636849

- repo: local
  hooks:
    - id: Jenkinsfile-linter
      name: Check Jenkinsfile following the scripted-pipeline syntax using Jenkins
        API
      files: Jenkinsfile
      language: system
      entry: sh -c '! curl --silent $JENKINS_URL/job/MyPipelineName/job/master/1/replay/checkScriptCompile
        --user $JENKINS_USER:$JENKINS_TOKEN --data-urlencode value@Jenkinsfile |
        grep -F "\"status\":\"fail\""'

Note: the $JENKINS_TOKEN can be retrieved from $JENKINS_URL/user/$USER_NAME/configure

Beware, in 1 case on 6 I faced this unsolved bug with explictly-loaded libraries: https://issues.jenkins-ci.org/browse/JENKINS-42730 .

Also, there is also a linter for the declarative syntax: https://jenkins.io/doc/book/pipeline/development/#linter .

Forbid some Javascript keywords for browser retrocompatibility issues

- repo: local
  hooks:
    - id: js-forbid-const
      name: The const keyword is not supported by IE10
      language: pygrep
      entry: 'const '
      files: \.js$
    - id: js-forbid-let
      name: The let keyword is not supported by IE10
      language: pygrep
      entry: 'let '
      files: \.js$

CSS

- repo: local
  hooks:
    - id: css-forbid-px
      name: In CSS files, use rem or % over px
      language: pygrep
      entry: px
      files: \.css$
    - id: ot-sanitize-fonts
      name: Calling ot-sanitise on otf/ttf/woff/woff2 font files
      language: system
      entry: sh -c 'type ot-sanitise >/dev/null
        && for font in "$@";
        do echo "$font";
        ot-sanitise "$font"; done
        || echo "WARNING Command ot-sanitise not found - skipping check"'
      files: \.(otf|ttf|woff|woff2)$

Some Angular 1.5 checks

- repo: local
  hooks:
    - id: angular-forbid-apply
      name: In AngularJS, use $digest over $apply
      language: pygrep
      entry: \$apply
      files: \.js$
    - id: angular-forbid-ngrepeat-without-trackby
      name: In AngularJS, ALWAYS use 'track by' with ng-repeat
      language: pygrep
      entry: ng-repeat(?!.*track by)
      files: \.html$
    - id: angular-forbid-ngmodel-with-no-dot
      name: In AngularJS, whenever you have ng-model there's gotta be a dot in
        there somewhere
      language: pygrep
      entry: ng-model="?[^.]+[" ]
      files: \.html$

Development

The GitHub releases form the historical ChangeLog.

Releasing a new version

  1. Edit version in setup.py, README.md & .pre-commit-config.yaml;
  2. git commit -nam "New release $version" && git tag $version && git push && git push --tags;
  3. Publish a GitHub release.
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].