forked from Dolibarr/dolibarr
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Qual: Backport pre-commit into 18.0 (Dolibarr#27949)
* Qual: Backport pre-commit to 17.0 Backport the pre-commit tool to bring extra checks to the older versions so that they are fixed earlier before merging in upper versions. Other PRs will be created for backporting to 18.0 and 19.0. The PRs should be accepted in reverse order: - develop; - 19.0: - 18.0; - 17.0. That should avoid merge conflicts and ensure that options (and ignored messages or steps) are adapted to the version branch. * Qual: Backport pre-commit to 18.0 # Qual: Backport pre-commit to 18.0 Backport the pre-commit tool to bring extra checks to the older versions so that they are fixed earlier before merging in upper versions. Other PRs will be created for backporting to 18.0 and 19.0. The PRs should be accepted in reverse order: - develop; - 19.0: - 18.0; - 17.0. That should avoid merge conflicts and ensure that options (and ignored messages or steps) are adapted to the version branch.
- Loading branch information
Showing
8 changed files
with
3,544 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
--- | ||
name: pre-commit | ||
on: | ||
pull_request: | ||
push: | ||
jobs: | ||
pre-commit: | ||
runs-on: ubuntu-latest | ||
env: | ||
LOG_TO_CS: .github/logToCs.py | ||
RAW_LOG: pre-commit.log | ||
CS_XML: pre-commit.xml | ||
steps: | ||
- name: Install required tools | ||
run: sudo apt-get update && sudo apt-get install cppcheck | ||
if: false | ||
|
||
# The next uses the git API because there is no clone yet. | ||
# This is faster for a big repo. | ||
- name: Get all changed php files (if PR) | ||
id: changed-php | ||
uses: tj-actions/changed-files@v42 | ||
if: github.event_name == 'pull_request' | ||
with: | ||
files: | | ||
**.php | ||
# Checkout git sources to analyze | ||
- uses: actions/checkout@v4 | ||
# Action setup-python needs a requirements.txt or pyproject.toml | ||
# This ensures one of them exists. | ||
- name: Create requirements.txt if no requirements.txt or pyproject.toml | ||
run: |- | ||
[ -r requirements.txt ] || [ -r pyproject.toml ] || touch requirements.txt | ||
# Install python and pre-commit tool | ||
- uses: actions/setup-python@v5 | ||
with: | ||
cache: pip | ||
python-version: '3.11' | ||
- run: python -m pip install pre-commit regex | ||
# Restore previous cache of precommit | ||
- uses: actions/cache/restore@v4 | ||
with: | ||
path: ~/.cache/pre-commit/ | ||
key: pre-commit-4|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }} | ||
# Run all the precommit tools (defined into pre-commit-config.yaml). | ||
# We can force exclusion of some of them here. | ||
- name: Run pre-commit hooks | ||
env: | ||
# SKIP is used by pre-commit to not execute certain hooks | ||
SKIP: no-commit-to-branch,php-cs,php-cbf,trailing-whitespace,end-of-file-fixer,check-json,check-executables-have-shebangs,check-shebang-scripts-are-executable,beautysh,yamllint,shellcheck | ||
run: | | ||
set -o pipefail | ||
pre-commit gc | ||
pre-commit run --show-diff-on-failure --color=always --all-files | tee ${RAW_LOG} | ||
# The next uses git, which is slow for a bit repo. | ||
# - name: Get all changed php files (if PR) | ||
# id: changed-php | ||
# uses: tj-actions/changed-files@v42 | ||
# if: github.event_name == 'pull_request' | ||
# with: | ||
# files: | | ||
# **.php | ||
|
||
- name: Setup PHPCS | ||
uses: shivammathur/setup-php@v2 | ||
if: steps.changed-php.outputs.any_changed == 'true' | ||
with: | ||
php-version: 8.1 | ||
coverage: none # disable xdebug, pcov | ||
tools: phpcs | ||
|
||
- name: Run some pre-commit hooks on selected changed files only | ||
if: steps.changed-php.outputs.any_changed == 'true' | ||
env: | ||
ALL_CHANGED_FILES: ${{ steps.changed-php.outputs.all_changed_files }} | ||
run: | | ||
set -o pipefail | ||
pre-commit run php-cs --files ${ALL_CHANGED_FILES} | tee -a ${RAW_LOG} | ||
# If error, we convert log in the checkstyle format | ||
- name: Convert Raw Log to CheckStyle format | ||
if: ${{ failure() }} | ||
run: | | ||
python ${LOG_TO_CS} ${RAW_LOG} ${CS_XML} | ||
# Annotate the git sources with the log messages | ||
- name: Annotate Source Code with Messages | ||
uses: staabm/annotate-pull-request-from-checkstyle-action@v1 | ||
if: ${{ failure() }} | ||
with: | ||
files: ${{ env.CS_XML }} | ||
notices-as-warnings: true # optional | ||
prepend-filename: true # optional | ||
# Save the precommit cache | ||
- uses: actions/cache/save@v4 | ||
if: ${{ ! cancelled() }} | ||
with: | ||
path: ~/.cache/pre-commit/ | ||
key: pre-commit-4|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') | ||
}} | ||
# Upload result log files of precommit into the Artifact shared store | ||
- name: Provide log as artifact | ||
uses: actions/upload-artifact@v4 | ||
if: ${{ ! cancelled() }} | ||
with: | ||
name: precommit-logs | ||
path: | | ||
${{ env.RAW_LOG }} | ||
${{ env.CS_XML }} | ||
retention-days: 2 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,151 @@ | ||
--- | ||
exclude: (?x)^( htdocs/includes/ckeditor/.* ) | ||
repos: | ||
# Several miscellaneous checks and fix (on yaml files, end of files fix) | ||
- repo: https://github.com/pre-commit/pre-commit-hooks | ||
rev: v4.5.0 | ||
hooks: | ||
- id: no-commit-to-branch | ||
args: [--branch, develop, --pattern, \d+.0] | ||
- id: check-yaml | ||
args: [--unsafe] | ||
- id: check-json | ||
- id: mixed-line-ending | ||
exclude: (?x)^(htdocs/includes/tecnickcom/tcpdf/fonts/.*)$ | ||
- id: trailing-whitespace | ||
exclude_types: [markdown] | ||
- id: end-of-file-fixer | ||
- id: check-merge-conflict | ||
- id: check-executables-have-shebangs | ||
- id: check-shebang-scripts-are-executable | ||
exclude: (?x)^( dev/tools/dolibarr-postgres2mysql.php |test/other/test_serialize.php | ||
|test/phpunit/textutf8.txt |test/phpunit/textiso.txt |htdocs/includes/.* | ||
|htdocs/modulebuilder/template/.* |build/debian/dolibarr.postrm |build/debian/dolibarr.postinst | ||
|build/debian/dolibarr.config )$ | ||
- id: fix-byte-order-marker | ||
- id: check-case-conflict | ||
|
||
# Beautify shell scripts | ||
- repo: https://github.com/lovesegfault/beautysh.git | ||
rev: v6.2.1 | ||
hooks: | ||
- id: beautysh | ||
exclude: (?x)^(dev/setup/git/hooks/pre-commit)$ | ||
args: [--tab] | ||
|
||
# Run local script | ||
# | ||
# For instance to update the license in edited files, you could add to local.sh: | ||
# | ||
# ```shell | ||
# #!/bin/bash | ||
# MYDIR=$(dirname "$0") | ||
# CHANGED_INTERNALS=$(git diff --name-only | grep -v includes) | ||
# "$MYDIR/dev/tools/updatelicense.php" $CHANGED_INTERNALS | ||
# ``` | ||
- repo: local | ||
hooks: | ||
- id: local-precommit-script | ||
name: Run local script before commit if it exists | ||
language: system | ||
entry: bash -c '[ ! -x local.sh ] || ./local.sh' | ||
pass_filenames: false | ||
|
||
# Check PHP syntax | ||
- repo: https://github.com/mdeweerd/pre-commit-php | ||
rev: v1.6.3 | ||
hooks: | ||
- id: php-cbf | ||
files: \.(php)$ | ||
args: [--standard=dev/setup/codesniffer/ruleset.xml] | ||
- id: php-cs | ||
files: \.(php)$ | ||
args: [--standard=dev/setup/codesniffer/ruleset.xml, --report=emacs] | ||
- id: php-lint | ||
- id: php-stan | ||
stages: [manual] | ||
files: \.(php)$ | ||
|
||
# Prettier (format code, only for non common files) | ||
- repo: https://github.com/pre-commit/mirrors-prettier | ||
rev: v3.0.3 | ||
hooks: | ||
- id: prettier | ||
stages: [manual] | ||
exclude: (?x)^( .*\.(phar |min\.css |lock) |htdocs/(includes|theme/common)/.* | ||
)$ | ||
exclude_types: | ||
- php | ||
- executable | ||
- binary | ||
- shell | ||
- javascript | ||
- markdown | ||
- html | ||
- less | ||
- plain-text | ||
- scss | ||
- css | ||
- yaml | ||
|
||
# Check format of yaml files | ||
- repo: https://github.com/adrienverge/yamllint.git | ||
rev: v1.33.0 | ||
hooks: | ||
- id: yamllint | ||
args: | ||
- --no-warnings | ||
- -d | ||
- '{extends: relaxed, rules: {line-length: {max: 120}}}' | ||
|
||
# Execute codespell to fix typo errors (setup of codespell into dev/tools/codespell/) | ||
- repo: https://github.com/codespell-project/codespell | ||
rev: v2.2.6 | ||
hooks: | ||
- id: codespell | ||
# Due to a current limitation of configuration files, | ||
# we can specify two dicts only on the CLI. | ||
# You can update the contents of the exclude-file codespell-lines-ignore with the script | ||
# dev/tools/codespell/addCodespellIgnores.sh | ||
args: | ||
- -D | ||
- '-' | ||
- -D | ||
- dev/tools/codespell/codespell-dict.txt | ||
- -I | ||
- dev/tools/codespell/codespell-ignore.txt | ||
- -x | ||
- dev/tools/codespell/codespell-lines-ignore.txt | ||
- --uri-ignore-words-list | ||
- ned | ||
exclude_types: [image] | ||
exclude: (?x)^(.phan/stubs/.*)$ | ||
additional_dependencies: [tomli] | ||
- alias: codespell-lang-en_US | ||
# Only for translations with specialised exceptions | ||
# -D contains predefined conversion dictionaries | ||
# -L is to ignore some words | ||
id: codespell | ||
files: ^htdocs/langs/en_US/.*$ | ||
args: | ||
- -D | ||
- '-' | ||
- -D | ||
- dev/tools/codespell/codespell-dict.txt | ||
- -L | ||
- informations,medias,uptodate,reenable,crypted,developpers | ||
- -L | ||
- creat,unitl,alltime,datas,referers | ||
- -I | ||
- dev/tools/codespell/codespell-ignore.txt | ||
- -x | ||
- dev/tools/codespell/codespell-lines-ignore.txt | ||
- --uri-ignore-words-list | ||
- ned | ||
|
||
# Check some shell scripts | ||
- repo: https://github.com/shellcheck-py/shellcheck-py | ||
rev: v0.9.0.6 | ||
hooks: | ||
- id: shellcheck | ||
args: [-W, '100'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
#!/bin/bash | ||
# Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com> | ||
|
||
# | ||
# Script to add codespell exceptions to the ignores lines file. | ||
# | ||
# The file is named '...-lines-ignore' to make TAB expansion on the cli easier. | ||
# | ||
# The line in the ignore file must match the line in the source | ||
# exactly. | ||
# | ||
# To clean up or create the ignored lines file, just do | ||
# ```shell | ||
# echo > dev/tools/codespell/codespell-lines-ignore.txt | ||
# ``` | ||
# and then execute this script. | ||
# | ||
# author: https://github.com/mdeweerd | ||
|
||
# | ||
# :warning: | ||
# | ||
# This script only works properly if codespell is installed for your CLI. | ||
# As the configuration is in pyproject.toml, you also need tomli. | ||
# | ||
# ```shell | ||
# python -m pip install codespell tomli | ||
# # or | ||
# pip install codespell tomli | ||
# ``` | ||
|
||
codespell_ignore_file=dev/tools/codespell/codespell-lines-ignore.txt | ||
if [ -z "${0##*.sh}" ] ; then | ||
# Suppose running from inside script | ||
# Get real path | ||
script=$(realpath "$(test -L "$0" && readlink "$0" || echo "$0")") | ||
PROJECT_ROOT=$(realpath "${script}") | ||
|
||
while [ "${PROJECT_ROOT}" != "/" ] ; do | ||
[ -r "${PROJECT_ROOT}/${codespell_ignore_file}" ] && break | ||
PROJECT_ROOT=$(dirname "${PROJECT_ROOT}") | ||
done | ||
if [ "${PROJECT_ROOT}" == "/" ] ; then | ||
echo "Project root not found from '${script}'" | ||
exit 1 | ||
fi | ||
codespell_ignore_file=${PROJECT_ROOT}/${codespell_ignore_file} | ||
fi | ||
|
||
|
||
# Make sure we are at the root of the project | ||
[ -r "${codespell_ignore_file}" ] || { echo "${codespell_ignore_file} not found" ; exit 1 ; } | ||
# Then: | ||
# - Run codespell; | ||
# - Identify files that have fixes; | ||
# - Limit to files under git control; | ||
# - Run codespell on selected files; | ||
# - For each line, create a grep command to find the lines; | ||
# - Execute that command by evaluation | ||
codespell . \ | ||
| sed -n -E 's@^([^:]+):.*@\1@p' \ | ||
| xargs -r git ls-files -- \ | ||
| xargs -r codespell -- \ | ||
| sed -n -E 's@^([^:]+):[[:digit:]]+:[[:space:]](\S+)[[:space:]].*@grep -P '\''\\b\2\\b'\'' -- "\1" >> '"${codespell_ignore_file}"'@p' \ | ||
| while read -r line ; do eval "$line" ; done | ||
|
||
# Finally, sort and remove duplicates to make merges easier. | ||
sort -u -o "${codespell_ignore_file}"{,} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# Please add in alphabetical order->(`sort -u` like). | ||
EPR->ERP | ||
alpah->alpha | ||
alphanothtml->alphanohtml | ||
alpahnothtml->alphanohtml | ||
aplha->alpha | ||
aplhanothtml->alphanohtml | ||
aploha->alpha | ||
aplohanothtml->alphanohtml | ||
aplphanothtml->alphanohtml | ||
choosed->chosen | ||
dolibar->dolibarr | ||
dollibar->dolibarr | ||
dollibarr->dolibarr | ||
# fiche->card | ||
mot de passe->password | ||
not de passe->password | ||
nothtml->nohtml | ||
tableau de bord->state board | ||
tagret->target | ||
thridparty->thirdparty |
Oops, something went wrong.