From 129d2ce1fcb3873a5d2466658a26c26b53099a2a Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 13 Feb 2025 06:06:24 +0100 Subject: [PATCH] Merging upstream version 0.18.0. Signed-off-by: Daniel Baumann --- .devcontainer/Dockerfile | 21 + .devcontainer/devcontainer.json | 56 +++ .devcontainer/postCreateCommand.sh | 23 + .flake8 | 11 - .github/workflows/checks.yml | 44 +- .pre-commit-hooks.yaml | 23 +- CHANGELOG.md | 40 +- Dockerfile | 2 +- README.md | 2 +- Vagrantfile | 49 -- doc-requirements.txt | 2 +- docs/configuration.md | 234 +++++++-- docs/contrib_rules.md | 20 +- docs/contributing.md | 126 +++-- docs/demos/asciicinema.json | 14 +- docs/extra.css | 8 + docs/images/dev-container.png | Bin 0 -> 212226 bytes docs/images/gitlint-packages.drawio.svg | 351 ++++++++++++++ docs/images/gitlint-packages.png | Bin 0 -> 51975 bytes docs/index.md | 118 +++-- docs/rules.md | 287 ++++++----- docs/user_defined_rules.md | 76 +-- examples/my_commit_rules.py | 16 +- examples/my_configuration_rules.py | 7 +- examples/my_line_rules.py | 17 +- gitlint-core/gitlint/__init__.py | 2 +- gitlint-core/gitlint/cache.py | 31 +- gitlint-core/gitlint/cli.py | 135 ++++-- gitlint-core/gitlint/config.py | 260 +++++----- .../gitlint/contrib/rules/authors_commit.py | 46 ++ .../contrib/rules/conventional_commit.py | 4 +- .../contrib/rules/disallow_cleanup_commits.py | 22 + .../gitlint/contrib/rules/signedoff_by.py | 3 +- gitlint-core/gitlint/deprecation.py | 40 ++ gitlint-core/gitlint/display.py | 6 +- gitlint-core/gitlint/exception.py | 4 +- gitlint-core/gitlint/files/gitlint | 10 +- gitlint-core/gitlint/git.py | 284 +++++++---- gitlint-core/gitlint/hooks.py | 18 +- gitlint-core/gitlint/lint.py | 57 ++- gitlint-core/gitlint/options.py | 34 +- gitlint-core/gitlint/rule_finder.py | 71 +-- gitlint-core/gitlint/rules.py | 183 ++++--- gitlint-core/gitlint/shell.py | 30 +- gitlint-core/gitlint/tests/base.py | 81 ++-- gitlint-core/gitlint/tests/cli/test_cli.py | 440 ++++++++++------- .../gitlint/tests/cli/test_cli_hooks.py | 157 +++--- .../gitlint/tests/config/test_config.py | 109 +++-- .../tests/config/test_config_builder.py | 88 ++-- .../tests/config/test_config_precedence.py | 46 +- .../tests/config/test_rule_collection.py | 9 +- .../contrib/rules/test_authors_commit.py | 106 ++++ .../contrib/rules/test_conventional_commit.py | 39 +- .../rules/test_disallow_cleanup_commits.py | 35 ++ .../tests/contrib/rules/test_signedoff_by.py | 5 +- .../tests/contrib/test_contrib_rules.py | 34 +- .../tests/expected/cli/test_cli/test_debug_1 | 25 +- .../cli/test_cli/test_input_stream_debug_2 | 7 +- .../test_cli/test_lint_staged_msg_filename_2 | 11 +- .../cli/test_cli/test_lint_staged_stdin_2 | 11 +- .../expected/cli/test_cli/test_named_rules_2 | 7 +- gitlint-core/gitlint/tests/git/test_git.py | 65 +-- .../gitlint/tests/git/test_git_commit.py | 458 +++++++++++++----- .../gitlint/tests/git/test_git_context.py | 41 +- .../gitlint/tests/rules/test_body_rules.py | 27 +- .../tests/rules/test_configuration_rules.py | 66 ++- .../gitlint/tests/rules/test_meta_rules.py | 48 +- .../gitlint/tests/rules/test_rules.py | 2 - .../gitlint/tests/rules/test_title_rules.py | 56 ++- .../gitlint/tests/rules/test_user_rules.py | 69 +-- .../tests/samples/commit_message/fixup_amend | 1 + .../gitlint/tests/samples/config/AUTHORS | 2 + .../import_exception/invalid_python.py | 1 - .../incorrect_linerule/my_line_rule.py | 2 - .../samples/user_rules/my_commit_rules.py | 7 +- .../user_rules/parent_package/__init__.py | 1 - .../parent_package/my_commit_rules.py | 2 - gitlint-core/gitlint/tests/test_cache.py | 4 +- .../gitlint/tests/test_deprecation.py | 23 + gitlint-core/gitlint/tests/test_display.py | 22 +- gitlint-core/gitlint/tests/test_hooks.py | 68 +-- gitlint-core/gitlint/tests/test_lint.py | 188 +++---- gitlint-core/gitlint/tests/test_options.py | 15 +- gitlint-core/gitlint/tests/test_utils.py | 15 +- gitlint-core/gitlint/utils.py | 12 +- gitlint-core/setup.py | 50 +- pyproject.toml | 5 + qa/base.py | 97 ++-- qa/expected/test_commits/test_csv_hash_list_1 | 11 + .../test_commits/test_ignore_commits_1 | 2 + .../test_lint_staged_msg_filename_1 | 12 +- .../test_commits/test_lint_staged_stdin_1 | 12 +- .../test_config/test_config_from_env_1 | 12 +- .../test_config/test_config_from_env_2 | 11 +- .../test_config/test_config_from_file_debug_1 | 12 +- .../test_commit_binary_file_1} | 36 +- .../test_user_defined_rules_examples_1 | 2 +- .../test_user_defined_rules_examples_2 | 2 +- ..._user_defined_rules_examples_with_config_1 | 2 +- .../test_user_defined_rules_extra_1 | 4 +- qa/requirements.txt | 6 +- qa/samples/user_rules/extra/extra_rules.py | 24 +- qa/shell.py | 30 +- qa/test_commits.py | 161 ++++-- qa/test_config.py | 80 ++- qa/test_contrib.py | 20 +- qa/test_gitlint.py | 165 +++++-- qa/test_hooks.py | 126 ++--- qa/test_named_rules.py | 8 +- qa/test_stdin.py | 35 +- qa/test_user_defined.py | 31 +- qa/utils.py | 8 +- requirements.txt | 2 +- run_tests.sh | 39 +- setup.py | 20 +- test-requirements.txt | 12 +- tools/create-test-repo.sh | 2 +- tools/windows/create-test-repo.bat | 2 +- 118 files changed, 4146 insertions(+), 2087 deletions(-) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100755 .devcontainer/postCreateCommand.sh delete mode 100644 .flake8 delete mode 100644 Vagrantfile create mode 100644 docs/images/dev-container.png create mode 100644 docs/images/gitlint-packages.drawio.svg create mode 100644 docs/images/gitlint-packages.png create mode 100644 gitlint-core/gitlint/contrib/rules/authors_commit.py create mode 100644 gitlint-core/gitlint/contrib/rules/disallow_cleanup_commits.py create mode 100644 gitlint-core/gitlint/deprecation.py create mode 100644 gitlint-core/gitlint/tests/contrib/rules/test_authors_commit.py create mode 100644 gitlint-core/gitlint/tests/contrib/rules/test_disallow_cleanup_commits.py create mode 100644 gitlint-core/gitlint/tests/samples/commit_message/fixup_amend create mode 100644 gitlint-core/gitlint/tests/samples/config/AUTHORS create mode 100644 gitlint-core/gitlint/tests/test_deprecation.py create mode 100644 pyproject.toml create mode 100644 qa/expected/test_commits/test_csv_hash_list_1 copy qa/expected/{test_config/test_config_from_file_debug_1 => test_gitlint/test_commit_binary_file_1} (77%) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..b429c19 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,21 @@ +# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.245.2/containers/python-3/.devcontainer/base.Dockerfile + +# [Choice] Python version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.10, 3.9, 3.8, 3.7, 3.6, 3-bullseye, 3.10-bullseye, 3.9-bullseye, 3.8-bullseye, 3.7-bullseye, 3.6-bullseye, 3-buster, 3.10-buster, 3.9-buster, 3.8-buster, 3.7-buster, 3.6-buster +ARG VARIANT="3.10-bullseye" +FROM mcr.microsoft.com/vscode/devcontainers/python:0-${VARIANT} + +# [Choice] Node.js version: none, lts/*, 16, 14, 12, 10 +ARG NODE_VERSION="none" +RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi + +# [Optional] If your pip requirements rarely change, uncomment this section to add them to the image. +# COPY requirements.txt /tmp/pip-tmp/ +# RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt \ +# && rm -rf /tmp/pip-tmp + +# [Optional] Uncomment this section to install additional OS packages. +# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ +# && apt-get -y install --no-install-recommends + +# [Optional] Uncomment this line to install global node packages. +# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g " 2>&1 \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..5889037 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,56 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: +// https://github.com/microsoft/vscode-dev-containers/tree/v0.245.2/containers/python-3 +{ + "name": "Python 3", + "build": { + "dockerfile": "Dockerfile", + "context": "..", + "args": { + // Update 'VARIANT' to pick a Python version: 3, 3.10, 3.9, 3.8, 3.7, 3.6 + // Append -bullseye or -buster to pin to an OS version. + // Use -bullseye variants on local on arm64/Apple Silicon. + "VARIANT": "3.10", + // Options + "NODE_VERSION": "none" + } + }, + // Configure tool-specific properties. + "customizations": { + // Configure properties specific to VS Code. + "vscode": { + // Set *default* container specific settings.json values on container create. + "settings": { + "python.defaultInterpreterPath": "/usr/local/bin/python", + "python.linting.enabled": true, + "python.linting.pylintEnabled": true, + "python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8", + "python.formatting.blackPath": "/usr/local/py-utils/bin/black", + "python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf", + "python.linting.banditPath": "/usr/local/py-utils/bin/bandit", + "python.linting.flake8Path": "/usr/local/py-utils/bin/flake8", + "python.linting.mypyPath": "/usr/local/py-utils/bin/mypy", + "python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle", + "python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle", + "python.linting.pylintPath": "/usr/local/py-utils/bin/pylint" + }, + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "ms-python.python", + "ms-python.vscode-pylance" + ] + } + }, + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "pip3 install --user -r requirements.txt", + // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. + "remoteUser": "vscode", + "features": { + "git": "latest", + "github-cli": "latest", + "sshd": "latest", + "homebrew": "latest" + }, + "postCreateCommand": "./.devcontainer/postCreateCommand.sh" +} \ No newline at end of file diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/postCreateCommand.sh new file mode 100755 index 0000000..4bbaf05 --- /dev/null +++ b/.devcontainer/postCreateCommand.sh @@ -0,0 +1,23 @@ +#!/bin/sh -x + +brew install asdf +source "$(brew --prefix asdf)/libexec/asdf.sh" + +# Install latest python +asdf plugin add python +asdf install python 3.11.0 +asdf global python 3.11.0 + +# You can easily install other python versions like so: +# asdf install python 3.6.15 +# asdf install python 3.7.15 +# asdf install python 3.8.15 +# asdf install python 3.9.15 +# asdf install python 3.10.8 +# asdf install python pypy3.9-7.3.9 + +# Setup virtualenv, install all dependencies +cd /workspaces/gitlint +$(asdf which python) -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt -r test-requirements.txt -r doc-requirements.txt \ No newline at end of file diff --git a/.flake8 b/.flake8 deleted file mode 100644 index df7800e..0000000 --- a/.flake8 +++ /dev/null @@ -1,11 +0,0 @@ -[flake8] -# H307: like imports should be grouped together -# H405: multi line docstring summary not separated with an empty line -# H803: git title must end with a period -# H904: Wrap long lines in parentheses instead of a backslash -# H802: git commit title should be under 50 chars -# H701: empty localization string -extend-ignore = H307,H405,H803,H904,H802,H701 -# exclude settings files and virtualenvs -exclude = *settings.py,*.venv/*.py -max-line-length = 120 \ No newline at end of file diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 1ca2a9c..39b3782 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -7,21 +7,21 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", pypy3] + python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11", pypy-3.9] os: ["macos-latest", "ubuntu-latest"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3.0.2 with: ref: ${{ github.event.pull_request.head.sha }} # Checkout pull request HEAD commit instead of merge commit # Because gitlint is a tool that uses git itself under the hood, we remove git tracking from the checked out - # code by temporarily renaming the .git directory. + # code by temporarily renaming the .git directory. # This is to ensure that the tests don't have a dependency on the version control of gitlint itself. - name: Temporarily remove git version control from code run: mv .git ._git - name: Setup python - uses: actions/setup-python@v2 + uses: actions/setup-python@v4.2.0 with: python-version: ${{ matrix.python-version }} @@ -40,16 +40,28 @@ jobs: # COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} # run: coveralls + # Patch the commit-msg hook to make it work in GH CI + # Specifically, within the commit-msg hook, wrap the invocation of gitlint with `script` + + - name: Patch commit-msg hook + run: | + # Escape " to \" + sed -i -E '/^gitlint/ s/"/\\"/g' gitlint-core/gitlint/files/commit-msg + # Replace `gitlint ` with `script -e -q -c "gitlint "` + sed -i -E 's/^gitlint(.*)/script -e -q -c "\0"/' gitlint-core/gitlint/files/commit-msg + - name: Integration Tests run: ./run_tests.sh -i - - name: Integration Tests (GITLINT_USE_SH_LIB=0) + # Gitlint no longer uses `sh` by default, but for now we're still supporting the manual enablement of it. + # By setting GITLINT_USE_SH_LIB=1, we test whether this still works. + - name: Integration Tests (GITLINT_USE_SH_LIB=1) env: - GITLINT_USE_SH_LIB: 0 + GITLINT_USE_SH_LIB: 1 run: ./run_tests.sh -i - - name: PEP8 - run: ./run_tests.sh -p + - name: Code formatting (black) + run: ./run_tests.sh -f - name: PyLint run: ./run_tests.sh -l @@ -79,25 +91,25 @@ jobs: runs-on: windows-latest strategy: matrix: - python-version: [3.6] + python-version: ["3.10"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3.0.2 with: ref: ${{ github.event.pull_request.head.sha }} # Checkout pull request HEAD commit instead of merge commit # Because gitlint is a tool that uses git itself under the hood, we remove git tracking from the checked out - # code by temporarily renaming the .git directory. + # code by temporarily renaming the .git directory. # This is to ensure that the tests don't have a dependency on the version control of gitlint itself. - name: Temporarily remove git version control from code run: Rename-Item .git ._git - + - name: Setup python - uses: actions/setup-python@v2 + uses: actions/setup-python@v4.2.0 with: python-version: ${{ matrix.python-version }} - name: "Upgrade pip on Python 3" - if: matrix.python-version == '3.6' + if: matrix.python-version == '3.10' run: python -m pip install --upgrade pip - name: Install requirements @@ -126,8 +138,8 @@ jobs: run: pytest -rw -s qa continue-on-error: true # Known to fail at this point - - name: PEP8 - run: flake8 gitlint-core qa examples + - name: Code formatting (black) + run: black . - name: PyLint run: pylint gitlint-core\gitlint qa --rcfile=".pylintrc" -r n diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml index f2ccc7f..24fd745 100644 --- a/.pre-commit-hooks.yaml +++ b/.pre-commit-hooks.yaml @@ -1,7 +1,16 @@ -- id: gitlint - name: gitlint - language: python - additional_dependencies: ["./gitlint-core[trusted-deps]"] - entry: gitlint - args: [--staged, --msg-filename] - stages: [commit-msg] +- id: gitlint + name: gitlint + description: Checks your git commit messages for style. + language: python + additional_dependencies: ["./gitlint-core[trusted-deps]"] + entry: gitlint + args: [--staged, --msg-filename] + stages: [commit-msg] +- id: gitlint-ci + name: gitlint + language: python + additional_dependencies: ["./gitlint-core[trusted-deps]"] + entry: gitlint + always_run: true + pass_filenames: false + stages: [manual] diff --git a/CHANGELOG.md b/CHANGELOG.md index 2546579..091b2a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # Changelog # + +## v0.18.0 (2022-11-16) ## +Contributors: +Special thanks to all contributors for this release - details inline! + +- Python 3.11 support +- Last release to support Python 3.6 ([EOL since 2021-12-23](https://endoflife.date/python)) +- **Behavior Change**: In a future release, gitlint will be switching to use `re.search` instead of `re.match` semantics for all rules. Your rule regexes might need updating as a result, gitlint will print a warning if so. [More details are in the docs](https://jorisroovers.com/gitlint/configuration/#regex-style-search). ([#254](https://github.com/jorisroovers/gitlint/issues/254)) +- gitlint no longer uses the [sh](https://amoffat.github.io/sh/) library by default in an attempt to reduce external dependencies. In case of issues, the use of `sh` can be re-enabled by setting the env var `GITLINT_USE_SH_LIB=1`. This fallback will be removed entirely in a future gitlint release. ([#351](https://github.com/jorisroovers/gitlint/issues/351)) +- `--commits` now also accepts a comma-separated list of commit hashes, making it possible to lint a list of non-contiguous commits without invoking gitlint multiple times ([#283](https://github.com/jorisroovers/gitlint/issues/283)) +- Improved handling of branches that have no commits ([#188](https://github.com/jorisroovers/gitlint/issues/189)) - thanks [domsekotill](https://github.com/domsekotill) +- Support for `GITLINT_CONFIG` env variable ([#189](https://github.com/jorisroovers/gitlint/issues/188)) - thanks [Notgnoshi](https://github.com/Notgnoshi) +- Added [a new `gitlint-ci` pre-commit hook](https://jorisroovers.com/gitlint/#gitlint-and-pre-commit-in-ci), making it easier to run gitlint through pre-commit in CI ([#191](https://github.com/jorisroovers/gitlint/issues/191)) - thanks [guillaumelambert](https://github.com/guillaumelambert) +- Contrib Rules: + - New [contrib-disallow-cleanup-commits](https://jorisroovers.com/gitlint/contrib_rules/#cc2-contrib-disallow-cleanup-commits) rule ([#312](https://github.com/jorisroovers/gitlint/issues/312)) - thanks [matthiasbeyer](https://github.com/matthiasbeyer) + - New [contrib-allowed-authors](https://jorisroovers.com/gitlint/contrib_rules/#cc3-contrib-allowed-authors) rule ([#358](https://github.com/jorisroovers/gitlint/issues/358)) - thanks [stauchert](https://github.com/stauchert) +- User Defined rules: + - Gitlint now recognizes `fixup=amend` commits (see related [git documentation](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---fixupamendrewordltcommitgt)), available as `commit.is_fixup_amend_commit=True` + - Gitlint now parses diff **stat** information, available in `commit.changed_files_stats` ([#314](https://github.com/jorisroovers/gitlint/issues/314)) +- Bugfixes: + - Use correct encoding when using `--msg-filename` parameter ([#310](https://github.com/jorisroovers/gitlint/issues/310)) + - Various documentation fixes ([#244](https://github.com/jorisroovers/gitlint/issues/244)) ([#263](https://github.com/jorisroovers/gitlint/issues/263)) ([#266](https://github.com/jorisroovers/gitlint/issues/266)) ([#294](https://github.com/jorisroovers/gitlint/issues/294)) ([#295](https://github.com/jorisroovers/gitlint/issues/295)) ([#347](https://github.com/jorisroovers/gitlint/issues/347)) ([#364](https://github.com/jorisroovers/gitlint/issues/364)) - thanks [scop](https://github.com/scop), [OrBin](https://github.com/OrBin), [jtaylor100](https://github.com/jtaylor100), [stauchert](https://github.com/stauchert) +- Under-the-hood: + - Dependencies updated + - Moved to [black](https://github.com/psf/black) for formatting + - Fixed nasty CI issue ([#298](https://github.com/jorisroovers/gitlint/issues/298)) + - Unit tests fix ([#256](https://github.com/jorisroovers/gitlint/issues/256)) - thanks [carlsmedstad](https://github.com/carlsmedstad) + - Vagrant box removed in favor of github dev containers ([#348](https://github.com/jorisroovers/gitlint/issues/348)) + - Removed a few lingering references to the `master` branch in favor of `main` + - Moved [roadmap and project planning](https://github.com/users/jorisroovers/projects/1) to github projects + - Thanks to [sigmavirus24](https://github.com/sigmavirus24) for continued overall help and support + ## v0.17.0 (2021-11-28) ## Contributors: Special thanks to all contributors for this release, in particular [andersk](https://github.com/andersk) and [sigmavirus24](https://github.com/sigmavirus24). @@ -13,12 +45,12 @@ Special thanks to all contributors for this release, in particular [sigmavirus24 - Python 3.10 support - **New Rule**: [ignore-by-author-name](http://jorisroovers.github.io/gitlint/rules/#i4-ignore-by-author-name) allows users to skip linting commit messages made by specific authors -- `--commit ` flag to more easily lint a single commit message ([#141](https://github.com/jorisroovers/gitlint/issues/141)) +- `--commit ` flag to more easily lint a single commit message ([#141](https://github.com/jorisroovers/gitlint/issues/141)) - `--fail-without-commits` flag will force gitlint to fail ([exit code 253](https://jorisroovers.com/gitlint/#exit-codes)) when the target commit range is empty (typically when using `--commits`) ([#193](https://github.com/jorisroovers/gitlint/issues/193)) - Bugfixes: - [contrib-title-conventional-commits (CT1)](https://jorisroovers.com/gitlint/contrib_rules/#ct1-contrib-title-conventional-commits) now properly enforces the commit type ([#185](https://github.com/jorisroovers/gitlint/issues/185)) - [contrib-title-conventional-commits (CT1)](https://jorisroovers.com/gitlint/contrib_rules/#ct1-contrib-title-conventional-commits) now supports the BREAKING CHANGE symbol "!" ([#186](https://github.com/jorisroovers/gitlint/issues/186)) -- Heads-up: [Python 3.6 will become EOL at the end of 2021](https://endoflife.date/python). It's likely that future gitlint releases will stop supporting Python 3.6 as a result. We will continue to support Python 3.6 as long as its easily doable, which in practice usually means as long as our dependencies support it. +- Heads-up: [Python 3.6 will become EOL at the end of 2021](https://endoflife.date/python). It's likely that future gitlint releases will stop supporting Python 3.6 as a result. We will continue to support Python 3.6 as long as it's easily doable, which in practice usually means as long as our dependencies support it. - Under-the-hood: dependencies updated, test and github action improvements. ## v0.15.1 (2021-04-16) ## @@ -168,8 +200,8 @@ and [AlexMooney](https://github.com/AlexMooney) for their contributions. [Rules section of the documentation](http://jorisroovers.github.io/gitlint/rules/#m1-author-valid-email). - **Breaking change**: The `--commits` commandline flag now strictly follows the refspec format as interpreted by the [`git rev-list `](https://git-scm.com/docs/git-rev-list) command. This means - that linting a single commit using `gitlint --commits ` won't work anymore. Instead, for single commits, - users now need to specificy `gitlint --commits ^...`. On the upside, this change also means + that linting a single commit using `gitlint --commits ` won't work anymore. Instead, for single commits, + users now need to specificy `gitlint --commits ^...`. On the upside, this change also means that gitlint will now understand all refspec formatters, including `gitlint --commits HEAD` to lint all commits in the repository. This fixes [#23](https://github.com/jorisroovers/gitlint/issues/23). - **Breaking change**: Gitlint now always falls back on trying to read a git message from a local git repository, only diff --git a/Dockerfile b/Dockerfile index db3642e..8a4ad25 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ # NOTE: --ulimit is required to work around a limitation in Docker # Details: https://github.com/jorisroovers/gitlint/issues/129 -FROM python:3.10-alpine +FROM python:3.11.0-alpine ARG GITLINT_VERSION RUN apk add git diff --git a/README.md b/README.md index e87dc37..ecf8298 100644 --- a/README.md +++ b/README.md @@ -20,4 +20,4 @@ All contributions are welcome and very much appreciated! See [jorisroovers.github.io/gitlint/contributing](http://jorisroovers.github.io/gitlint/contributing) for details on how to get started - it's easy! -We maintain a [loose roadmap on our wiki](https://github.com/jorisroovers/gitlint/wiki/Roadmap). +We maintain a [loose project plan on Github Projects](https://github.com/users/jorisroovers/projects/1/views/1). diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index f913248..0000000 --- a/Vagrantfile +++ /dev/null @@ -1,49 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -VAGRANTFILE_API_VERSION = "2" - -INSTALL_DEPS=<> /home/vagrant/.bashrc -grep 'source .venv36/bin/activate' /home/vagrant/.bashrc || echo 'source .venv36/bin/activate' >> /home/vagrant/.bashrc -EOF - -INSTALL_JENKINS=< /etc/apt/sources.list.d/jenkins.list' -sudo apt-get update -sudo apt-get install -y openjdk-8-jre -sudo apt-get install -y jenkins -EOF - -Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| - - config.vm.box = "ubuntu/focal64" - - config.vm.define "dev" do |dev| - dev.vm.provision "gitlint", type: "shell", inline: "#{INSTALL_DEPS}" - # Use 'vagrant provision --provision-with jenkins' to only run jenkins install - dev.vm.provision "jenkins", type: "shell", inline: "#{INSTALL_JENKINS}" - end - - config.vm.network "forwarded_port", guest: 8080, host: 9080 - - if Vagrant.has_plugin?("vagrant-cachier") - config.cache.scope = :box - end - -end diff --git a/doc-requirements.txt b/doc-requirements.txt index 33ce51e..40febbe 100644 --- a/doc-requirements.txt +++ b/doc-requirements.txt @@ -1 +1 @@ -mkdocs==1.2.3 \ No newline at end of file +mkdocs==1.4.1 \ No newline at end of file diff --git a/docs/configuration.md b/docs/configuration.md index addf0c0..af49d7c 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -11,7 +11,7 @@ gitlint generate-config You can also use a different config file like so: ```sh -gitlint --config myconfigfile.ini +gitlint --config myconfigfile.ini ``` The block below shows a sample `.gitlint` file. Details about rule config options can be found on the @@ -39,16 +39,17 @@ ignore=title-trailing-punctuation, T3 # precedence over this verbosity = 2 -# By default gitlint will ignore merge, revert, fixup and squash commits. +# By default gitlint will ignore merge, revert, fixup, fixup=amend, and squash commits. ignore-merge-commits=true ignore-revert-commits=true ignore-fixup-commits=true +ignore-fixup-amend-commits=true ignore-squash-commits=true -# Ignore any data send to gitlint via stdin +# Ignore any data sent to gitlint via stdin ignore-stdin=true -# Fetch additional meta-data from the local repository when manually passing a +# Fetch additional meta-data from the local repository when manually passing a # commit message to gitlint via stdin or --commit-msg. Disabled by default. staged=true @@ -58,6 +59,11 @@ staged=true # Disabled by default. fail-without-commits=true +# Whether to use Python `search` instead of `match` semantics in rules that use +# regexes. Context: https://github.com/jorisroovers/gitlint/issues/254 +# Disabled by default, but will be enabled by default in the future. +regex-style-search=true + # Enable debug mode (prints more output). Disabled by default. debug=true @@ -187,7 +193,7 @@ gitlint-ignore: all `gitlint-ignore: all` can occur on any line, as long as it is at the start of the line. -You can also specify specific rules to be ignored as follows: +You can also specify specific rules to be ignored as follows: ``` WIP: This is my commit message @@ -201,7 +207,7 @@ gitlint-ignore: T1, body-hard-tab gitlint configuration is applied in the following order of precedence: 1. Commit specific config (e.g.: `gitlint-ignore: all` in the commit message) -2. Configuration Rules (e.g.: [ignore-by-title](/rules/#i1-ignore-by-title)) +2. Configuration Rules (e.g.: [ignore-by-title](rules.md#i1-ignore-by-title)) 3. Commandline convenience flags (e.g.: `-vv`, `--silent`, `--ignore`) 4. Environment variables (e.g.: `GITLINT_VERBOSITY=3`) 5. Commandline configuration flags (e.g.: `-c title-max-length=123`) @@ -216,9 +222,9 @@ using commandline flags or in `[general]` section in a `.gitlint` configuration Enable silent mode (no output). Use [exit](index.md#exit-codes) code to determine result. -Default value | gitlint version | commandline flag | environment variable ----------------|------------------|-------------------|----------------------- -`False` | >= 0.1.0 | `--silent` | `GITLINT_SILENT` +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| `False` | >= 0.1.0 | `--silent` | `GITLINT_SILENT` | #### Examples ```sh @@ -226,14 +232,15 @@ Default value | gitlint version | commandline flag | environment variable gitlint --silent GITLINT_SILENT=1 gitlint # using env variable ``` +------------------------------------------------------------------------------------------------------------------------ ### verbosity Amount of output gitlint will show when printing errors. -Default value | gitlint version | commandline flag | environment variable ----------------|------------------|-------------------|----------------------- -3 | >= 0.1.0 | `-v` | `GITLINT_VERBOSITY` +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| 3 | >= 0.1.0 | `-v` | `GITLINT_VERBOSITY` | #### Examples @@ -252,14 +259,15 @@ GITLINT_VERBOSITY=2 gitlint # using env variable [general] verbosity=2 ``` +------------------------------------------------------------------------------------------------------------------------ ### ignore Comma separated list of rules to ignore (by name or id). -Default value | gitlint version | commandline flag | environment variable ----------------------------|------------------|-------------------|----------------------- - [] (=empty list) | >= 0.1.0 | `--ignore` | `GITLINT_IGNORE` +| Default value | gitlint version | commandline flag | environment variable | +| ---------------- | --------------- | ---------------- | -------------------- | +| [] (=empty list) | >= 0.1.0 | `--ignore` | `GITLINT_IGNORE` | #### Examples ```sh @@ -274,14 +282,15 @@ GITLINT_IGNORE=T1,body-min-length gitlint # using env variable [general] ignore=T1,body-min-length ``` +------------------------------------------------------------------------------------------------------------------------ ### debug Enable debugging output. -Default value | gitlint version | commandline flag | environment variable ----------------|------------------|-------------------|----------------------- - false | >= 0.7.1 | `--debug` | `GITLINT_DEBUG` +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| false | >= 0.7.1 | `--debug` | `GITLINT_DEBUG` | #### Examples ```sh @@ -291,14 +300,15 @@ GITLINT_DEBUG=1 gitlint # using env variable # --debug is special, the following does NOT work # gitlint -c general.debug=true ``` +------------------------------------------------------------------------------------------------------------------------ ### target Target git repository gitlint should be linting against. -Default value | gitlint version | commandline flag | environment variable ----------------------------|------------------|-------------------|----------------------- -(empty) | >= 0.8.0 | `--target` | `GITLINT_TARGET` +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| (empty) | >= 0.8.0 | `--target` | `GITLINT_TARGET` | #### Examples ```sh @@ -312,14 +322,31 @@ GITLINT_TARGET=/home/joe/myrepo/ gitlint # using env variable [general] target=/home/joe/myrepo/ ``` +------------------------------------------------------------------------------------------------------------------------ + +### config + +Path where gitlint looks for a config file. + +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| `.gitlint` | >= 0.1.0 | `--config` | `GITLINT_CONFIG` | + +#### Examples +```sh +gitlint --config=/home/joe/gitlint.ini +gitlint -C /home/joe/gitlint.ini # different way of doing the same +GITLINT_CONFIG=/home/joe/gitlint.ini # using env variable +``` +------------------------------------------------------------------------------------------------------------------------ ### extra-path Path where gitlint looks for [user-defined rules](user_defined_rules.md). -Default value | gitlint version | commandline flag | environment variable ----------------------------|------------------|-------------------|----------------------- - (empty) | >= 0.8.0 | `--extra-path` | `GITLINT_EXTRA_PATH` +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| (empty) | >= 0.8.0 | `--extra-path` | `GITLINT_EXTRA_PATH` | #### Examples ```sh @@ -333,14 +360,14 @@ GITLINT_EXTRA_PATH=/home/joe/rules/ gitlint # using env variable [general] extra-path=/home/joe/rules/ ``` - +------------------------------------------------------------------------------------------------------------------------ ### contrib -Comma-separated list of [Contrib rules](contrib_rules) to enable (by name or id). +Comma-separated list of [Contrib rules](contrib_rules.md) to enable (by name or id). -Default value | gitlint version | commandline flag | environment variable ----------------------------|------------------|-------------------|----------------------- - (empty) | >= 0.12.0 | `--contrib` | `GITLINT_CONTRIB` +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| (empty) | >= 0.12.0 | `--contrib` | `GITLINT_CONTRIB` | #### Examples ```sh @@ -349,21 +376,31 @@ gitlint --contrib=contrib-title-conventional-commits,CC1 # different way of doing the same gitlint -c general.contrib=contrib-title-conventional-commits,CC1 # using env variable -GITLINT_CONTRIB=contrib-title-conventional-commits,CC1 gitlint +GITLINT_CONTRIB=contrib-title-conventional-commits,CC1 gitlint ``` ```ini #.gitlint [general] contrib=contrib-title-conventional-commits,CC1 ``` +------------------------------------------------------------------------------------------------------------------------ ### staged -Fetch additional meta-data from the local repository when manually passing a commit message to gitlint via stdin or `--commit-msg`. +Attempt smart guesses about meta info (like author name, email, branch, changed files, etc) when manually passing a +commit message to gitlint via stdin or `--commit-msg`. -Default value | gitlint version | commandline flag | environment variable ----------------|------------------|-------------------|----------------------- - false | >= 0.13.0 | `--staged` | `GITLINT_STAGED` +Since in such cases no actual git commit exists (yet) for the message being linted, gitlint +needs to apply some heuristics (like checking `git config` and any staged changes) to make a smart guess about what the +likely author name, email, commit date, changed files and branch of the ensuing commit would be. + +When not using the `--staged` flag while linting a commit message via stdin or `--commit-msg`, gitlint will only have +access to the commit message itself for linting and won't be able to enforce rules like +[M1:author-valid-email](rules.md#m1-author-valid-email). + +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| false | >= 0.13.0 | `--staged` | `GITLINT_STAGED` | #### Examples ```sh @@ -377,6 +414,7 @@ GITLINT_STAGED=1 gitlint # using env variable [general] staged=true ``` +------------------------------------------------------------------------------------------------------------------------ ### fail-without-commits @@ -384,15 +422,15 @@ Hard fail when the target commit range is empty. Note that gitlint will already fail by default on invalid commit ranges. This option is specifically to tell gitlint to fail on **valid but empty** commit ranges. -Default value | gitlint version | commandline flag | environment variable ----------------|------------------|---------------------------|----------------------- - false | >= 0.15.2 | `--fail-without-commits` | `GITLINT_FAIL_WITHOUT_COMMITS` +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ------------------------ | ------------------------------ | +| false | >= 0.15.2 | `--fail-without-commits` | `GITLINT_FAIL_WITHOUT_COMMITS` | #### Examples ```sh # CLI # The following will cause gitlint to hard fail (i.e. exit code > 0) -# since HEAD..HEAD is a valid but empty commit range. +# since HEAD..HEAD is a valid but empty commit range. gitlint --fail-without-commits --commits HEAD..HEAD GITLINT_FAIL_WITHOUT_COMMITS=1 gitlint # using env variable ``` @@ -402,13 +440,79 @@ GITLINT_FAIL_WITHOUT_COMMITS=1 gitlint # using env variable fail-without-commits=true ``` +--- +### regex-style-search + +Whether to use Python `re.search()` instead of `re.match()` semantics in all built-in rules that use regular expressions. + +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| false | >= 0.18.0 | Not Available | Not Available | + +!!! important + At this time, `regex-style-search` is **disabled** by default, but it will be **enabled** by default in the future. + + + +Gitlint will log a warning when you're using a rule that uses a custom regex and this option is not enabled: + +```plain +WARNING: I1 - ignore-by-title: gitlint will be switching from using Python regex 'match' (match beginning) to +'search' (match anywhere) semantics. Please review your ignore-by-title.regex option accordingly. +To remove this warning, set general.regex-style-search=True. +More details: https://jorisroovers.github.io/gitlint/configuration/#regex-style-search +``` + +*If you don't have any custom regex specified, gitlint will not log a warning and no action is needed.* + +**To remove the warning:** + +1. Review your regex in the rules gitlint warned for and ensure it's still accurate when using [`re.search()` semantics](https://docs.python.org/3/library/re.html#search-vs-match). +2. Enable `regex-style-search` in your `.gitlint` file (or using [any other way to configure gitlint](http://127.0.0.1:8000/gitlint/configuration/)): + +```ini +[general] +regex-style-search=true +``` + +#### More context +Python offers [two different primitive operations based on regular expressions](https://docs.python.org/3/library/re.html#search-vs-match): +`re.match()` checks for a match only at the beginning of the string, while `re.search()` checks for a match anywhere +in the string. + + + +Most rules in gitlint already use `re.search()` instead of `re.match()`, but there's a few notable exceptions that +use `re.match()`, which can lead to unexpected matching behavior. + +- M1 - author-valid-email +- I1 - ignore-by-title +- I2 - ignore-by-body +- I3 - ignore-body-lines +- I4 - ignore-by-author-name + +The `regex-style-search` option is meant to fix this inconsistency. Setting it to `true` will force the above rules to +use `re.search()` instead of `re.match()`. For detailed context, see [issue #254](https://github.com/jorisroovers/gitlint/issues/254). + + +#### Examples +```sh +# CLI +gitlint -c general.regex-style-search=true +``` +```ini +#.gitlint +[general] +regex-style-search=true +``` +------------------------------------------------------------------------------------------------------------------------ ### ignore-stdin Ignore any stdin data. Sometimes useful when running gitlint in a CI server. -Default value | gitlint version | commandline flag | environment variable ----------------|------------------|-------------------|----------------------- - false | >= 0.12.0 | `--ignore-stdin` | `GITLINT_IGNORE_STDIN` +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | ---------------------- | +| false | >= 0.12.0 | `--ignore-stdin` | `GITLINT_IGNORE_STDIN` | #### Examples ```sh @@ -422,14 +526,15 @@ GITLINT_IGNORE_STDIN=1 gitlint # using env variable [general] ignore-stdin=true ``` +------------------------------------------------------------------------------------------------------------------------ ### ignore-merge-commits Whether or not to ignore merge commits. -Default value | gitlint version | commandline flag | environment variable ----------------|------------------|-------------------|----------------------- - true | >= 0.7.0 | Not Available | Not Available +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| true | >= 0.7.0 | Not Available | Not Available | #### Examples ```sh @@ -441,14 +546,15 @@ gitlint -c general.ignore-merge-commits=false [general] ignore-merge-commits=false ``` +------------------------------------------------------------------------------------------------------------------------ ### ignore-revert-commits Whether or not to ignore revert commits. -Default value | gitlint version | commandline flag | environment variable ----------------|------------------|-------------------|----------------------- - true | >= 0.13.0 | Not Available | Not Available +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| true | >= 0.13.0 | Not Available | Not Available | #### Examples ```sh @@ -460,14 +566,15 @@ gitlint -c general.ignore-revert-commits=false [general] ignore-revert-commits=false ``` +------------------------------------------------------------------------------------------------------------------------ ### ignore-fixup-commits Whether or not to ignore [fixup](https://git-scm.com/docs/git-commit#git-commit---fixupltcommitgt) commits. -Default value | gitlint version | commandline flag | environment variable ----------------|------------------|-------------------|----------------------- - true | >= 0.9.0 | Not Available | Not Available +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| true | >= 0.9.0 | Not Available | Not Available | #### Examples ```sh @@ -479,14 +586,35 @@ gitlint -c general.ignore-fixup-commits=false [general] ignore-fixup-commits=false ``` +------------------------------------------------------------------------------------------------------------------------ + +### ignore-fixup-amend-commits + +Whether or not to ignore [fixup=amend](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---fixupamendrewordltcommitgt) commits. + +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| true | >= 0.18.0 | Not Available | Not Available | + +#### Examples +```sh +# CLI +gitlint -c general.ignore-fixup-amend-commits=false +``` +```ini +#.gitlint +[general] +ignore-fixup-amend-commits=false +``` +------------------------------------------------------------------------------------------------------------------------ ### ignore-squash-commits Whether or not to ignore [squash](https://git-scm.com/docs/git-commit#git-commit---squashltcommitgt) commits. -Default value | gitlint version | commandline flag | environment variable ----------------|------------------|-------------------|----------------------- - true | >= 0.9.0 | Not Available | Not Available +| Default value | gitlint version | commandline flag | environment variable | +| ------------- | --------------- | ---------------- | -------------------- | +| true | >= 0.9.0 | Not Available | Not Available | #### Examples ```sh diff --git a/docs/contrib_rules.md b/docs/contrib_rules.md index 336e42a..e085f23 100644 --- a/docs/contrib_rules.md +++ b/docs/contrib_rules.md @@ -1,11 +1,12 @@ # Using Contrib Rules + _Introduced in gitlint v0.12.0_ Contrib rules are community-**contrib**uted rules that are disabled by default, but can be enabled through configuration. Contrib rules are meant to augment default gitlint behavior by providing users with rules for common use-cases without forcing these rules on all gitlint users. This also means that users don't have to -re-implement these commonly used rules themselves as [user-defined](user_defined_rules) rules. +re-implement these commonly used rules themselves as [user-defined](user_defined_rules.md) rules. To enable certain contrib rules, you can use the `--contrib` flag. ```sh @@ -42,6 +43,8 @@ ID | Name | gitlint version | Description ------|-------------------------------------|------------------ |------------------------------------------- CT1 | contrib-title-conventional-commits | >= 0.12.0 | Enforces [Conventional Commits](https://www.conventionalcommits.org/) commit message style on the title. CC1 | contrib-body-requires-signed-off-by | >= 0.12.0 | Commit body must contain a `Signed-off-by` line. +CC2 | contrib-disallow-cleanup-commits | >= 0.18.0 | Commit title must not contain `fixup!`, `squash!`, `amend!`. +CC3 | contrib-allowed-authors | >= 0.18.0 | Enforce that only authors listed in the `AUTHORS` file are allowed to commit. ## CT1: contrib-title-conventional-commits ## @@ -63,5 +66,18 @@ ID | Name | gitlint version | Description CC1 | contrib-body-requires-signed-off-by | >= 0.12.0 | Commit body must contain a `Signed-off-by` line. This means, a line that starts with the `Signed-off-by` keyword. +## CC2: contrib-disallow-cleanup-commits ## + +ID | Name | gitlint version | Description +------|----------------------------------|--------------------|------------------------------------------- +CC2 | contrib-disallow-cleanup-commits | >= 0.18.0 | Commit title must not contain `fixup!`, `squash!` or `amend!`. This means `git commit --fixup` and `git commit --squash` commits are not allowed. + +## CC3: contrib-allowed-authors ## + +ID | Name | gitlint version | Description +------|----------------------------------|--------------------|------------------------------------------- +CC3 | contrib-allowed-authors | >= 0.18.0 | The commit author must be listed in an `AUTHORS` file to be allowed to commit. Possible file names are also `AUTHORS.txt` and `AUTHORS.md`. + ## Contributing Contrib rules -We'd love for you to contribute new Contrib rules to gitlint or improve existing ones! Please visit the [Contributing](contributing) page on how to get started. + +We'd love for you to contribute new Contrib rules to gitlint or improve existing ones! Please visit the [Contributing](contributing.md) page on how to get started. diff --git a/docs/contributing.md b/docs/contributing.md index 1002676..254e856 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -6,7 +6,7 @@ The [source-code and issue tracker](https://github.com/jorisroovers/gitlint) are Often it takes a while for us (well, actually just [me](https://github.com/jorisroovers)) to get back to you (sometimes up to a few months, this is a hobby project), but rest assured that we read your message and appreciate your interest! -We maintain a [loose roadmap on our wiki](https://github.com/jorisroovers/gitlint/wiki/Roadmap), but +We maintain a [loose project plan on github projects](https://github.com/users/jorisroovers/projects/1/), but that's open to a lot of change and input. ## Guidelines @@ -19,11 +19,15 @@ When contributing code, please consider all the parts that are typically require - [Integration tests](https://github.com/jorisroovers/gitlint/tree/main/qa) (also automatically [enforced by CI](https://github.com/jorisroovers/gitlint/actions)). Again, please consider writing new ones for your functionality, not only updating existing ones to make the build pass. -- [Documentation](https://github.com/jorisroovers/gitlint/tree/main/docs) +- [Documentation](https://github.com/jorisroovers/gitlint/tree/main/docs). Since we want to maintain a high standard of quality, all of these things will have to be done regardless before code -can make it as part of a release. If you can already include them as part of your PR, it's a huge timesaver for us -and it's likely that your PR will be merged and released a lot sooner. Thanks! +can make it as part of a release. **Gitlint commits and pull requests are gated on all of our tests and checks as well as +code-review**. If you can already include them as part of your PR, it's a huge timesaver for us +and it's likely that your PR will be merged and released a lot sooner. + +It's also a good idea to open an issue before submitting a PR for non-trivial changes, so we can discuss what you have +in mind before you spend the effort. Thanks! !!! Important **On the topic of releases**: Gitlint releases typically go out when there's either enough new features and fixes @@ -32,55 +36,105 @@ and it's likely that your PR will be merged and released a lot sooner. Thanks! or months before merged code actually gets released - we know that can be frustrating but please understand it's a well-considered trade-off based on available time. -## Development +## Local setup -There is a Vagrantfile (Ubuntu) in this repository that can be used for development. -It comes pre-installed with all Python versions that gitlint supports. -```sh -vagrant up -vagrant ssh -``` - -Or you can choose to use your local environment: +To install gitlint for local development: ```sh python -m venv .venv . .venv/bin/activate -pip install --upgrade pip pip install -r requirements.txt -r test-requirements.txt -r doc-requirements.txt python setup.py develop ``` -To run tests: +## Github Devcontainer + +We provide a devcontainer on github to make it easier to get started with gitlint development using VSCode. + +To start one, click the plus button under the *Code* dropdown on +[the gitlint repo on github](https://github.com/jorisroovers/gitlint). + +**It can take ~15min for all post installation steps to finish.** + +![Gitlint Dev Container Instructions](images/dev-container.png) + + +After setup has finished, you should be able to just activate the virtualenv in the home dir and run the tests: +```sh +. ~/.venv/bin/activate +./run_tests.sh +``` + +By default we have python 3.11 installed in the dev container, but you can also use [asdf](https://asdf-vm.com/) +(preinstalled) to install additional python versions: + +```sh +# Ensure ASDF overrides system python in PATH +# You can also append this line to your ~/.bash_profile in the devcontainer to have this happen automatically on login +source "$(brew --prefix asdf)/libexec/asdf.sh" + +# Install python 3.9.15 +asdf install python 3.9.15 +# List all available python versions +asdf list all python +# List installed python versions +asdf list python +``` + +## Running tests ```sh ./run_tests.sh # run unit tests and print test coverage -./run_tests.sh gitlint/tests/rules/test_body_rules.py::BodyRuleTests::test_body_missing # run a single test +./run_tests.sh gitlint-core/gitlint/tests/rules/test_body_rules.py::BodyRuleTests::test_body_missing # run a single test +pytest -k test_body_missing # Alternative way to run a specific test by invoking pytest directly with a keyword expression ./run_tests.sh --no-coverage # run unit tests without test coverage ./run_tests.sh --collect-only --no-coverage # Only collect, don't run unit tests ./run_tests.sh --integration # Run integration tests (requires that you have gitlint installed) ./run_tests.sh --build # Run build tests (=build python package) -./run_tests.sh --pep8 # pep8 checks +./run_tests.sh --format # format checks (black) ./run_tests.sh --stats # print some code stats ./run_tests.sh --git # inception: run gitlint against itself ./run_tests.sh --lint # run pylint checks -./run_tests.sh --all # Run unit, integration, pep8 and gitlint checks +./run_tests.sh --all # Run unit, integration, format and gitlint checks ``` +## Formatting + +We use [black](https://black.readthedocs.io/en/stable/) for code formatting. +To use it, just run black against the code you modified: -The `Vagrantfile` comes with `virtualenv`s for python 3.6, 3.7, 3.8, 3.9 and pypy3.6. -You can easily run tests against specific python environments by using the following commands *inside* of the Vagrant VM: ```sh -./run_tests.sh --envs 36 # Run the unit tests against Python 3.6 -./run_tests.sh --envs 36,37,pypy36 # Run the unit tests against Python 3.6, Python 3.7 and Pypy3.6 -./run_tests.sh --envs 36,37 --pep8 # Run pep8 checks against Python 3.6 and Python 3.7 (also works for --git, --integration, --pep8, --stats and --lint. -./run_tests.sh --envs all --all # Run all tests against all environments -./run_tests.sh --all-env --all # Idem: Run all tests against all environments +black . # format all python code +black gitlint-core/gitlint/lint.py # format a specific file ``` -!!! important - Gitlint commits and pull requests are gated on all of our tests and checks. +## Documentation +We use [mkdocs](https://www.mkdocs.org/) for generating our documentation from markdown. + +To use it: +```sh +pip install -r doc-requirements.txt # install doc requirements +mkdocs serve +``` + +Then access the documentation website on [http://localhost:8000](). ## Packaging +Gitlint consists of 2 python packages: [gitlint](https://pypi.org/project/gitlint/) +and [gitlint-core](https://pypi.org/project/gitlint-core/). + +The `gitlint` package is just a wrapper package around `gitlint-core[trusted-deps]` which strictly pins gitlint +dependencies to known working versions. + +There are scenarios where users (or OS package managers) may want looser dependency requirements. +In these cases, users can just install `gitlint-core` directly (`pip install gitlint-core`). + +[Issue 162](https://github.com/jorisroovers/gitlint/issues/162) has all the background of how we got to the decision +to split gitlint in 2 packages. + +![Gitlint package structure](images/gitlint-packages.png) + +### Packaging description + To see the package description in HTML format ```sh pip install docutils @@ -89,16 +143,6 @@ export LANG=en_US.UTF-8 python setup.py --long-description | rst2html.py > output.html ``` -## Documentation -We use [mkdocs](https://www.mkdocs.org/) for generating our documentation from markdown. - -To use it, do the following outside of the vagrant box (on your host machine): -```sh -pip install -r doc-requirements.txt # install doc requirements -mkdocs serve -``` - -Then access the documentation website on your host machine on [http://localhost:8000](). ## Tools We keep a small set of scripts in the `tools/` directory: @@ -110,13 +154,13 @@ tools/windows/run_tests.bat # Windows run unit tests ``` ## Contrib rules -Since gitlint 0.12.0, we support [Contrib rules](../contrib_rules): community contributed rules that are part of gitlint +Since gitlint 0.12.0, we support [Contrib rules](contrib_rules.md): community contributed rules that are part of gitlint itself. Thanks for considering to add a new one to gitlint! Before starting, please read all the other documentation on this page about contributing first. Then, we suggest taking the following approach to add a Contrib rule: -1. **Write your rule as a [user-defined rule](../user_defined_rules)**. In terms of code, Contrib rules are identical to +1. **Write your rule as a [user-defined rule](user_defined_rules.md)**. In terms of code, Contrib rules are identical to user-defined rules, they just happen to have their code sit within the gitlint codebase itself. 2. **Add your user-defined rule to gitlint**. You should put your file(s) in the [gitlint/contrib/rules](https://github.com/jorisroovers/gitlint/tree/main/gitlint-core/gitlint/contrib/rules) directory. 3. **Write unit tests**. The gitlint codebase contains [Contrib rule test files you can copy and modify](https://github.com/jorisroovers/gitlint/tree/main/gitlint-core/gitlint/tests/contrib/rules). @@ -129,7 +173,7 @@ If you follow the steps above and follow the existing gitlint conventions wrt na In case you're looking for a slightly more formal spec, here's what gitlint requires of Contrib rules. -- Since Contrib rules are really just user-defined rules that live within the gitlint code-base, all the [user-rule requirements](../user_defined_rules/#rule-requirements) also apply to Contrib rules. +- Since Contrib rules are really just user-defined rules that live within the gitlint code-base, all the [user-rule requirements](user_defined_rules.md#rule-requirements) also apply to Contrib rules. - All contrib rules **must** have associated unit tests. We *sort of* enforce this by a unit test that verifies that there's a test file for each contrib file. - All contrib rules **must** have names that start with `contrib-`. This is to easily distinguish them from default gitlint rules. @@ -137,4 +181,4 @@ In case you're looking for a slightly more formal spec, here's what gitlint requ - All contrib rules **must** have unique names and ids. - You **can** add multiple rule classes to the same file, but classes **should** be logically grouped together in a single file that implements related rules. - Contrib rules **should** be meaningfully different from one another. If a behavior change or tweak can be added to an existing rule by adding options, that should be considered first. However, large [god classes](https://en.wikipedia.org/wiki/God_object) that implement multiple rules in a single class should obviously also be avoided. -- Contrib rules **should** use [options](../user_defined_rules/#options) to make rules configurable. +- Contrib rules **should** use [options](user_defined_rules.md#options) to make rules configurable. diff --git a/docs/demos/asciicinema.json b/docs/demos/asciicinema.json index c6e2747..a5664c7 100644 --- a/docs/demos/asciicinema.json +++ b/docs/demos/asciicinema.json @@ -1448,7 +1448,7 @@ ], [ 0.002767, - "\u001b[1;1H\u001b[93m 1 \r\n 2 \u001b[m\u001b[96m# Please enter the commit message for your changes. Lines starting\u001b[m\r\n\u001b[93m 3 \u001b[m\u001b[96m# with '#' will be ignored, and an empty message aborts the commit.\u001b[m\r\n\u001b[93m 4 \u001b[m\u001b[96m# On branch \u001b[m\u001b[38;5;224mmaster\u001b[m\r\n\u001b[93m 5 \u001b[m\u001b[96m# \u001b[m\u001b[38;5;81mChanges to be committed:\u001b[m\r\n\u001b[93m 6 \u001b[m\u001b[96m# \u001b[m\u001b[38;5;121mnew file\u001b[m\u001b[96m: \u001b[m\u001b[95m foo.txt\u001b[m\r\n\u001b[93m 7 \u001b[m\u001b[96m#\u001b[m\r\n\u001b[94m~ \u001b[9;1H~ \u001b[10;1H~ \u001b[11;1H~ \u001b[12;1H~ \u001b[13;1H~ " + "\u001b[1;1H\u001b[93m 1 \r\n 2 \u001b[m\u001b[96m# Please enter the commit message for your changes. Lines starting\u001b[m\r\n\u001b[93m 3 \u001b[m\u001b[96m# with '#' will be ignored, and an empty message aborts the commit.\u001b[m\r\n\u001b[93m 4 \u001b[m\u001b[96m# On branch \u001b[m\u001b[38;5;224mmain\u001b[m\r\n\u001b[93m 5 \u001b[m\u001b[96m# \u001b[m\u001b[38;5;81mChanges to be committed:\u001b[m\r\n\u001b[93m 6 \u001b[m\u001b[96m# \u001b[m\u001b[38;5;121mnew file\u001b[m\u001b[96m: \u001b[m\u001b[95m foo.txt\u001b[m\r\n\u001b[93m 7 \u001b[m\u001b[96m#\u001b[m\r\n\u001b[94m~ \u001b[9;1H~ \u001b[10;1H~ \u001b[11;1H~ \u001b[12;1H~ \u001b[13;1H~ " ], [ 0.000062, @@ -2404,7 +2404,7 @@ ], [ 0.052844, - "1: T3 Title has trailing punctuation (!): \"WIP: This is an patchset that I need to continue working on!\"\r\n1: T5 Title contains the word 'WIP' (case-insensitive): \"WIP: This is an patchset that I need to continue working on!\"\r\n3: B6 Body message is missing\r\n" + "1: T3 Title has trailing punctuation (!): \"WIP: This is a patchset that I need to continue working on!\"\r\n1: T5 Title contains the word 'WIP' (case-insensitive): \"WIP: This is a patchset that I need to continue working on!\"\r\n3: B6 Body message is missing\r\n" ], [ 0.006075, @@ -2432,7 +2432,7 @@ ], [ 0.004763, - "[master 4b1f92d] WIP: This is an patchset that I need to continue working on!\r\n" + "[main 4b1f92d] WIP: This is a patchset that I need to continue working on!\r\n" ], [ 0.001504, @@ -3108,11 +3108,11 @@ ], [ 0.050694, - "1: T1 Title exceeds max length (60\u003e50): \"WIP: This is an patchset that I need to continue working on!\"\r\n" + "1: T1 Title exceeds max length (60\u003e50): \"WIP: This is a patchset that I need to continue working on!\"\r\n" ], [ 0.000006, - "1: T3 Title has trailing punctuation (!): \"WIP: This is an patchset that I need to continue working on!\"\r\n1: T5 Title contains the word 'WIP' (case-insensitive): \"WIP: This is an patchset that I need to continue working on!\"\r\n3: B6 Body message is missing\r\n" + "1: T3 Title has trailing punctuation (!): \"WIP: This is a patchset that I need to continue working on!\"\r\n1: T5 Title contains the word 'WIP' (case-insensitive): \"WIP: This is a patchset that I need to continue working on!\"\r\n3: B6 Body message is missing\r\n" ], [ 0.005418, @@ -3508,7 +3508,7 @@ ], [ 0.050989, - "1: T1 Title exceeds max length (60\u003e50): \"WIP: This is an patchset that I need to continue working on!\"\r\n1: T5 Title contains the word 'WIP' (case-insensitive): \"WIP: This is an patchset that I need to continue working on!\"\r\n" + "1: T1 Title exceeds max length (60\u003e50): \"WIP: This is a patchset that I need to continue working on!\"\r\n1: T5 Title contains the word 'WIP' (case-insensitive): \"WIP: This is a patchset that I need to continue working on!\"\r\n" ], [ 0.000025, @@ -3795,4 +3795,4 @@ "exit\r\n" ] ] -} +} \ No newline at end of file diff --git a/docs/extra.css b/docs/extra.css index 5643925..12a7663 100644 --- a/docs/extra.css +++ b/docs/extra.css @@ -2,3 +2,11 @@ a.toctree-l3 { margin-left: 10px; /* display: none; */ } + +.wy-nav-content { + max-width: 1000px; +} + +.document hr { + border-top: 1px solid #666; +} \ No newline at end of file diff --git a/docs/images/dev-container.png b/docs/images/dev-container.png new file mode 100644 index 0000000000000000000000000000000000000000..6cac5a28cf759f588c5df865ef74441781c15139 GIT binary patch literal 212226 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
iYgHJ?ha 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

-dbsSy0m=Rgt(YR34z#u@ny%xDF`M*GerF`-wJa-_u zKUoZ#3AETnHh7?gq_I6y$(p@~%)Po(o)vyf3e!=tGQ2e~0bh?X(uYkln z^^Y)+?OTiiuYWD&UmN!SeeCZKJKTL3M!a_MTe$F#|L;G)Y}Es#*DqK+Hnsn_?f-D* zlht91C(kjF(WKnYX;5H)4=S7@z1dB8g5y-0FP{Bs8CLc`q5OZ|F_Pjg(cq#?#*UFn zJe?_D9cao=G1@{dvf1lj2K1HxpYQtjUti1Jg{T289Ih%jEhyxiZq=_`b*KIW<^1!T ze_uz!|MduXWMn;)OIy57k}hIpw-cftw=1{g>O?iJFE1t+i>n7VPk&l`N^|gE>L(qfST@J=m+Gg`ci=z}S)~fDEblsLu5?>YzN_ftAoch8F+z9(U=8MYMB~F5!{Ga zED5@is2+gz?2DiBJExXPddHYEbo?{-Rojki3WUGT%~!@#1rn+J$x)25>c$EMlx82; zqZMfCx|!)qDZe@bxDx=5l#F<%vPQN(s_V_MTy|`Cf20a9aPRsNRT7uT~}@+H{*|Zu~trWzKH)z2>~i?@#}V0fB@1Z6L78 zDD8L{cRzKP0M(V+2wcC33S`X)A2=*_(YQ!$G@*dxcw&utEFf^V4X_nzBo;k7Xt;Tz zRPM&p<12zx3O|FatZaP;;I9igeEL(D0bpiUY*Z-o5N2WISc)~60v0R#d z%X;krFDHQlPr#~=#?fgM6dL+{vl84RMWdKr`-DmJogB+qc8A~3V9TQy`IWh4k*WNx zr0eY}Dc@3wTMn1!F#vO}0cUhQzfE?q_U#CffR*5IYMAV;m;Bc4H+=81xcg2972fAW z?yf*%b-5JJZ`-%d#(m-ZeEF4apo6u%v3gTdHvj=E*B-+?ZQ+c5qL`}u5EuD+n%thY ziOcP#(Nwmss0K1eWi*x<&5{);IZQO&L4q1WEkzM#zI3tdjK`#rCy=PF*5G>_FD#7< zyAS?uHbp-bqnIjvv_53U;l}_0#0$aCXUPpllB4Ce-CR7boK}-t@OtLc8>h}_Eug#8 z6>rNZe3Et^fesMZN#s+v4peEu^|q1hMG)2m5UnMGbR1Z^4AONGbwn|ryU$ikuC>4` zm+lzheumubQ~pdWtZ##1cJ0e0k#emJ9F1(D|1rV09hJDA9X>ykJ9X2`q(&j)mfR=> zrkdrZDgYXo&J2y^QAR&qpe2a(0MWaOv70SCchmx$YxzyZk?^)#(9%AnD$HgsJG4cp zsphc3`%LmM-6whH^eJ{K_f_ahQzZav^d(ZqMlooN9`lhJOO@VPUNQ*hzV0^)#EI*( z8}p@OCSzhs=~6bQ}r@rhQMxQmuNd@Bt>x%TPl}{ zj>2d(JI2;%%qf)5<=lUFs!FYiI!qj>U(fndFa29{;dgQdSQA(01C9i+9dCbbWqK`9 zBQBpTje+b)YKLNXW*C$-9K}ug`=X6PeWUU!e~4k;*0B#q3A4ztpoNIjJKy}0!Ipy zn|55%DRV3~+nMhCEg`8dO3+BMyObKplbyw<(^avZ%z9s+eqk({ryNi$u0(g3%h=%- z7?*v@W=h8Ad@7640_D7Z={i+V(tB#AhU&cmAjN&ki!PAL4ELR zq96@@x;=P3gwfLL-ST|rdNXC8-e{bn_8Y0&GPZq^CIwei+~r9IaaQDqTHOBU`Ak@M zIPCBX?cVCEi=$o}X}cI2pdqif!0p8Q`El2IlYE|e5~q4UTsfQdLGq?lkc6g_Srn0? zPIj5Ko`lik;oaM`#?F@O<;gF)+8!i;f)G?eoY{KsGUO{{(Q2uavy1l{H zboHf~=;jEPTEDj?MjG|t)R^bmbokkW(+CU!n5h1c#u6|`U8tu!Vz*XUJW(KlIE z_Asi%O)HdItBUplXS%t?gt)fo0!Us!AqUEc`j0FkrAVv0uc4Q7Q{ zSUJ7CWz$VNB(;vJBhH4_|M&xt4BOBpaUf z70D<{V2eW9ZyqWRRVGNkR)e@v0MYxSr?HA)lIGiewJhx>?l)%H@GYpfuq}tC+|KcM z1_~xy@JiYjrkiZy*}Jp^P~k$^%VD9`c6E_Cu$sJk_YKt2V=iR7vk&-zB@hnV-~FiE zqe{Z&96SsP3w4xk!)4MS*8oAs^sbT}&6XtVOcWCj*Y1F3k2|7?0i9&LJmHH;ndmXgiE32j1=iXMvqgHMHS&YPu`?V?iYAW~! zG5%=L*5lPvh8as!PhTxVP^kxb9y7X;RxXtQcnSWDaH=TR(D&`lEj~RHcQ7a^w zZ}Zr&+coIs*EpC?00*|y5#1Yo2SvG0H$grI1cq8;picFGU_drx5)$VApz6Mb8U57x zNx^MhBE?M4O0ed&uVdg)+&##$gTNK<+LhZitKuzVE6>b;Wtj6RY5uc&j#VQXr7HY4 zSF>bg1mIvZQ-zsqEf7?TiSrqTJaZ&T85+2d{^O!v;jDX(kt77HREE}735 zL`GA=zkT)J7g(|PcrzlT&_{e_LQAHSY7J~I3^M$V*ISU3*9hq4N$9Gf_+VAZ3I zM%cvpmNUWeNAqU_`A8byjy7g95Xlpl+0cY)_W&6p$;BJ56W3S+P;b;*Y+FM~1+=Fu z>Ou7{Il!vMX##9F__GBSGW(}JI13|NSV05KH+f$^pa>R_ zangm^AE|8mQRW<_$8or&xm@)bTsD$rx10`xSd7<9;B@PL1;uH|Qwx>IswRagN0eZT zLFEr|Z*o8Svm?juR&P~oa4GK1R$BH4sJb5@0a=Ob`pMjvV!J6`a^k4a_@qS$;7YZ<-QHR^S$aM>_Ox$-wzz=CEW;z|5qZVx15pYklbz{lR* zJ`75!7{OwkP(lr5<$R_5FMOPng|lBe_}_GTDbp);&p1_)>z@(760GP}A-b>GU1g#) zmKJG18-b%8aGS`CG?emSxx59dlf1QK$!ww2mDmn_U9ah(WQfZ=CwnMj8f0&|B=>8} z4eXJHf-dIjl16a&PV9{3jo+HTl$IROZ97l7AqMxtU`UP3lUh2m;Z=yb{r?g>O4p38d8rhUxF5Y{oPU?CY@=Ua&ph`94 z(lcBG`TngR7E5f=3HbT-QA62iy@+nKPIrqhz94fa(4+c+V8!New7g}?F)ri8q$y}L zu~|Q;3zhW6w;BB5vf_mMEg8pn3^>Tuj?!0o-df&IFmTdZgKKIquVLs!`=y<*wWp_= z-kZ13QMzVvwdF&lnLz?5&L z?tzOaH!ZB8c^+xKftzo=xc&$1yg9hiE{#4zqC=0u+-DoRIK|V3liO4h6OQ-%$N53V z@KmhxX*d#T?c}t@_sTML<(3rQ!;^~oV$cX4P%|5IxlBsCU%$$}7r+Y|=H1h~g8sl* zn`V?Ywg3u`ZVG$I77vf-Q@-gPug*eTzlu1DW5{b)kS9GYkkRCOQD77D%3=>y@p|zj zo*dC2m|&`>Ru?iD(WJusyFB>Qti`^w+~jv+jt4nA;*c9 z`l|TOmEjGLeR#Az+Y#R!gJr&7zxRAAz1>Nu*T?ZR?+EI$5`mP&fAElZ>0~mU)qBw5=1kK4hlU!8XEpMNB5NNRzk143rk1boQEaG^bv-sGZ(*vgiJWgI z!H0V)M&Hl54Lslwgl8)*vi3&|;ilewRX?_AlhxQVP}yQQ?=cWN6F>x9z7@%pHKsh!DQ-fBPj4pXht15eRn=Ue_BTv5I?VTk zDcPVAY~5OeZGfi2lSLfd^QB+!X=Rsr5Ycpz8}YkfB5 zUwNKP$X3{bEl6w%saw@|y1d{|d5mGHen4>Pn>zAd0!{RV9e#89vnU>13;Z^c$x(%5 zgWQ*U&L4L%u0rU(jNVV;x0!jIbewO~*^X|ueQ%?zRjnVJbP{=>Kn|_xX!Lj+pJp74 zlc!#mG-nGonJyhleJbv-hVftUlm{wBIF0UuYkI^H`S1s*LFr~4XQTTgy!y&idDZ~8 zloK6AliGJv>SFwuhZkrvlO7O-9Kk+hLce`Auq<@?kq@Qwb8C{*v8|yYn#uS<{k^j3 zcN0KxR`)*O%S%V@lEuZ$2ASyZuFor)5J z8YUTgA~anjF!$5G$jN@W-oSgiued2a)ldlKBz?U5iIPQ2jYa!r74YSJb^^XGYjq4a#Lwe^2;* zti74ocz)l3re8(RG-zle?rgy-=m~@R*WLaZl`sPZdab(dJimLW7P>WUsCe*(ln*RE zFqIMLl5?-{ue!F}ZiEBVHu&h<E)8{Zm zWzv53iGs9-fjw~;v)oErn{(lL81Gni35aLnC{wK1>>2y)HHpkcVwwMaPo8#tp*5eO zgqp99gN|t;aMGJ*%kz9NnfM{MO+GypW)0ADVHN-R`&HtE=XUrcllL`U7D%vUG;`BQ z@%g*PjqQM&C1ZMgagGkG@9!~4oOfwkUp0ms9G-f4TN{d(0;UlE+8mCvh3Dd#^#8bu zKq3~MswU|02=xe6L^lYs(Voi<_ zedNi<@$Olpa|nZK{os>RT$0vj4AQfN7Ii|Psr0gjBU7M+T;cVtxcz};FE5#AFLD3w zaXIXXEXI#ua)p}M=}kLml7l%f@{GLzh{V6)K%D)7^j59uH=SGBgoKF#$q#hiS$x&@ z3~u`aB1-1Fw9#OU&aZgnHKejmDUVa;cuOlcKgR!^elUeUxaacfS zaU$02JrU`h?UwK^d!*SVO39{OwP)|hM`$w97(w&=5_d(*_vD5N845=Wh}w9s&I1VI zSfwnA>BjA+039D zp3?HeeVZpK;%6o1bQD(>n)Af`p@$hkzR+QxTiRvrMSY?xajy&9lJvd3qhKltLolCE z%`9M}+I^w*A;k1D!K~xb17al)S%X-B;M2jPFKDOR68cbP*bj9~9ZKq<$;2Z2A_T7)39wnfWa`jKwpc*JNi|S&&htw8%O;4z;y#_={qlX7f z5mo|m`Uf(?Y#;tGfGou>wQRAjwHUG5?yp?aMlBp-Qzy-J+b_zjH#!}88(VMhMbk-T z(Pm0)x!p6IoLxWqPDBg2WnHvx-u_a9OGRrff<&rWv`yn^MosT!zwUT3Oy*pb>Il!CYlSI}~M8!}NjY zW5MtdwOW-;Lf`OgAALK`wB4xw3(#dH5|ZNB=}UD{NX4}T6OUdmBR zpxeotH2E0k1K~pU+di^5KP&>Plv?HP@2VtwqOW^m867|Sv4C81`Ey4;^ElM%&sQ5j zT;sWQtLc^Myw7%LnG8l!#uK?3V(3drl!#Y)I{e9L~D+^A$rEw*CQ?0`)Qd7TP8`EayQQU5|tP6xy+W-$KK z#LVgNNpBv`a9}RX)H-JNde`K9{Y+qDv7}{BKgaY~waMPA(qeYhsNrk7$JCF9aXJ2h zI>P@=X8}sGF)#Xg@e1($_HCSozru1=dKUny7%yR&%+OEzk&{Xhb2%%d?2f+Q7*_jOPu*w6 zj5EWNghL}YWwcPPS0InB$oYxSMJQF=5mM7w`SJl*`7$~4<#m|dg6a61H6+Q#Qp+V@ zsM&gzG7>k*vmZjg9+?BqU))I1f1TIKy6?0oVe2YupI@JJ@3{qIJ9~}kj10&71eST* z2>bkzu1Zgm1@o|hJ z5@r@us-HCZ-SKG#LljckB&WQe`gZqGfqKs}8pPolCt=ApG0#;ChLy;Zdo5XXN=U>M z{NgVS%Edlj}o~azQZ}m%eu~LVxCj>@d`{% z7xU?Q4d^}(*^?yf9Y#wMzt^Ee)5%9(7;^Y#N7%p-4xJreqs?rU8H3(HRLoqRjS)oMQI5B;T_lxv%S{F6 zRUcLER3(*5-0qMP{vJ@{+U+FDRSt7{R`RNIRYu8=gfh(Hl_iZ;{XL500jP_d7=HK?N((C z>vNIZJKa$6gR9LEKj;It&w|3}2Gs|KjTCf>2Y&AaRSqq2l|i*-*?U>anxDb6#;9nd z2Xx9Ws6_&wL?s0RD7mVw`26JJjSQ$Yfq80Xp%$duGrQOD1XTP>3&5T$3eUc}P<79I zv~G1C4h9`2SocYkavEvhb?LQF4N??cIH(=O-EO>G0UOe5@w;^<3L+i{p=5;e_91^> z*8>PqC;6eu^YGEn&ND_@?7CYsn$_dwJbfOkD)`%bOLs&1OIE%3!paOkR$N9RbyRtC zOIMQeW7US=vnw6!$DUFF__y%wUh&QqY-c&KzjYF}>05pJ58U3SkR`IH3*pn{1Qv;yr7cS^%&GqYz(jU;6PD?9wcdeul>^3(5Kj`7P{+J9cVLB#Gg za3X32l7~CqKH)I%m2f=ox&WAeIy%=`#p#Gdo`fF^!-$+Lx*GmrDOi;LQim0qBYmxQ zEx0Dk+*+RRS01ZosafUxzLl%aL8fT(w&6;&e?yBJvPN;-!TR(VA^{!Ooa; z@0;j~!=RGp2#3X6agL5zg7gY-*bwJ02{<3wIncLrrtytB|f(_9Po@c)5gd~*(ZIju)Iq$l{JTFaPwRzqmW3bVIWCI{- z<2?qTl{Fear0yozCD|tLuG5kt2@Z~)^48p_%BKg?N-ndiYg+{^T-m8EXm z*}XH(7cxDJ>M7M=nqD?9DiFJ6z)MA_7V!j}#1E+*Fy>{A1Mx=mZFJh_~ z1HVr+lUn~fDiu!5VL^sg_m$li6)63`gzf z){Da?K&_=;6cpN|50Yq9$N-(u+Txq4;no)F>z$~1#KyNZrt{fan89YVIfDFW+hbbF zZHZ2!omzM77iYIQ2==G`aU=UP_m?xhuw5#4$U;RA3Lf#xb1cZNJo(dQkzGAxF@A72 z{X7EG-bz=HlO1YqfoeuVg@8p{d#UH;cQgJ47{+-MKUpg&r=yIe>6w=kFTM*jJ}1*k z=(b~BMDj{=WY|OXZ-S-=0+ykRhK3k|h{~Q@_OPXXeVQ3+jw#-*W$kP=2$fM%@T#P0 z^NmwB2+wNkaP2P%4hLge)mEvIeFqg%&_PSeUqrkBd4FJ=^$uZvd?2?++;Ix4j zHc!?rsyuld@J5||h3WG4bVOl9n-hXJfj8Ncy2qg5+_-yXK2bjW2u)Cfw6XL33(Gb0 z;izx1_eoG69k}{xlOwxYG@_BLrSZ0|_87$K+p-AqYi?SPEK3I+B15Y@6ME{P{*mlv~H98;u~-?znq&HNMB&v%)LDr<1}`qsb&W ze6nJ5@H2;K6ZR`Ml79Zv!Q;{Np+}c&ha)ZbFL}p`ay|z+_I|nHri9K~gj!zO0=bwn zn}@h`+ap1ZV6oC3cwxoCc!k2%jxgG=y=QPa_n#-H{#a3W=n7m=}rkzZycn%7GR+DxCu}gs_#4Jbi;qtR9<3GY$4o+%a?K)>uE?kB(LkQ3Du+d3ws)q-3X9n%N^4X5w zjl^adEVhj{+{(xo)nGnox!R}Rx)~+AScTBQnOW@tA-N}q@TrJo4ALXGW1->^#W%@1 zbltZXVf3oFjRzQ-(C3>>p{m&mZw&%Ju;oAScX>7rTUl=_8JN!ow1^Wu&Vd^ z&B0j7`_C0!21-}MOPZ^vB~{{`TTjxzmgl)WUd3Aswd3vC+b4B7iZ1S9dri+Si*Bs8 z=?lC54oaQsuqBX16m4F;Z8DQ7k$Rol{vAHpwWN8U{snXL0f|uaiHuT%KARs#ySdxR zG{+l_HiM;7+3mBB{x=$}f(hp;qBzm5`0X)u3}9bdIePX&p5`Ad&~C#3dl3#~s_ur( zm48St{$_JcAsq18jKfknQR^bc2$*zrd*0hN59COvN-Yr0NZ-+HmZk$N0&2GU7*HtT zJrw#`&yJZP1A7hvUknJZ+j>~smMM&8G9#jBG$cT;!YkQ7IA`Nk&)9v&V~iw&0egxT9jynq2`jymf}<0 zyOpv4U7O3G@Z+6?;TYv?ymnPvn@P?^5O@42YK)u;6RyF_vM(}*_i(7gIx&Ulucd$w z7H02f)2TM*@*X=%yshM)eotA6IxGm zW!f>5!l^fb`ZWdPh|lDJ-Z{|q%_SIdkwk*5@Izjsv*Op|wxHA3L?n?8_O)+f7`3vd zS9ntZjY9>X49-}ops-1r9GGc&Awwp+rS$>3HeJtt6dokrJM-|l9 zhR6@um=tYdLhcAfya$vyVmsFRVto`E;!!}cMJ`dV_<*xF&u6eeQ6}_4ApJ-oCuB&( zY~#oEmHZ`GpHr~b4y4GTu(B~&cbv?mr*G;~ZC9MP?_x!G_#I{)68OpM>&#shWy`Z5 zzD{da0q>(?Y2HGF$*KS2?k(e@+}8hLMMO$cq)S8)kd#gd>Fyc?1f;vWLFpEd5Tv_f zU?@pp=!T&i25A`Le|yf}`|NY}{`{W(`gwPI&y3u$*0t7kUEffn-&quzv-Be|(2qHH z9f>2Ta)_+gvfgOhydZ26q}I~9htOPTuHEI9j9#6S{wT}dFEo$%_lUc@TIVb2ociLAh$j!>J;y~Nf+wDrn z4VKZVN9D$AO`tl5NS{m+;Pv1_?#i%++@3TQ6HL7e=taKJJx?0m!W(rY@I$_3RoSc_Dq!#lp82s<*U7z05P%|JB z4sw!mbxlr?k_!F$Y>N`(0SWfL$jZuXc@iQ`&CR6uU*i7sg#i2dAy58t z7g$*Zf}DI~=!+-($F=F=!QABmZ@yDu+|kblw$VCoIzeWKJENa9UE%lx^#<}|EGm`o z+(4{df;Yvs$e;4%(^(Y&Lf5kPzB8%xyxHJ|=#KEBxTh42 z+GUU;jYsV}zjMjf;;uEMNiBNF;e7R^yU1|Qig|C2phXJe=FqCs`nLr+4AUQvp(wPE z)9Q-5M0e~7O$l4|(YFmn41wo{`9tXw?pgbfsfR?a*;eAcGh6g@*PnMMTZM6b@^Mt0 z@pnOO=g&28-EIEZV!MvMo?r*q*e!n9KQke-Uiz|7rv3@_Sxt*?*7|0uAhjyQK^`lR z@PKJu+mah~;Yo>BLy9Yx^GqmAbx zuM}3Jae@+E&|gJ@=LRz{Go`{R4oDmpHxI&oadvAu}wkoGz_MrGL~u zoJ^hT@NuoLCacjCe!qRiJY`F1ASrojFLan^ZJ*+3q^r<_J)p3Mnb4 zblGR-q5Ie)dOwYA5`cz!alfXYzV|Uc(D}}ORju3rf^V%3lepUFwf+v*uQ6|?% zDDryv<4!0sovqVhJ0%Ql;utqVFomx+b?I{-x_orSOhYE>sx7jaT-o;2s{Hod5aNm> zvSOilVhw}ouNXIgeJ^nju7R^Xn8{h7Di(tdB?_`wt?`4nFGm=1hm6;az2nVAwwNl( zmM}wY$v|Nv&Zw33{la)@O^xAsvQ6jO(ecK0d;Cq+dzW?c*Eay~j=3`g>vh^_i>AR% z+(UxHxLc!saY<}Fx3|8C^-YZeTT8zRBq6fymAU>rtX*WZj!iSSRxtbip7*|S>Wx;u z^i9@}8}p>s7D`Z1=>UKvjr(aVIY6V%AUSO&+$w0;Y@PzJjxG=8SjZ7yA9r70B5cz-d$8j8vzXWWgM5JUtIUV}y#{Da z;g#LP%ag!m_T?Mbng(S1t51qOA7V)w^K2KJOj3(*=9gjIB{J%V&ORTevW9YIImWhi z1`?QF02nW2ipKCgv8F`oVKJ|P&onD=_ppgWl3*osCZB7!ybq2 z(1^5qOhm{VIt#uEs4wID;RzkG?L7%MHtAZbe_bEFNLmDUT@7(|f;79{Iq%s*dNQWo z!DB?dr^q?1{6xl2tU{%U_Yd)JT$hmB_d%l4m!+#Mz@6HhI_S5FA_4V^M@ zxhD3%y^zBsoz}(kyp;2^&gTY=;o=JP^oYlfh#|CjXDeab?nQY#tz{XmZc&~jL-(`m z?J18pu)L58z0)(kEXEY=5T*QB8e})^rD|!eiJv!Iu5GC`7W^A{J+j!n_;ks~+l;R= z9HY-%mscn!SyM!Ay#}ysWCgyx=Z6qfHZ4#FmwICD;=fYo`Px7nuQ|MjNDE1p=iGI9U z##q`b19NJ@X4gp*H&p8Mvs%lk8c9c>3MQ9KUuu6tmr&0m>YA^bK{iuu^67ANbngCP z;7adE4#Sfr=e}>Eba@H{KP7VNTT6a3T=4J3Bf4y-OX}GxW;mDCr@eh>(cA2y6+Eg? z6x2sHQ+4sgob?4bI5N~~)1}m@*KpiG6BO_Wn|uVq;aDK8brG;X7y~=2yAs3-Trwtn zvhNKL#chJ6Zr|^*O8WONE*cOco#7_#l8CA)I7ekeD z^&~RJNqD=Sx#-zGc$R#)&9Qm1XDo+0%$t!oOG>n7 zyE=$?l&43}LM134b-%WH)?Z*dKOy;eA7Zm>b{~o?knn(W%}dDj_Nzz(G^b;VGI4s(WAFOQSeGSUO<9vRr|;-_>yeknS|tj7+zCp9j1F0_8uz;u@0GJ2hw`%X zGodexDZY-t`8lY0cPDX_(%OAe4-eKLuYEvwd*IV-CRx7$Dc7NUp~v+CtVklPl3!QF zEoxC&9~xDs*_im?&T_t#lpBoOo2aw4MPTa*jHwS-TjatFIW%h=Nh$1LyH-lD{m-ff zyX*k!o`7A+*1cXLu=x?M+c!y5rnBFOQvM>SB5EAVpQ$g#RSbgz+1%QmGOEz0Fh^O( z)5(%h2bCL(sq-oXYlO6+iXCj0?d$GV-B7OCyj3tK>UvFQE9Hq0>Ax5?$W?0Kwx#mk zvtD{bns`fu5kMho^a%ec>5U2lHPe$2@T4;5wLQTWXSzmqCIXA15IY<$-TCM&+-@Id zSu%88;caI>!GOf+6X!b-=*afF6y(@fmZmK{``9&DP;2@O{ruH8Ytj9@D~`dmRVcW^ zTGX&(t&r%Xum?B=f(XQHw`1z8+h^Tpj$IVt__P}C3)O|;PjJsGL;lhb^F!W4KCExp zY|cgkV8cb6q{!RTOM9%c;oH!n-T;?lCk3mCuZ`aIN_H-txTle3YN?g6mS2Sw-oI_D z{4>Ww7{^bVBCyrDVI0v29ZoT?=4(jm>PB9(fLqSbxO@8u}E{$@+qnr zw6W-2i($l?vIe0*<7ndrKoEe~2%^?FdgDwu#BbhNH7XM~fcz@xT*+ciZ>i0wR7da76JyErM zsUH2zuR2&A7V=^`wEsOCM(Q*scXkh-;trg3Qu4Tz66X5XP7 zlUrrN(W~LNjJ$i4n^gr|7SW5u8r}4hF4G}%b@hDXp`ZEuE12`T&vj~TZ)Nyl)>fVz zxr&U94yMT@(P~MZlFb2 z{T(&-FPMZ;#J$!SQ|QxX(T-fH484kBBjNj~gO&T2kvFc9ntvxxrc85>ns^{Yer_Ix zy`x%p-MeYztd{WG9e>X03?+|~xXZyJBf$3_olCJ3&T=K(p7+es1D}MpWxrqDu=cS3 zjt5p`NzIr4olo|sp4(s1?7*2=>U;3DyZ+lx#)wa&8U-Stmnp*K!S9atbRY&~|3QHz#q>0eYO+n^@yN zqVWI6fe6`iKx_eP(Fyd2DCd6@?*97wpa6hHsHC(;^f!P1f8ON3|B3Sm(B6v*!C!{ zn}0el>|=l%|Nq77cphOr1wKFQn|6@~|H<|E_wLhOOdI6xmh@yqUmtvaTnDQLMdRE? z3q>D}*+){g&egucW7#@3dGx3D$?r2Nj0w=okxU{({Lhy3Z=V0ZhnWZ&9nP*mI>vh6 z(;nNGEWZQ){u5HDs*oe1D}tJF5#;@VB++TjtS)C6O4DNXkhkud!D*)X7U*s1?B1ls4G@^BR7S z?0M0&@=NPsOEdRHN^Pm0~qhC=ZCF{pOk5o**BGuDHH4xrE4hqNs8=dXV=bk@5 z^Z)DEUrP$Ob0%;h`1wD6g=oKqNdSBFKMo_6zru)?o2t9?KMbHFVoSg>IGXJ#+>%8$ z6$yAG`XagA{KFsL$Jc5yicE*tNwd)RIOi;pO=aE#3IEe4C>{q~t5kq7_dk9dyU2Lm z&iBAR|MUlkZ{N-IbF%M-^6~}MnWfDL4-qg`09m%o7#*qfDMO+_+V>r6^r6bDv!j*2 zAAElrRR8|MGqHD58Q$!&;eE|#d)Nj1M|{2l+Zft;M||AgU$X&NE^C(0$imh}sjkEM z0pyBR8jmgx84VBFx!3phQqtzeS@%4gQaIzed|X$l@Iy0hvibjO%={kufbWFKBAYV6 zO;*2=ecTNZ5&Qtv>dDT~5Ov~Me@GrbS>^3|xtZB~6{F6On2c2pAsb&7PGOapw3#kJ zJeNyR%2RZLaBbLOq0^E6!!@ky1=4NT2CySS4O;12mF$anx#~QlC%mH^>P??h%5v<= zWZ*4UX*+lo=>T+h{X(0(5w#IiNK~3-cgJ=9K7Zmw#6=IWRKR)+ubLBtyyY9^24AL+mBw+6! zdrZiz{Yb?9Ca+Yb)#_z2bBbs|55~sy?JTIlO&W`w_l3J7W94Y*{(`R*vq9rdPOv2* zkg7gIFT3Bh5o>wBJeBn{cGtgk#j-IHpciI;j(Z+3uX<42<@E(Ck3m)S6SRSvn0 zQ_Y8p53JuJ;1GZ|H}ZivE$|OH1!T#kqjg4y)1AzAXCq6zuxI{&%0r*9EBvi}f+vK( z^_+s==V(z_IfMFd;scO+x$Mu-0aGg44yB;8_1&xS)rX#5w)-4KcCbQ~yy0eU+qsu+ z!YhMiu!fiXF7S!wU-Gf$V**>Hg{--Cny+K$?%(It3e0yLIe8YnfnH~}XALof3%M7W zJ2oCeg-5Sv^4JS}VOcCLU0ZDI)>l(aumE0RDFDLebP0#tC8au3#sk*KGG*z!@0aH( zX??tgT2M(?f0KOa(nh+d+8&I1Ax$<8pP=;7rs6QY%MJCsyfjsTxIDHM>yf&NOymBh z9!hbgMf;H;7W4&%deu-oX_N31UwG;!!#6MdbqV6buyKXh3C?uOxu4vvQOFgA8|YxZ zF$a4z-_rA?HdyL}jMZv9nod5Rz;bf8R9WmwI_U?on1_Jv>Z&Jvm)sL0!}6Mq*YHR4 z6{@!wVqMF9U z6iqn%=7H5XP{2PLbQQ*UQ3%zoQA-s7!74YQ$4|GprZ2TxbgBT+;~tlS+@(DN`5y-t zAL3DydbQYSHMoDUsI-5}e`^}%SqA+v1GB6oraL?3u6{295t+JR$mTcxm-J9`MLU~MS ze3Sith~Wh|y<8t+D5#0!FJ`^iZP0A^>1mohxY!pIZ_V#2yN&n#Wce~3#g!1uhGp}l z?yn934TNaGvZfr-5OHjI_MXN&H4n>j+(c=y-Cqlst7|FkHRf6AG_5zcgf~&|TRpfp z@vh8*YqwmTHDdS<6N=yhUtNOmI@ z+?Ub3#BDy-7%lht)*3k$8leo9y4V{A#C#F_Gh~65c=!BmJ53M1rVF^Un=9pqIJw=J zywszjEHe6*SmT`+V^*ld)H~QC{|>yXOcY^1<*zZiJfx?-D^MdMWVy-iBrvwdtfo9?fRDOfoky^S zmvruyO9eZ8a~7O@jTgp@Bx&s)0o#YkvYVn>X*f82QIw1LbS*;}MfQA`+d5umr#khu zbX*D#)8B5c&L7{;jhd@)PjhbVZYCz6$0iZdfa?NqfY<7Ceesu*38I1-&PLSCOS4=d z`sXE-n+%&jL~SHfZpH*G=Z3n9PUr#Kk$Vopwg)O1LzR6W8KA~YBZh!TOH6)-n*d+P z#_!r@IA*Bt2jiqczU%IQ)`aX6|zOU@53{oN`skM=|NB5hvjD+iNil$A|mYHU5PcT{YqL)OPQq-nTUG`l67mnul{V|}S38ImK{cgUUC#Y-~Gi3Fg=E6LzzH z`kCrW=(cP-uhV%5jXSm9wOuF{c@oeImA*RJ{$`hr6vw2^zCePAG2nf3jT|Ss?ol&G zkQhje0xx_-Vb{0=Yp@r))iC6e2cl!O!H9xvYc4miX)hfp_rOE@NXJk5=Z1N;#gJZzhku%w{1osHEV%k}wfc zEe0V=KOh*iejR+g6KcZOm&lP1y+w`m(60>rCKoH}ne9K(>Wx?*j?Gb_@)ZKKUu}ar zY0lTPJ44rhe6Eh;vL@;K!k;Vz3JNLt_kJwQ8M(@2kV)*yIr&#WHerB1#>^P1wGep5 zTWwZbMhF^7xkQuA4r;sj*<$9!YkyQj#^WWk9l}1FdZn+vq0Q)Y0#k6v&<`#u3|@v~;G{w_%j(9tn>zG<8=Lpz5~RR=>U57r-G7g(Ymk9Kdm z57g;jxrd%}IoKQPrSK9$S5vJ|T0GAUP8WpUBna6yXvmfEx~(;k&{Z}??J?}>bV2Z$ z6c}jUj6M&4Za59&+VI-5ycYa<4s&%*zo)~VZ7+sKI`&?0`nGG2bVB|M}}&vIKH&g^?PfV3N?D5wEt zKrmcrZg`z;2;m*RSt|3`=5RRCy7ZcLYRm!Q%#@nP(|vP=mi>agXxIDXEY`aAyx5f( z8!_(r=Hi|F=;$uPT?YkwD}Qd>W>{;ec;>0g?s#o}?M&XOE0-G8XKcrbyZpD1p5B+&ufKCcjy`k$Le>#7$OfTPm3AFv+K8 zw$n5jB<4lT>k^P*j%MFugGxAmGdT6oC^LTW&biP_@L2LvRvx`t7g#Bsndd-X=G+NP zLM#yEi6L> zyw!%iY~v73GlWes=He2TCG5(?J=ekAk`f(fIHct+HZ|p`a!r8SboDW5oKB@{)m8(u zBbiry`o*Q@5u&J8#tUp&bV_obvm$1at6%&yj_M7PC1r=Ow;9I$VDes;#jC+Xcr;}T zx7ui)`|!?cd4=iCi%X||O$`c~F^aENwV{ksyP5_{@h@8x(?t-427?I($z|hT%eJE} z=>eZ&r`_S%;x@}!lxmwBQx;kt*ht1gd{5-bEJ4TlBm6w^26#$PcrUX0M6LU*CWkLh zd}om?LL=Z>;S8ZFxBdY>m6J1J9gSWpYB<@jti`eBz(v94$P4|7G!nbzi~ zNn?d*5x5p4!+azXXwWgv>-Nh2ea({>2a>&U6 z8~iL;t?-MmrNRvxuG8o^vBP%sz-Xx~k86Hi$zLJQcDNM~o7q}32qpjgIhwo&6I1tP>9vw;yD=}b`2Y1V7-}wg;1Wfy6&9AIaXinz0K_kBW{;z zgzMI@q4}X3KKBTBLeH7Y(D73yJk&ivsAX16B(zPpd_v#T0!ImPk~sT7Ew%zj$IqqYYkD<{c`IlQu|noDlZe<^{8D+%rcDl|n8qDbybkv4gTTVx{)wO8Uq{|d zLk7D|AJnbs+P!(xGs8eR?&rGb_#~~85~^3?j&4%wz#81Rqr-ODzP&jxvpo)5wO#y|u zOPC11_@VjOQM|!!U=q&|p#;=gU+O`{btQ4X;C z092R&;pjlsI^$Y1rB4!|?3KE3zdT>=N~^3G$1PLgRxgRkxkc|_zOqHlt@pHw-Ykmj ze)M|za)*KMm^=w*0i83TbOk_SEGu26d(W9FYwxnM*?$@*Z`u+%Qw(NWGwgC%#hv#= zjd@d+D$DCY&Z?M&FWxO>a5M$>2;*45_U0FgymMtt%(EIy2je7sberUSGB^yF4O&Y; zpv*)KYgocVh?i|`uqKcABBTRM`%6|ZlG2hM$SD%6=Uf@=-C9AN_&3^|xbGIBFmt%A z@qj46#qqlbOzyzxikeYv}bUu*Sy$|hSR1O>*ICori!H}>GaGzt0kE*x1} z8H9cBN}p>`3;(_lq_v5e$TF0VUFbXsN&C89=W_@XnU}XRi`B)#!KAt2EuE zZ|khSS`FdG%*NAJ0j$aRBL zM;tPfPSBqe_mRO0{<(Vd{X~6}jAR zNg8sf1qeVqEpX*P7DxTwO)^nTTU(?#0-m&;Wq{oY7{K`5l%RLcp9L1P>dbfQK&2U! zUKAE;-daG%7VDeN)8b9{cq7cYuVwfhzH%E}1`zvVp|e1lC9eh}-j^D=F?;hZnx8JZ zN!^3+u6rZHN>FV!kIZW2e3Vg-8&JoS;ytv_0a`V)& z1Z0n8`ac#(jorPVJ_QwY(3Rm!~>!vY~Y~af%oBV3(wAb-w z02{^tjTrZ6HVO`1YrNx(&rcQ1m)Pt?z04PNuD6`y>)`o48PP{()n&I%eVuf^7L1XM z)URntNYsN#`Ysq!rc_q*&R_Bcn40=vZ?;z)K8q=78Sx~i2BVMxdm`!=+#}|*9w(5*q4zR_N?xivp9l1 z9wg^=l;7Ig0+%f?7>s^}>A_g+L{S$oHM((T(H86B5iarZbmCB5_gRj$(JRU8nxB|9_Y$lL=P!Z;2n`v)hZXtSHW?nG&MySN2Fe=JTJ%Y9yaQC24Q01K)KKQNmJ zf>Qcw(<^e8mCucr>+7%A+=(Xps!~iV1RQq{&Yk)Q&~O$#JbU(lyj7L@s65DBZPiTU zE`xl1lv7j7Mv&_6uR`93viIO5dvMZgm%}lt@zqOSyeLZ{e@cnMqY%;hy z5@*ObR>G6HhjRC_KLaH{o$vBiT&KXbCQ0M#WwhrVfOPZaK6d~oH#I9nd}tk-gY?{x zX$17GriEu@?9N4M>@FvEUr32BV_o;0-0$n(94j&^a)HTT$P<}` z51QhD$FD9r*)$F|f#k*gvHN3NXJFf5?9Jg=N37C%;q{f4D^12NOdhePTK$rg%etECVIE*qq?bO<4{{*h-TDzBv|R!=mgV(?F`_N%+ zEqupIlg}^FW`7yIYc`k%h@eg}NV>M8+Vd!Qg_3pk#nTe3-9wpUq4WL_J~-m7e-^XN zscu7^FMKQWl;zpu-H95US9Yk?Hv19p@8i=(EZ@45fL+=jdcDQ;8E~wxjbt5ishrvS zu(*e&`eaQtO1jgvz1_Q6+o+n?1*l(|yvr<`bo3DTu?yR)FUMfCHFopjCl&}FG@D@N zN~_~h`1!RA%GzaQFa-nZzLLOWYu}wuQPtW9IB97MM%eAv>L^-ml=J&mprbs}7Zy~$ zHI)ktRne6)7NZPZ@1_+9MqwN!TwhMWUQhpOB z){>^m=sNb)#}OC{4u5e-v_D*$Nj1N>Kj(|s-z~o%WaXyR5i#|xUPzrG_|B%L-rvlY zH%JVN!)^Jh+M2(EZhc+ptLs;BTnX6-f4hI)QBRGoC`6cT##HQ7xK z()ymiD5>+l2dKCd>lUZJ1mZ=|!_@`&%w??1dMU#iCwIu1iEJa0VH|pg#oS}iQuodz z=E3|>kbHW3m;Wej!1*F~&-!1>dQ>)eZEHS=F0))3j5D}w$aqv5RG|iRn)j-V%#KIu zr_rK;+fuO9oApx5^RTE%d<+LWH+D}B?hy@lLuBK8XnLa00~Eym(Lv1p(VD*arUmUp zmQk%rs!ofHYIhrgS1bI_%__f2l*~_Wsu79M1-drH&jh==856Rojud__<5-;aEfOHk zvfR0MkL9hj_#3sPWc3U&?hKHp{iA=icG_;_+JZd4b4~|y8cYSnd`Dfz5G&XWSA|Ss z1Z~BAM+f$RZjAiILGObm^&#e;`Y*ktKE2oZpt0hdg|dte(*$b^(b~MyZqQZ`Lbyp^k>(D3!s|u{oF1_kSP1V?>!oX?6<(pfJ{mzT!38xvP(oOoI(yI5;T&X!^ zea1Q@`e3)oo<=}l8kAVpl?G&=y8USa;~}i`+8kzasyoeOn9JprZF9WQ=z_s|%M%kT zYd2QHgf*w8hbO^A#A6|PU9Fh-&m$gPgE;TsTkaQpC3ba^p^jU3UI6Xu=iF8AJ!}a` zpRQ-S6qDCE;r`i)86@m>Lo5_33`KB?YFT^oSfh^h#l1M?PMEs6*z@EFdfqdQv+>h$ zx2&o4!Z6;7bkbXmt3UwCO0K~#=huC9C12(tAl&OoS+D>;P5v0BL&Ko^z~dz#Ko$~E zO~_U9t25$1EqZV9Q}QjU;+t3@?*_X3a!YZnxdU=_zL0WLw4-d2=7Ldek*)7YKd-D4 zu?ayb-Bd?F-v3r19sQj7H6lP8fgy|Wb7b0lZjDuSv$5{e!So}jwXf-sAi|Qc=%!TX z_0(bsguZ>qtx6OVS(fS79{OYP;d)CGm>NgY5SXnvw1zwx+~szAp_&2$@0No}QFTwy zy6wEyux>w$zSgd{|KyA*_g;kAo=G*&mj;z`0c`H(W(76o31&RE!XKNvbs#ny3exLg zj-Frbx15r;J98eo7!qEt-abO~9~KC<&Ptk49%YHyg;1B&^{rkPe~fuol5K%cFpwt- zLsX3ys%mFu0-nc5@k1T zU(dnK%?3ygDiep!jBbHqH=klP?0yGHt~~y&%H7t8u~0L)pvU-ZCYL-(F_~2RnCxZX zxunNFN_oz6L-%cm^^=43Rp)yL|1NRY*oI z;ly<7UeK$XhXQ^#p9P~&17%{4P9OCcFgUpxt=mVuCdlUU#lHnwkOmcdD(SY z)fsO$1YGtO8C$Nfj@-Z%x!Ipd}nQ&LkQasRj~WoT`bMz z?DRRomo{du&A~6KM+LNjS5ax~66oz5Cku+l$e>eYPA|IPdj1aWw2E0bQ#l@M0n)_& zUyD8c$_r)U7Nind26-NF7l@y!6C;98vtQV`p z|J9WLSIb^hwoO_J>jZUcclSmyYjqxbpPmPX?Yb?*FS&-sg|dA4ee=$YYhiLgvn-CE zp-WG%8X0ZHbI^7#Qes1H8T5qTWiMft)6&h7Bzy5T&T{iW5ch13(d7UgmN~OgYht@v znl7Z@U`7mz;x5qa(N+CTL#B%w35PqM0o%m*P$w#)z4ORdk$V#3h)1mA@(jVNQ{&$o zHryS#GZDAj?>HPb$TM^?BG%Qni~TGQGW^{a)XdD|YfDl12rE=^oI#Hj0vo6b#p~gv z_Hw2lq%hf-J>3O`3b`)Qc6(am)a86wMhbX{a{n=hMmDCfmXxkg04fRA_4oN&N zH#L5UvBvq`Z;G_es(!Z4`Z5kn&_+FoK#txOdev(+rI`((axe~H3^J9|VG|})Iy?J} zb)tp9rcjZ`o`!haVQE*B$%ww;mPPcmMZ?dy|W%~;}MuMOnm6d2T%j+?#AcSUzd zwa+b(u#uhRx*PI*OqWyT!>UDk-tqqx-2q2l`bMTbLhQZzQQ0nv(UlLSyjp5mbaDhx zw0>^f}EgBQ=_>zjIQkV&t2t9ruagncuV{iC#VbksldTskgXBPe~7 zxMyorsA*|DLSO0E=`E69W?UD8qUy~TR8j>l8xmfr_VfLCnrJ}E`-Q{w$GeHo9klDX zm8J_G)rCi|QRq+s-41{ZR%PH`N|Vmz;OIF(9GO1u_A*Iny?P+&RRhlQBwE$K8}N1p zI7H{$n@6FqIJ=Bxo?vz1<5+zs0bPC&!he?u87eBiu z+9imFmnsA_a>kVUv9{u*Qt{|FInC7dw1f>q6@Im)UM0L~;4=Q~a!6u*dgM53Jnoil zqlrIZp-8c|YTj>0*oo?fqWZiu3WYJDf*$9eSPw2S2y?yj zZ5)7tIB!XZ4I!hBR=qUffuL5tbClH~JDRLp7rrzSd>CEcvN+V=d>wf7Jq>$$_9}ld~~=)E8%`=;pP0`7&KxGpq>S%DqU|4Zo^pX$5Rj zXgqwQh&bMq89=fTV&c`FmmZ`~RvZrW%GB@<%MLi~8djYLQ%>WZR1G`Y;hl+~wZ(YRRJj21(sAB0L|ZyDZaZES$ai~jKv+pUj_C(d}KAQl*UGAHmbzpB6xrGwin%fbB}b zK~%-;TjXxRUzN)Dp|w{xg-2b{*Gu@8b5Ej*G6@X4j=#(#;C^o)GA#U}ALt)hlI zRH~9A#44ROT~xSym_WdAt&1VvWAs8+@L(EO-Ru=3VDug!r(wi`OzfuV0_Rt=(D2pz zSd6BgT&@>upx(RkIIUj0Q$VM*idk$pcp4ddt$ODi1klpfa0$+MG>7(PF|N+lEnj6% z@9gE=qb@sdGgJ{JCq#NW^l;ght*)|+Tqo@-%o)zSpKA=gb&&OT1)S%>HR>zOqSsGV z-Sd{wTCLVezIaYzo?LS%el`->1vXN(1XPz_eil}=c{4O?+lu&(E*n8Mj_PQ`#8-}ilr885)R6Kpz@I4@bXArj zTMUm~03bmHFM+w%x$@vx5vp>w#;N35C@;pz2TJ+$7tM*1HjV7Gv|rGpvC4mzo8A-z z>%OKhKG?o7z4%eLpPSLcPMiDg7JQY;#ZZ?5z84s_xE+}k+f?G^?$Ez@6MAyq9%X^l z*GVuSy&d;`{2YoOAdP&Xjb{Pq*5_Hx)TzSoIe5Qa(F_?@&^Yex^PfxQXFM2p)RGzf zCYy6S09OLtU3|Vj5Gz>xu}Nvne#-(|GXW^DPg+Ovq>HV8QTQ^;Y1ma6AKl+WIx&&C zaLfP~h!S?|(%L>T<);*E`1ChaMNwG*Ed9aV;Wep0g+9M@QNqjhRYkgiNK$5Os=c>F z>zX=Xs(qN7{;cz!#V)Q}P5Xhng^&Z>V>f0j)cPd#-OcKo@WPRUymbf%`l!Sde#BHHQSdP z856%T{u-iDMPBPS8&< zh(;K$M}`#e@AfpFZ6H-X;nib#X+NL*2K<)(UCmsTcQQy|ZnbHT`kUanrwxt3#juZH zZqJ-p?S+fF{IE`yS1s^)>s1HG8&BgpKqX?P8J_h{&+Zr86SQaCN$Le{eQ?I0A5x+F zGn;)T>>&yQC7GX~Gkz+!Q{n(z5s zBv<%bggvL$-~_KCUKlESPb8`mOIq?1|(2=D8@`Kovz?k!Nu|A{ryw_ zBm=j)a7;3;w~AElY(Dx;qAYp7K;yr*x5d-8Yjd;)%_UO$*-Cdn)|sybH0aV6#nbr}3aU zi>gS-^$Avf7sHRhJL&wS2)4tH7g)UOBDOy!Wl zT(G9=(gdU5Bb|!Qj|qACCe*0&CIA`FawDV6++j=x-z9#}eD9&0&Fq@==i^l-g0k0+ zL8}1VOS|>%Om-iQ!Z5$6K&3J6hlUXcvZZ3DER(U@8~8wsu1C{RcSu%5-@^=)=)LHk z$XMzJu(SE^zb(25Kff`k3&LD1C14r}K9wi)JYB#iL9ue?mcRSjhikQ+-}NF($b%`u zlG|#P2#&Qy8$D5O4WoU$Bfzk*=%pW5eBG0w@zz~EO38TTJTZR87fP#=F`5%{me^0w zFYy7L#Ud;VXH0O=hx}}pWB(Tn>H)$jalU_dwogfTtF%m|Uc-&vJl{pZ8Pzs&cc2i= zxWDONw{+ij@2g>Ug|gY5Lg4<;zK#Xk%uBM@WyIb+5biE(%#%QgO=rVvmr|Xr`2`%X z;N#5@*4b9@;2_7ElcGS6<1ES?wj@?u2;fA&O?EgxRj94rjY)|^%^7~<`R#`ISU}-D zbY$wnRL(7MZt&LY{b0JZAh#{AP(13`qP!sY!=v>|*C`W3?R3wvRaol<)0>F%*JPe{ zu!Eh?gQojOF422E)g%adzzTG7_S5ya|AtsS-we7-_o33kY-{3BrH$p+PpJG+yY0s- z13NQ9um;I!`VnDjFiFFc|(pk;OX40 zGORQPLV|1JK<`o*kRnC+Whxl1dB`5p!vP@cPAsHJS7G;UZ%&iRl&P~<3-18v+X1~O zqFMNS#b?TFBj~n_;`3%VjB~k>ufzdNvnSZ0FqeaWu}iw=v!=aB^wfhA_W{zEF2fst zvbM~AR83z|@AB^F<9piGGDq*F=M^}-nADo<4p|&x6*D$I`lzX_dmI$K=nLA{D6Rlm ztb?#f#ik^g(#BfKgsSsd^duf!mfs0Y(zW~kPmXRxdp~Dj9ZD?pbAoe<*!LwP2BN1i zV&Pvr;JT|63xrSLaN*EiCtGKfb@7q5)0Ya~$C>htW8D5>WuIH;9Lp(@8dW}#wXEbT zzuspinf9Fez}MtG?d!Z~gn!_1Jw2jQukgzAfj$MBMFas}vrDNY%^r3Q(lchz@Zu+w zY~p8bPFjF__jBhFwOA4o3LduDU6OMYd@Qg$U)XqGHU7WKt|IBQG1_Q@S^;d=LyRf~ zBCPska~=3Z8K1Jb(hU~pdBp@vI4L>;Bqyo7B+pWFj++i|(7y^N-HpZ-s67wHSVOQV zQtL$RU;S8%PO4<1&tMF)jke(jfQ__Voir^PPee5ke40V=ieHLiWS?<;EHB5hpnOr` zWiE?5yjR$BeS&J^>L3_9PRsLXD*kVP=u%V;03S^<3P6uRpWqTVcJCg1SnxN7VT2G? zmHxlF&N?cpwg2KsNT*6lm(qwJjUe6KDGJghF!Ys1grP%VMndV9?rw%|X&7Jt$)VwQ zyx#k+_1^dX=C7GqtOaMzVb1s2&)%PH=3~(9dmbxJy>3&Y(NvJYt*7f1u&zy0YP~*h zu+(>phFLuBF!7~X$Leq3+JDYaAoCwv!r{_oS{t&rUW*KcK7h54AsAfa(QUp`D_oOp zn_B8x*zt-cNlk{WKb2859fSuVAe8x+xElShYVbEtOwe?C8OEC8dehMu8jLk=rF?_K zJK8GiVqK-4c)&n{k&R=k7{8ol=>1tE&AXS-`b28rY#-V5GV8X>j9b0 z-mir6j}BV4Nu6hj?Tm;fFUisOy2}%H8D}S3w4cb&p>lK)-v-vpn4Fi0-%VzQ88`U9 z`uyCH4hS8;U&;v3Ry$v~h#V`o4iFmzuv4#@+Euk-sW-peGRyv~z|m6f(@9%%xXi{7 zf_AK-y+AJ%2UPh|IhtCG#Z!Ar(6V>dxL#Xfdn`X_y`SPj9c(39@=vQxE78lXQz^D} zub(A*=r*SN{7Qvm`zJfsp~Iy#N#z%&A~Fy{>`pIKCqn9CiX7!wV{!jGYN&*g_|+=a zFW*IuVycw*jX5a&_1W1{z(9+|Q;e8re*n&JB4OZL2@=n)SDJr9{dB@J^phmMFQRn* zvJ&t`4t=@oO6m^xwe%NQfj|810;RjeUhoOL|+$E$d znm3b~U3Suu(tP~yag(kSUGWh&Lw4v%B9j7%(&c-bSEAk%VN~K}HB7$C_uL(An40_F zQYW1Y?V!1#1E=X7^8vgH@yvhq`SuKQ@|_p~=AS$pHPmdNC{HzA7_iq`#R5vD_x|SJ zSHgl8aP2Q?)i8QMl|%8iF#v?ae=gwPPoz|q?=f#$!90G3e(q1=uWWwf{XFb)*iDoq z+#eNyrX~P0bqs)Pm%D2N0e{5bqYdz+mJmD7X7b;tSAYMM6MDDrbAytlaPN0>1IeYm zW;ISeBFZDDcMDDI)-aP8qkx-7+GZyW&WD=nenb#bFAXPY25IigRnQBkA2>TH(=K#Jh5P>(bA6kwl@LUjryM9Q}?cCD(j2!LN0>T^yo94|r5?wVWsuq0cafMt8 zJQ!_TD9xiG>v@HaX66An1_Qg&fSqK+9EjQ{GDZKzVOS;28SXT7>eVKgOz=k|#R8lP z9tNl2P(HVVxp~Y*_a6uPkfuT{RN;Uj@Xy2X1fsSc@HWo>`Uw6$&|hzkpu55cx#XfV zMi>tB2wCLsOf!O5Djj+pQybnz?Edf^Au%5Rs>0Y6`7ps6>d4WHpeeE#gnbLh?#w>c zoqnSbuecI;k@G4|kI5#ENw?`K9e5jXXC?rhFnu=6!jj99@53AG+~lL=*aosEX#`Y$ zOcBM2U%&adyXeze&~rWn@m6--=(U{`dPH}rnj&g~+{OJFX~%7nmG|5U84N%fM5SJY zms=*bwiun(xeqYsu*wseRpghoo6Ob34N~yco_b~K$hmWRejO_0ECMO2=+g%} zQ`d*4%?>FsEN@GdHX5Ltb*Ga1`#>LJza9523~#ME)EtoU%=!wds5lP^;3@Qe!Ztv1 zC0{eY(a5Lr@VL=z;|dBl3M4y+!_t&?CJVR#`I>)dVG5WMV}ZrmSbHw^A<> zd`*YeU%Zr#MXJ&P%TRoE*b&_I;DFfg*2@i^0OUF*u6ALg`%PDG6F=Jj0Vg~=9Z;a% z5je+$GEO%wnezglX6i$BWA$Hq2Eg!OQ6)qF?D{@|j~S9$@J$rBYz|hl`=!TWp{zu7 ze%+YDvw}>f{qY>GW{LV}Q&UYUE48_W&MMAzl?&(0PQl^g-U z6rcPHKz5KmSFCsExpCg7rMaD1p;@H}bRTxrxaxj2e;zur@?+6{kKfFl2Np>&Uc{<; zW2jpQDHfzfC{$MsA>-OpEk@8SZxKO}hSq+PuG5&PEMwN`0wRiT>@L0Sm?Xvq{8jYltOstRnyYG4whPLc8^;Bkq#oqBdWmgi92G;(sCMd<2`6cvzQvdPW({n zS#aIQ4Mim!W^~FR@(HKjCk8Dxg=u=Mjo$Q94ht0~am-3=z+}y9azeRkc-H(XQU3j0 zG0k*^dk>eNiEL+qSwrYN?@Go(70i5cGu_C{_-ZA)=k4C*kY7iY zM3MiKm*MGmhzcyfWl68C176N%F~dod@SeJp0Jzw%o5vqe-U&0U_U-y8qwje-iV-^= zX~mFyipl_z1y;)~Fx)ok^@s07kbL@)+hgvQDp9$$uE^Ym*LdMsM3`bQ*r&bk(Syf8 zF9nOx`}JD!pKsZ9V?S2p_$Hyl7Qk8FiiUrt)OI&ADCKh^u2 zO$U(^IKdfCD2xw+o8lE6oe$d}IIZJ{nO&bBu5WkayHj1G@q&)0GLl+93j3-8RoINb z@}hEVdPL!=-3%R0`+-aAM~Q`2SWVqRmTgQaW6Y6tdv0^Bo%cn}Qpi!bAd5ZIP75)Q z3a0@vhlWI%l85w3X&r7rd^v5vHwKAdHPTk{<@?~frKIACe5|+`mX>QC>r9C89}3Ko z{zfGd+?%!fmRY@kw0?^INty;aX$~b*e%T7cCHJ3l)P=?0REGI@92{r}m5K)dP?NE} zb3*Kxmj}O)U;^$qg_Q_B9nsO2^7dO7u1MQ#zNE^seje^Y_Wu!--+$iPH!4@?Y=vN zRyifB^a^*w#ja7)A#8$X#(eA~LRK-a=!+1y{&j=76iTN&*8b0?aTrN$n`Pt?GE_3% zcdyHu8T?rph428#w?6>L$3Iv#o-5=^Z?IK z0%nwR)k;-m28+I|3;N^kaGm?4ZsppU8WKJ66P?g6Ubns3vbb z-}0%5{|ON|TiA(9r@d+$bM$OBmo~ZLt75N5mt{1Gk&BAH|L2Ag4Py_Q$pB6U)Yi2o zz;8H*O9oX^>u|$vI|u$Pa`KK0qn)md14TNW^#PspYx!sMIIg{*3d4vav!QEAp9TPq zRO>5fTgIf2KI5=uevYpTHTnKi1e61r_+Z`b3(3eLtEKL>M0;$Z_Pn4_JSg!*h|8c^ zaWmfslehk7OzdT|7liu~v=)NR3Rsx2RZf_q0sdpcstoQ^*qN3$YR?>g+G!`L^5(hO zcz1oq4K3Cf_M|jKm-91wH1i4E?dUs&Hwor2wnXIOyNkF<<^tFNF@GBdG?wgcTKdP? zg77Np7}K&_7*q!K!bcNm|FEG3|J}(>4A3ov9C!b1Me-}2NrZ{@GJN}X6Y&hxiD~%7 z%X&i4>*tS}8&e@sLzS5oAU~tX%RJLgBt?a~X|hp_wL+0KJZ$1qOw`(ZA9A|(*luv2 zdOmMtf=f*fYnhz3E^@^JH}>ITyCA7F&{@d?lAFUY4IbsvC@Mp;c|^!d=m+v0UHwA4 zodxwS)bym)e+rI0rS zDSpDu^Z?`7nSL*059SetvKN-kVvSz!D8URZdR;ien-9K+W|k7CuQ21d5Z{lj4=7c= zY%Kes9+9%4n5=zs{~gOg%HC)`r^i$7ja2UpwzoK5o-er(`Z|d(I2!vKkQ6yT*&8*9 z1s+#h!f6nuEk~<-Q%qrid$r%_$6`X?cyrRcV#3J@&twMmEq2#&xbupd1o8eJu9_tX zST`<$>O~$4OFfcm=%71qE|fBq$dk4vmx|TXyq@>i&t{c0cMXhxQR(`)zg>n8~_~fWI@QKayJgikZcfdX2q zIP`WmORqWyGEN334Gp4nbnBB>AP+tb)afZ8@pNQ(wSVdRDG%&XmM6}AZh%6(q`WhF zR=S4hH}d;L6OelZ>48Ij2W*M>QEziqWgUEx{~LtJu?gRU3sY3*48S z8mH@?DArNY>o^`EKdPieoX9F^eV-zVYz)bgnQjTUwH1du;43iEXS5y(`m)W6YO%#L1!lL*P3?+eQV{hd+6i;(MA4RU(zK#0I6VS^v*{TjW69i zSBp#|63W1<(~at}1~j4c&+p3D+9vW(Kt4!nXM4-i@8F2CGS&N~y{=zPAYoQ5#Fg|V zZ~D?lwHu0Y*|?3~6o<+o0mxp}SqbsX2yDH>9g!ojoPi6rRhthOdE`N!Swu`aliU_L z7oLQbiBDRq8{DW8_okk7cYw{M_VW?BJI<9|x2&K&Yf#>OdLqc8YCDNE(m})nSNcdP znHynTb5Jk)&R%Vvc=HgS1#*!DVCnirC?m_!!i*mfmPN(P14xDE4MqH-V-_GQ=eR8C8Ldx`y;B-rP!dQ zxL8`{k&FCt!c{t;rX|^iaCfRy)G6ZB3NN?nW;SB?I0cAS=4N7eRR)za_Cy;E`9);v zW~XrF^`WbJoXjW`&MooX^w6%*)PK{;J5N1CHStN~2)xBI0mHFZ&Vu;YjpRx;di5Fj zz1sSCM%%}w4jW(YdRBl)4neAW`oEJVMC1UD>4VE__Wws1_#mi?0`Y?7srN1Uo>day zUT-IGQ%AIF5w2oOORWN~6r$ooDXePH!|8=Ns7l1RNP_1k{zesINOgXg z*E-t1-T;ucuaP3|a~E^Vb$**uUYvL}cBgS`7EX75awK9g>Ru++uJho98vW&{PriLd zIyCy>ug$RukDGz)A5S9Y?D$A`nq+6lY=?G0)_%sJKq%(>d=eRSdOv_@lK+a$QtCrr zn?rZV%N_7n8@nlF-@V=y1QSX-ANeX-=X}D>d3PL(3WL+xZcbB4a;Yh6TFt(C&k}1u z;ldD6i5yS}eWF!Yl_6D~##S$_FOBem>c6)z($;c>}3#>YjE)+B@ z6m2=v@qHd_1KC~|Kl(I3-y?ld1n%R2cSxD0sUtr?U~~9J9OXh5?ZIqNA5-d8iKzar zDCgNpi^&ggve}J2y`xAE0^1Z-_N3FL(iQVvbRSs@JjG~h`zY((%VG(eoEr` zU?wiZ+AqlPF7aS+s9ser1z6=VqqRPk={n@reH(}K1R@fk5m7~aB@{x?J%e=-RaPIN zErsv0=)zj+({6VwFv}wXccN&mEtQ%Z*bKLw! zn*k3K%nujib&KRBQ-PgSD^x<~+>utS9zU&+N1i3h1(dA+2a6{Z|E%smk(XQ*Vx0OhoZuV*f|6jJyG=bBCgxslv0n)fILNprJ#EX z3Y16k+-?_O<;e7gP!BTU!PYP;OqBhiNpGr+Uvydbr|Z%A-3qR{aXYR+`MEU*IBKZJ|Yg1vQqY~|3^o76T z7+k1+_0=^}*gm+i=`T2Pd0d}}L}UWzcl78BXG!qjOAa%LaXm$2K&;!$xVWB0?z|@= zmn?jsEGwh~qX`?Ta<-c#_7=`PTB0_iRCAb1V=on7xPVOj(^cHNVQ2-;p~>Wklg<|?>U z=O&lDcgJB`ty!4@1if`nKTaa}BY|)>N%&wl9nFiPtGs@v41GP5#)tZX>suh2At8*) zP&tl9bBkpQ7PJ&zI^-GXih8I_3wH0D;n9Y>*j3(4vm02)2}c%BU_R57tO|Q=QA%OW zbS1SrCs=(hL@Aj;?6K=Gw^2EZ)E#t_E1|`4Y3dXSlL-zbc$C}TzRao;#}qi@tK)Z{ spiqH6v!Yj=J5yM^=Xc5nE4}sZ9+BUW6Il=<2L*U2$f!z}NSO!zAG(3+od5s; literal 0 HcmV?d00001 diff --git a/docs/images/gitlint-packages.drawio.svg b/docs/images/gitlint-packages.drawio.svg new file mode 100644 index 0000000..6098e3d --- /dev/null +++ b/docs/images/gitlint-packages.drawio.svg @@ -0,0 +1,351 @@ + + + + + + + +
+
+
+ + gitlint-core + +
+
+
+
+ + gitlint-core + +
+
+ + + + + +
+
+
+ + + trusted-deps + + +
+
+
+
+ + trusted-deps + +
+
+ + + + +
+
+
+ + extra_requires + +
+
+
+
+ + extra_requires + +
+
+ + + + +
+
+
+ + install_requires + +
+
+
+
+ + install_requires + +
+
+ + + + +
+
+
+ Source Code, CLI entry point, etc +
+
+
+
+ + Source Code, CLI entry point, etc + +
+
+ + + + +
+
+
+
+ Click==8.0.3 +
+ + arrow==1.2.1 +
+ ... +
+
+
+
+
+
+ + Click==8.0.3... + +
+
+ + + + +
+
+
+
+ Click>=8 +
+ + arrow>=1 +
+ ... +
+
+
+
+
+
+ + Click>=8... + +
+
+ + + + +
+
+
+ PyPI package +
+
+
+
+ + PyPI package + +
+
+ + + + +
+
+
+ + gitlint + +
+
+
+
+ + gitlint + +
+
+ + + + +
+
+
+ PyPI package +
+
+
+
+ + PyPI package + +
+
+ + + + + +
+
+
+ + install_requires + +
+
+
+
+ + install_requires + +
+
+ + + + +
+
+
+ gitlint-core[ + + + trusted-deps + + + ]==0.17.0 +
+
+
+
+ + gitlint-core[trusted-deps]==0.17... + +
+
+ + + + + + + + + + +
+
+
+ + + pip install gitlint + + +
+
+
+
+ + pip install gitl... + +
+
+ + + + +
+
+
+ + + pip install gitlint-core + + +
+
+
+
+ + pip install gitlint-c... + +
+
+ + + + +
+
+
+ + Use strict dependencies (most users) + +
+
+
+
+ + Use strict dependencies (m... + +
+
+ + + + +
+
+
+ + Use loose dependencies +
+ (at your risk) +
+
+
+
+
+ + Use loose dependencies... + +
+
+ + + + + + + + +
+ + + + + Viewer does not support full SVG 1.1 + + + +
\ No newline at end of file diff --git a/docs/images/gitlint-packages.png b/docs/images/gitlint-packages.png new file mode 100644 index 0000000000000000000000000000000000000000..00d3ec12a9ade3df8537fa7721d0809f6d765e7d GIT binary patch literal 51975 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 0.1.0 | Title length must be < 72 chars. -T2 | title-trailing-whitespace | >= 0.1.0 | Title cannot have trailing whitespace (space or tab) -T3 | title-trailing-punctuation | >= 0.1.0 | Title cannot have trailing punctuation (?:!.,;) -T4 | title-hard-tab | >= 0.1.0 | Title cannot contain hard tab characters (\t) -T5 | title-must-not-contain-word | >= 0.1.0 | Title cannot contain certain words (default: "WIP") -T6 | title-leading-whitespace | >= 0.4.0 | Title cannot have leading whitespace (space or tab) -T7 | title-match-regex | >= 0.5.0 | Title must match a given regex (default: None) -T8 | title-min-length | >= 0.14.0 | Title length must be > 5 chars. -B1 | body-max-line-length | >= 0.1.0 | Lines in the body must be < 80 chars -B2 | body-trailing-whitespace | >= 0.1.0 | Body cannot have trailing whitespace (space or tab) -B3 | body-hard-tab | >= 0.1.0 | Body cannot contain hard tab characters (\t) -B4 | body-first-line-empty | >= 0.1.0 | First line of the body (second line of commit message) must be empty -B5 | body-min-length | >= 0.4.0 | Body length must be at least 20 characters -B6 | body-is-missing | >= 0.4.0 | Body message must be specified -B7 | body-changed-file-mention | >= 0.4.0 | Body must contain references to certain files if those files are changed in the last commit -B8 | body-match-regex | >= 0.14.0 | Title must match a given regex (default: None) -M1 | author-valid-email | >= 0.9.0 | Author email address must be a valid email address -I1 | ignore-by-title | >= 0.10.0 | Ignore a commit based on matching its title -I2 | ignore-by-body | >= 0.10.0 | Ignore a commit based on matching its body -I3 | ignore-body-lines | >= 0.14.0 | Ignore certain lines in a commit body that match a regex -I4 | ignore-by-author-name | >= 0.16.0 | Ignore a commit based on matching its author name +| ID | Name | gitlint version | Description | +| --- | --------------------------- | --------------- | ------------------------------------------------------------------------------------------- | +| T1 | title-max-length | >= 0.1.0 | Title length must be <= 72 chars. | +| T2 | title-trailing-whitespace | >= 0.1.0 | Title cannot have trailing whitespace (space or tab) | +| T3 | title-trailing-punctuation | >= 0.1.0 | Title cannot have trailing punctuation (?:!.,;) | +| T4 | title-hard-tab | >= 0.1.0 | Title cannot contain hard tab characters (\t) | +| T5 | title-must-not-contain-word | >= 0.1.0 | Title cannot contain certain words (default: "WIP") | +| T6 | title-leading-whitespace | >= 0.4.0 | Title cannot have leading whitespace (space or tab) | +| T7 | title-match-regex | >= 0.5.0 | Title must match a given regex (default: None) | +| T8 | title-min-length | >= 0.14.0 | Title length must be >= 5 chars. | +| B1 | body-max-line-length | >= 0.1.0 | Lines in the body must be <= 80 chars | +| B2 | body-trailing-whitespace | >= 0.1.0 | Body cannot have trailing whitespace (space or tab) | +| B3 | body-hard-tab | >= 0.1.0 | Body cannot contain hard tab characters (\t) | +| B4 | body-first-line-empty | >= 0.1.0 | First line of the body (second line of commit message) must be empty | +| B5 | body-min-length | >= 0.4.0 | Body length must be at least 20 characters | +| B6 | body-is-missing | >= 0.4.0 | Body message must be specified | +| B7 | body-changed-file-mention | >= 0.4.0 | Body must contain references to certain files if those files are changed in the last commit | +| B8 | body-match-regex | >= 0.14.0 | Body must match a given regex (default: None) | +| M1 | author-valid-email | >= 0.9.0 | Author email address must be a valid email address | +| I1 | ignore-by-title | >= 0.10.0 | Ignore a commit based on matching its title | +| I2 | ignore-by-body | >= 0.10.0 | Ignore a commit based on matching its body | +| I3 | ignore-body-lines | >= 0.14.0 | Ignore certain lines in a commit body that match a regex | +| I4 | ignore-by-author-name | >= 0.16.0 | Ignore a commit based on matching its author name | ## T1: title-max-length -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -T1 | title-max-length | >= 0.1 | Title length must be < 72 chars. +| ID | Name | gitlint version | Description | +| --- | ---------------- | --------------- | ------------------------------------ | +| T1 | title-max-length | >= 0.1 | Title length must be <= 72 chars. | ### Options -Name | gitlint version | Default | Description ----------------|-----------------|---------|---------------------------------- -line-length | >= 0.2 | 72 | Maximum allowed title length +| Name | gitlint version | Default | Description | +| ----------- | --------------- | ------- | ---------------------------- | +| line-length | >= 0.2 | 72 | Maximum allowed title length | ### Examples @@ -59,39 +59,43 @@ line-length=72 [title-max-length] line-length=120 ``` +------------------------------------------------------------------------------------------------------------------------ ## T2: title-trailing-whitespace -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -T2 | title-trailing-whitespace | >= 0.1 | Title cannot have trailing whitespace (space or tab) +| ID | Name | gitlint version | Description | +| --- | ------------------------- | --------------- | ---------------------------------------------------- | +| T2 | title-trailing-whitespace | >= 0.1 | Title cannot have trailing whitespace (space or tab) | +------------------------------------------------------------------------------------------------------------------------ ## T3: title-trailing-punctuation -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -T3 | title-trailing-punctuation | >= 0.1 | Title cannot have trailing punctuation (?:!.,;) +| ID | Name | gitlint version | Description | +| --- | -------------------------- | --------------- | ----------------------------------------------- | +| T3 | title-trailing-punctuation | >= 0.1 | Title cannot have trailing punctuation (?:!.,;) | +------------------------------------------------------------------------------------------------------------------------ ## T4: title-hard-tab -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -T4 | title-hard-tab | >= 0.1 | Title cannot contain hard tab characters (\t) +| ID | Name | gitlint version | Description | +| --- | -------------- | --------------- | --------------------------------------------- | +| T4 | title-hard-tab | >= 0.1 | Title cannot contain hard tab characters (\t) | +------------------------------------------------------------------------------------------------------------------------ ## T5: title-must-not-contain-word -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -T5 | title-must-not-contain-word | >= 0.1 | Title cannot contain certain words (default: "WIP") +| ID | Name | gitlint version | Description | +| --- | --------------------------- | --------------- | --------------------------------------------------- | +| T5 | title-must-not-contain-word | >= 0.1 | Title cannot contain certain words (default: "WIP") | ### Options -Name | gitlint version | Default | Description ----------------|-----------------|---------|---------------------------------- -words | >= 0.3 | WIP | Comma-separated list of words that should not be used in the title. Matching is case insensitive +| Name | gitlint version | Default | Description | +| ----- | --------------- | ------- | ------------------------------------------------------------------------------------------------ | +| words | >= 0.3 | WIP | Comma-separated list of words that should not be used in the title. Matching is case insensitive | ### Examples @@ -102,25 +106,28 @@ words | >= 0.3 | WIP | Comma-separated list of words that [title-must-not-contain-word] words=crap,darn,damn ``` +------------------------------------------------------------------------------------------------------------------------ ## T6: title-leading-whitespace -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -T6 | title-leading-whitespace | >= 0.4 | Title cannot have leading whitespace (space or tab) +| ID | Name | gitlint version | Description | +| --- | ------------------------ | --------------- | --------------------------------------------------- | +| T6 | title-leading-whitespace | >= 0.4 | Title cannot have leading whitespace (space or tab) | + +------------------------------------------------------------------------------------------------------------------------ ## T7: title-match-regex -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -T7 | title-match-regex | >= 0.5 | Title must match a given regex (default: .*) +| ID | Name | gitlint version | Description | +| --- | ----------------- | --------------- | -------------------------------------------- | +| T7 | title-match-regex | >= 0.5 | Title must match a given regex (default: .*) | ### Options -Name | gitlint version | Default | Description ----------------|-----------------|---------|---------------------------------- -regex | >= 0.5 | .* | [Python regex](https://docs.python.org/library/re.html) that the title should match. +| Name | gitlint version | Default | Description | +| ----- | --------------- | ------- | ------------------------------------------------------------------------------------ | +| regex | >= 0.5 | .* | [Python regex](https://docs.python.org/library/re.html) that the title should match. | ### Examples @@ -131,19 +138,20 @@ regex | >= 0.5 | .* | [Python regex](https://docs.python. [title-match-regex] regex=^US[1-9][0-9]* ``` +------------------------------------------------------------------------------------------------------------------------ ## T8: title-min-length ## -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -T1 | title-min-length | >= | Title length must be > 5 chars. +| ID | Name | gitlint version | Description | +| --- | ---------------- | --------------- | ----------------------------------- | +| T8 | title-min-length | >= 0.14.0 | Title length must be >= 5 chars. | ### Options -Name | gitlint version | Default | Description ----------------|-----------------|---------|---------------------------------- -min-length | >= 0.14.0 | 5 | Minimum required title length +| Name | gitlint version | Default | Description | +| ---------- | --------------- | ------- | ----------------------------- | +| min-length | >= 0.14.0 | 5 | Minimum required title length | ### Examples @@ -154,18 +162,19 @@ min-length | >= 0.14.0 | 5 | Minimum required title length [title-min-length] min-length=3 ``` +------------------------------------------------------------------------------------------------------------------------ ## B1: body-max-line-length -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -B1 | body-max-line-length | >= 0.1 | Lines in the body must be < 80 chars +| ID | Name | gitlint version | Description | +| --- | -------------------- | --------------- | ---------------------------------------- | +| B1 | body-max-line-length | >= 0.1 | Lines in the body must be <= 80 chars | ### Options -Name | gitlint version | Default | Description ----------------|-----------------|---------|---------------------------------- -line-length | >= 0.2 | 80 | Maximum allowed line length in the commit message body +| Name | gitlint version | Default | Description | +| ----------- | --------------- | ------- | ------------------------------------------------------ | +| line-length | >= 0.2 | 80 | Maximum allowed line length in the commit message body | ### Examples @@ -180,38 +189,43 @@ line-length=120 [body-max-line-length] line-length=72 ``` +------------------------------------------------------------------------------------------------------------------------ ## B2: body-trailing-whitespace -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -B2 | body-trailing-whitespace | >= 0.1 | Body cannot have trailing whitespace (space or tab) +| ID | Name | gitlint version | Description | +| --- | ------------------------ | --------------- | --------------------------------------------------- | +| B2 | body-trailing-whitespace | >= 0.1 | Body cannot have trailing whitespace (space or tab) | +------------------------------------------------------------------------------------------------------------------------ ## B3: body-hard-tab -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -B3 | body-hard-tab | >= 0.1 | Body cannot contain hard tab characters (\t) +| ID | Name | gitlint version | Description | +| --- | ------------- | --------------- | -------------------------------------------- | +| B3 | body-hard-tab | >= 0.1 | Body cannot contain hard tab characters (\t) | +------------------------------------------------------------------------------------------------------------------------ ## B4: body-first-line-empty -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -B4 | body-first-line-empty | >= 0.1 | First line of the body (second line of commit message) must be empty +| ID | Name | gitlint version | Description | +| --- | --------------------- | --------------- | -------------------------------------------------------------------- | +| B4 | body-first-line-empty | >= 0.1 | First line of the body (second line of commit message) must be empty | + +------------------------------------------------------------------------------------------------------------------------ ## B5: body-min-length -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -B5 | body-min-length | >= 0.4 | Body length must be at least 20 characters. In versions >= 0.8.0, gitlint will not count newline characters. +| ID | Name | gitlint version | Description | +| --- | --------------- | --------------- | ------------------------------------------------------------------------------------------------------------ | +| B5 | body-min-length | >= 0.4 | Body length must be at least 20 characters. In versions >= 0.8.0, gitlint will not count newline characters. | ### Options ### -Name | gitlint version | Default | Description ----------------|-----------------|---------|---------------------------------- -min-length | >= 0.4 | 20 | Minimum number of required characters in body +| Name | gitlint version | Default | Description | +| ---------- | --------------- | ------- | --------------------------------------------- | +| min-length | >= 0.4 | 20 | Minimum number of required characters in body | ### Examples @@ -226,31 +240,34 @@ min-length=5 [body-min-length] min-length=100 ``` +------------------------------------------------------------------------------------------------------------------------ ## B6: body-is-missing -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -B6 | body-is-missing | >= 0.4 | Body message must be specified +| ID | Name | gitlint version | Description | +| --- | --------------- | --------------- | ------------------------------ | +| B6 | body-is-missing | >= 0.4 | Body message must be specified | ### Options -Name | gitlint version | Default | Description -----------------------|-----------------|-----------|---------------------------------- -ignore-merge-commits | >= 0.4 | true | Whether this rule should be ignored during merge commits. Allowed values: true,false. +| Name | gitlint version | Default | Description | +| -------------------- | --------------- | ------- | ------------------------------------------------------------------------------------- | +| ignore-merge-commits | >= 0.4 | true | Whether this rule should be ignored during merge commits. Allowed values: true,false. | + +------------------------------------------------------------------------------------------------------------------------ ## B7: body-changed-file-mention -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -B7 | body-changed-file-mention | >= 0.4 | Body must contain references to certain files if those files are changed in the last commit +| ID | Name | gitlint version | Description | +| --- | ------------------------- | --------------- | ------------------------------------------------------------------------------------------- | +| B7 | body-changed-file-mention | >= 0.4 | Body must contain references to certain files if those files are changed in the last commit | ### Options -Name | gitlint version | Default | Description -----------------------|-----------------|--------------|---------------------------------- -files | >= 0.4 | (empty) | Comma-separated list of files that need to an explicit mention in the commit message in case they are changed. +| Name | gitlint version | Default | Description | +| ----- | --------------- | ------- | -------------------------------------------------------------------------------------------------------------- | +| files | >= 0.4 | (empty) | Comma-separated list of files that need to an explicit mention in the commit message in case they are changed. | ### Examples @@ -262,18 +279,19 @@ files | >= 0.4 | (empty) | Comma-separated list o [body-changed-file-mention] files=generated.xml,secrets.txt,private-key.pem ``` +------------------------------------------------------------------------------------------------------------------------ ## B8: body-match-regex -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -B8 | body-match-regex | >= 0.14 | Body must match a given regex +| ID | Name | gitlint version | Description | +| --- | ---------------- | --------------- | ----------------------------- | +| B8 | body-match-regex | >= 0.14 | Body must match a given regex | ### Options -Name | gitlint version | Default | Description -----------------------|-----------------|--------------|---------------------------------- -regex | >= 0.14 | None | [Python regex](https://docs.python.org/library/re.html) that the title should match. +| Name | gitlint version | Default | Description | +| ----- | --------------- | ------- | ----------------------------------------------------------------------------------- | +| regex | >= 0.14 | None | [Python regex](https://docs.python.org/library/re.html) that the body should match. | ### Examples @@ -288,12 +306,13 @@ regex=Reviewed-By:(.*)$ [body-match-regex] regex=(*.)Foo(.*) ``` +------------------------------------------------------------------------------------------------------------------------ ## M1: author-valid-email -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -M1 | author-valid-email | >= 0.8.3 | Author email address must be a valid email address +| ID | Name | gitlint version | Description | +| --- | ------------------ | --------------- | -------------------------------------------------- | +| M1 | author-valid-email | >= 0.8.3 | Author email address must be a valid email address | !!! note Email addresses are [notoriously hard to validate and the official email valid spec is often too loose for any real world application](http://stackoverflow.com/a/201378/381010). @@ -303,9 +322,9 @@ M1 | author-valid-email | >= 0.8.3 | Author email address mus ### Options -Name | gitlint version | Default | Description -----------------------|-------------------|------------------------------|---------------------------------- -regex | >= 0.9.0 | `[^@ ]+@[^@ ]+\.[^@ ]+` | [Python regex](https://docs.python.org/library/re.html) the commit author email address is matched against +| Name | gitlint version | Default | Description | +| ----- | --------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------- | +| regex | >= 0.9.0 | `[^@ ]+@[^@ ]+\.[^@ ]+` | [Python regex](https://docs.python.org/library/re.html) the commit author email address is matched against | ### Examples @@ -317,20 +336,21 @@ regex | >= 0.9.0 | `[^@ ]+@[^@ ]+\.[^@ ]+` | [Python [author-valid-email] regex=[^@]+@foo.com ``` +------------------------------------------------------------------------------------------------------------------------ ## I1: ignore-by-title -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -I1 | ignore-by-title | >= 0.10.0 | Ignore a commit based on matching its title. +| ID | Name | gitlint version | Description | +| --- | --------------- | --------------- | -------------------------------------------- | +| I1 | ignore-by-title | >= 0.10.0 | Ignore a commit based on matching its title. | ### Options -Name | gitlint version | Default | Description -----------------------|-------------------|------------------------------|---------------------------------- -regex | >= 0.10.0 | None | [Python regex](https://docs.python.org/library/re.html) to match against commit title. On match, the commit will be ignored. -ignore | >= 0.10.0 | all | Comma-separated list of rule names or ids to ignore when this rule is matched. +| Name | gitlint version | Default | Description | +| ------ | --------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------- | +| regex | >= 0.10.0 | None | [Python regex](https://docs.python.org/library/re.html) to match against commit title. On match, the commit will be ignored. | +| ignore | >= 0.10.0 | all | Comma-separated list of rule names or ids to ignore when this rule is matched. | ### Examples @@ -345,20 +365,21 @@ ignore=title-max-length,body-min-length # ignore all rules by setting ignore to 'all' # ignore=all ``` +------------------------------------------------------------------------------------------------------------------------ ## I2: ignore-by-body -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -I2 | ignore-by-body | >= 0.10.0 | Ignore a commit based on matching its body. +| ID | Name | gitlint version | Description | +| --- | -------------- | --------------- | ------------------------------------------- | +| I2 | ignore-by-body | >= 0.10.0 | Ignore a commit based on matching its body. | ### Options -Name | gitlint version | Default | Description -----------------------|-------------------|------------------------------|---------------------------------- -regex | >= 0.10.0 | None | [Python regex](https://docs.python.org/library/re.html) to match against each line of the body. On match, the commit will be ignored. -ignore | >= 0.10.0 | all | Comma-separated list of rule names or ids to ignore when this rule is matched. +| Name | gitlint version | Default | Description | +| ------ | --------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| regex | >= 0.10.0 | None | [Python regex](https://docs.python.org/library/re.html) to match against each line of the body. On match, the commit will be ignored. | +| ignore | >= 0.10.0 | all | Comma-separated list of rule names or ids to ignore when this rule is matched. | ### Examples @@ -376,19 +397,20 @@ ignore=all regex=(.*)release(.*) ignore=T1,body-min-length,B6 ``` +------------------------------------------------------------------------------------------------------------------------ ## I3: ignore-body-lines -ID | Name | gitlint version | Description -------|-----------------------------|-----------------|------------------------------------------- -I3 | ignore-body-lines | >= 0.14.0 | Ignore certain lines in a commit body that match a regex. +| ID | Name | gitlint version | Description | +| --- | ----------------- | --------------- | --------------------------------------------------------- | +| I3 | ignore-body-lines | >= 0.14.0 | Ignore certain lines in a commit body that match a regex. | ### Options -Name | gitlint version | Default | Description -----------------------|-------------------|------------------------------|---------------------------------- -regex | >= 0.14.0 | None | [Python regex](https://docs.python.org/library/re.html) to match against each line of the body. On match, that line will be ignored by gitlint (the rest of the body will still be linted). +| Name | gitlint version | Default | Description | +| ----- | --------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| regex | >= 0.14.0 | None | [Python regex](https://docs.python.org/library/re.html) to match against each line of the body. On match, that line will be ignored by gitlint (the rest of the body will still be linted). | ### Examples @@ -407,19 +429,20 @@ regex=(^Co-Authored-By)|(^Signed-off-by) [ignore-body-lines] regex=(.*)foobar(.*) ``` +------------------------------------------------------------------------------------------------------------------------ ## I4: ignore-by-author-name -ID | Name | gitlint version | Description -------|---------------------------|-----------------|------------------------------------------- -I4 | ignore-by-author-name | >= 0.16.0 | Ignore a commit based on matching its author name. +| ID | Name | gitlint version | Description | +| --- | --------------------- | --------------- | -------------------------------------------------- | +| I4 | ignore-by-author-name | >= 0.16.0 | Ignore a commit based on matching its author name. | ### Options -Name | gitlint version | Default | Description -----------------------|-------------------|------------------------------|---------------------------------- -regex | >= 0.16.0 | None | [Python regex](https://docs.python.org/library/re.html) to match against the commit author name. On match, the commit will be ignored. -ignore | >= 0.16.0 | all | Comma-separated list of rule names or ids to ignore when this rule is matched. +| Name | gitlint version | Default | Description | +| ------ | --------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| regex | >= 0.16.0 | None | [Python regex](https://docs.python.org/library/re.html) to match against the commit author name. On match, the commit will be ignored. | +| ignore | >= 0.16.0 | all | Comma-separated list of rule names or ids to ignore when this rule is matched. | ### Examples @@ -435,4 +458,4 @@ regex=dependabot [ignore-by-author-name] regex=(.*)\[bot\](.*) ignore=T1,body-min-length,B6 -``` \ No newline at end of file +``` diff --git a/docs/user_defined_rules.md b/docs/user_defined_rules.md index f58dcc7..db21809 100644 --- a/docs/user_defined_rules.md +++ b/docs/user_defined_rules.md @@ -179,27 +179,33 @@ Both `CommitRule`s and `LineRule`s take a `commit` object in their `validate(... The table below outlines the various attributes of that commit object that can be used during validation. -Property | Type | Description --------------------------------| ---------------|------------------- -commit.message | object | Python object representing the commit message -commit.message.original | string | Original commit message as returned by git -commit.message.full | string | Full commit message, with comments (lines starting with #) removed. -commit.message.title | string | Title/subject of the commit message: the first line -commit.message.body | string[] | List of lines in the body of the commit message (i.e. starting from the second line) -commit.author_name | string | Name of the author, result of `git log --pretty=%aN` -commit.author_email | string | Email of the author, result of `git log --pretty=%aE` -commit.date | datetime | Python `datetime` object representing the time of commit -commit.is_merge_commit | boolean | Boolean indicating whether the commit is a merge commit or not. -commit.is_revert_commit | boolean | Boolean indicating whether the commit is a revert commit or not. -commit.is_fixup_commit | boolean | Boolean indicating whether the commit is a fixup commit or not. -commit.is_squash_commit | boolean | Boolean indicating whether the commit is a squash commit or not. -commit.parents | string[] | List of parent commit `sha`s (only for merge commits). -commit.changed_files | string[] | List of files changed in the commit (relative paths). -commit.branches | string[] | List of branch names the commit is part of -commit.context | object | Object pointing to the bigger git context that the commit is part of -commit.context.current_branch | string | Name of the currently active branch (of local repo) -commit.context.repository_path | string | Absolute path pointing to the git repository being linted -commit.context.commits | object[] | List of commits gitlint is acting on, NOT all commits in the repo. +| Property | Type | Description | +| -------------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------ | +| commit | `GitCommit` | Python object representing the commit | +| commit.message | `GitCommitMessage` | Python object representing the commit message | +| commit.message.original | `str` | Original commit message as returned by git | +| commit.message.full | `str` | Full commit message, with comments (lines starting with #) removed. | +| commit.message.title | `str` | Title/subject of the commit message: the first line | +| commit.message.body | `str[]` | List of lines in the body of the commit message (i.e. starting from the second line) | +| commit.author_name | `str` | Name of the author, result of `git log --pretty=%aN` | +| commit.author_email | `str` | Email of the author, result of `git log --pretty=%aE` | +| commit.date | `datetime.datetime` | Python `datetime` object representing the time of commit | +| commit.is_merge_commit | `bool` | Boolean indicating whether the commit is a merge commit or not. | +| commit.is_revert_commit | `bool` | Boolean indicating whether the commit is a revert commit or not. | +| commit.is_fixup_commit | `bool` | Boolean indicating whether the commit is a fixup commit or not. | +| commit.is_fixup_amend_commit | `bool` | Boolean indicating whether the commit is a (fixup) amend commit or not. | +| commit.is_squash_commit | `bool` | Boolean indicating whether the commit is a squash commit or not. | +| commit.parents | `str[]` | List of parent commit `sha`s (only for merge commits). | +| commit.changed_files | `str[]` | List of files changed in the commit (relative paths). | +| commit.changed_files_stats | `dict[str, GitChangedFilesStats]` | Dictionary mapping the changed files to a `GitChangedFilesStats` objects | +| commit.changed_files_stats["path"].filepath | `pathlib.Path` | Relative path (compared to repo root) of the file that was changed. | +| commit.changed_files_stats["path"].additions | `int` | Number of additions in the file. | +| commit.changed_files_stats["path"].deletions | `int` | Number of deletions in the file. | +| commit.branches | `str[]` | List of branch names the commit is part of | +| commit.context | `GitContext` | Object pointing to the bigger git context that the commit is part of | +| commit.context.current_branch | `str` | Name of the currently active branch (of local repo) | +| commit.context.repository_path | `str` | Absolute path pointing to the git repository being linted | +| commit.context.commits | `GitCommit[]` | List of commits gitlint is acting on, NOT all commits in the repo. | ## Violations In order to let gitlint know that there is a violation in the commit being linted, users should have the `validate(...)` @@ -216,12 +222,12 @@ RuleViolation(rule_id, message, content=None, line_nr=None): ``` With the parameters meaning the following: -Parameter | Type | Description ---------------|---------|-------------------------------- -rule_id | string | Rule's unique string id -message | string | Short description of the violation -content | string | (optional) the violating part of commit or line -line_nr | int | (optional) line number in the commit message where the violation occurs. **Automatically set to the correct line number for `LineRule`s if not set explicitly.** +| Parameter | Type | Description | +| --------- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| rule_id | `str` | Rule's unique string id | +| message | `str` | Short description of the violation | +| content | `str` | (optional) the violating part of commit or line | +| line_nr | `int` | (optional) line number in the commit message where the violation occurs. **Automatically set to the correct line number for `LineRule`s if not set explicitly.** | A typical `validate(...)` implementation for a `CommitRule` would then be as follows: ```python @@ -281,14 +287,14 @@ As `options_spec` is a list, you can obviously have multiple options per rule. T Gitlint supports a variety of different option types, all can be imported from `gitlint.options`: -Option Class | Use for -------------------|-------------- -`StrOption ` | Strings -`IntOption` | Integers. `IntOption` takes an optional `allow_negative` parameter if you want to allow negative integers. -`BoolOption` | Booleans. Valid values: `true`, `false`. Case-insensitive. -`ListOption` | List of strings. Comma separated. -`PathOption` | Directory or file path. Takes an optional `type` parameter for specifying path type (`file`, `dir` (=default) or `both`). -`RegexOption` | String representing a [Python-style regex](https://docs.python.org/library/re.html) - compiled and validated before rules are applied. +| Option Class | Use for | +| ------------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| `StrOption ` | Strings | +| `IntOption` | Integers. `IntOption` takes an optional `allow_negative` parameter if you want to allow negative integers. | +| `BoolOption` | Booleans. Valid values: `true`, `false`. Case-insensitive. | +| `ListOption` | List of strings. Comma separated. | +| `PathOption` | Directory or file path. Takes an optional `type` parameter for specifying path type (`file`, `dir` (=default) or `both`). | +| `RegexOption` | String representing a [Python-style regex](https://docs.python.org/library/re.html) - compiled and validated before rules are applied. | !!! note Gitlint currently does not support options for all possible types (e.g. float, list of int, etc). diff --git a/examples/my_commit_rules.py b/examples/my_commit_rules.py index 2805501..35bb836 100644 --- a/examples/my_commit_rules.py +++ b/examples/my_commit_rules.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - from gitlint.rules import CommitRule, RuleViolation from gitlint.options import IntOption, ListOption @@ -27,20 +25,20 @@ class BodyMaxLineCount(CommitRule): id = "UC1" # A rule MAY have an option_spec if its behavior should be configurable. - options_spec = [IntOption('max-line-count', 3, "Maximum body line count")] + options_spec = [IntOption("max-line-count", 3, "Maximum body line count")] def validate(self, commit): self.log.debug("BodyMaxLineCount: This will be visible when running `gitlint --debug`") line_count = len(commit.message.body) - max_line_count = self.options['max-line-count'].value + max_line_count = self.options["max-line-count"].value if line_count > max_line_count: message = f"Body contains too many lines ({line_count} > {max_line_count})" return [RuleViolation(self.id, message, line_nr=1)] class SignedOffBy(CommitRule): - """ This rule will enforce that each commit contains a "Signed-off-by" line. + """This rule will enforce that each commit contains a "Signed-off-by" line. We keep things simple here and just check whether the commit body contains a line that starts with "Signed-off-by". """ @@ -61,8 +59,8 @@ class SignedOffBy(CommitRule): class BranchNamingConventions(CommitRule): - """ This rule will enforce that a commit is part of a branch that meets certain naming conventions. - See GitFlow for real-world example of this: https://nvie.com/posts/a-successful-git-branching-model/ + """This rule will enforce that a commit is part of a branch that meets certain naming conventions. + See GitFlow for real-world example of this: https://nvie.com/posts/a-successful-git-branching-model/ """ # A rule MUST have a human friendly name @@ -72,13 +70,13 @@ class BranchNamingConventions(CommitRule): id = "UC3" # A rule MAY have an option_spec if its behavior should be configurable. - options_spec = [ListOption('branch-prefixes', ["feature/", "hotfix/", "release/"], "Allowed branch prefixes")] + options_spec = [ListOption("branch-prefixes", ["feature/", "hotfix/", "release/"], "Allowed branch prefixes")] def validate(self, commit): self.log.debug("BranchNamingConventions: This line will be visible when running `gitlint --debug`") violations = [] - allowed_branch_prefixes = self.options['branch-prefixes'].value + allowed_branch_prefixes = self.options["branch-prefixes"].value for branch in commit.branches: valid_branch_name = False diff --git a/examples/my_configuration_rules.py b/examples/my_configuration_rules.py index 7c00707..7715c0b 100644 --- a/examples/my_configuration_rules.py +++ b/examples/my_configuration_rules.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - from gitlint.rules import ConfigurationRule from gitlint.options import IntOption @@ -36,7 +34,7 @@ class ReleaseConfigurationRule(ConfigurationRule): id = "UCR1" # A rule MAY have an option_spec if its behavior should be configurable. - options_spec = [IntOption('custom-verbosity', 2, "Gitlint verbosity for release commits")] + options_spec = [IntOption("custom-verbosity", 2, "Gitlint verbosity for release commits")] def apply(self, config, commit): self.log.debug("ReleaseConfigurationRule: This will be visible when running `gitlint --debug`") @@ -44,7 +42,6 @@ class ReleaseConfigurationRule(ConfigurationRule): # If the commit title starts with 'Release', we want to modify # how all subsequent rules interpret that commit if commit.message.title.startswith("Release"): - # If your Release commit messages are auto-generated, the # body might contain trailing whitespace. Let's ignore that config.ignore.append("body-trailing-whitespace") @@ -60,7 +57,7 @@ class ReleaseConfigurationRule(ConfigurationRule): # config.set_general_option(, ) config.set_general_option("verbosity", 2) # Wwe can also use custom options to make this configurable - config.set_general_option("verbosity", self.options['custom-verbosity'].value) + config.set_general_option("verbosity", self.options["custom-verbosity"].value) # Strip any lines starting with $ from the commit message # (this only affects how gitlint sees your commit message, it does diff --git a/examples/my_line_rules.py b/examples/my_line_rules.py index 3a1ef36..58b0108 100644 --- a/examples/my_line_rules.py +++ b/examples/my_line_rules.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - from gitlint.rules import LineRule, RuleViolation, CommitMessageTitle from gitlint.options import ListOption @@ -21,8 +19,8 @@ that fits your needs. class SpecialChars(LineRule): - """ This rule will enforce that the commit message title does not contain any of the following characters: - $^%@!*() """ + """This rule will enforce that the commit message title does not contain any of the following characters: + $^%@!*()""" # A rule MUST have a human friendly name name = "title-no-special-chars" @@ -35,15 +33,20 @@ class SpecialChars(LineRule): target = CommitMessageTitle # A rule MAY have an option_spec if its behavior should be configurable. - options_spec = [ListOption('special-chars', ['$', '^', '%', '@', '!', '*', '(', ')'], - "Comma separated list of characters that should not occur in the title")] + options_spec = [ + ListOption( + "special-chars", + ["$", "^", "%", "@", "!", "*", "(", ")"], + "Comma separated list of characters that should not occur in the title", + ) + ] def validate(self, line, _commit): self.log.debug("SpecialChars: This will be visible when running `gitlint --debug`") violations = [] # options can be accessed by looking them up by their name in self.options - for char in self.options['special-chars'].value: + for char in self.options["special-chars"].value: if char in line: msg = f"Title contains the special character '{char}'" violation = RuleViolation(self.id, msg, line) diff --git a/gitlint-core/gitlint/__init__.py b/gitlint-core/gitlint/__init__.py index fd86b3e..1317d75 100644 --- a/gitlint-core/gitlint/__init__.py +++ b/gitlint-core/gitlint/__init__.py @@ -1 +1 @@ -__version__ = "0.17.0" +__version__ = "0.18.0" diff --git a/gitlint-core/gitlint/cache.py b/gitlint-core/gitlint/cache.py index 1b6558f..b84c904 100644 --- a/gitlint-core/gitlint/cache.py +++ b/gitlint-core/gitlint/cache.py @@ -1,31 +1,31 @@ class PropertyCache: - """ Mixin class providing a simple cache. """ + """Mixin class providing a simple cache.""" def __init__(self): self._cache = {} def _try_cache(self, cache_key, cache_populate_func): - """ Tries to get a value from the cache identified by `cache_key`. - If no value is found in the cache, do a function call to `cache_populate_func` to populate the cache - and then return the value from the cache. """ + """Tries to get a value from the cache identified by `cache_key`. + If no value is found in the cache, do a function call to `cache_populate_func` to populate the cache + and then return the value from the cache.""" if cache_key not in self._cache: cache_populate_func() return self._cache[cache_key] def cache(original_func=None, cachekey=None): # pylint: disable=unused-argument - """ Cache decorator. Caches function return values. - Requires the parent class to extend and initialize PropertyCache. - Usage: - # Use function name as cache key - @cache - def myfunc(args): - ... + """Cache decorator. Caches function return values. + Requires the parent class to extend and initialize PropertyCache. + Usage: + # Use function name as cache key + @cache + def myfunc(args): + ... - # Specify cache key - @cache(cachekey="foobar") - def myfunc(args): - ... + # Specify cache key + @cache(cachekey="foobar") + def myfunc(args): + ... """ # Decorators with optional arguments are a bit convoluted in python, see some of the links below for details. @@ -41,6 +41,7 @@ def cache(original_func=None, cachekey=None): # pylint: disable=unused-argument def cache_func_result(): # Call decorated function and store its result in the cache args[0]._cache[cachekey] = func(*args) + return args[0]._try_cache(cachekey, cache_func_result) return wrapped diff --git a/gitlint-core/gitlint/cli.py b/gitlint-core/gitlint/cli.py index 19676b3..387072e 100644 --- a/gitlint-core/gitlint/cli.py +++ b/gitlint-core/gitlint/cli.py @@ -11,6 +11,7 @@ import click import gitlint from gitlint.lint import GitLinter from gitlint.config import LintConfigBuilder, LintConfigError, LintConfigGenerator +from gitlint.deprecation import LOG as DEPRECATED_LOG, DEPRECATED_LOG_FORMAT from gitlint.git import GitContext, GitContextError, git_version from gitlint import hooks from gitlint.shell import shell @@ -37,19 +38,29 @@ LOG = logging.getLogger("gitlint.cli") class GitLintUsageError(GitlintError): - """ Exception indicating there is an issue with how gitlint is used. """ + """Exception indicating there is an issue with how gitlint is used.""" + pass def setup_logging(): - """ Setup gitlint logging """ + """Setup gitlint logging""" + + # Root log, mostly used for debug root_log = logging.getLogger("gitlint") root_log.propagate = False # Don't propagate to child loggers, the gitlint root logger handles everything + root_log.setLevel(logging.ERROR) handler = logging.StreamHandler() formatter = logging.Formatter(LOG_FORMAT) handler.setFormatter(formatter) root_log.addHandler(handler) - root_log.setLevel(logging.ERROR) + + # Deprecated log, to log deprecation warnings + DEPRECATED_LOG.propagate = False # Don't propagate to child logger + DEPRECATED_LOG.setLevel(logging.WARNING) + deprecated_log_handler = logging.StreamHandler() + deprecated_log_handler.setFormatter(logging.Formatter(DEPRECATED_LOG_FORMAT)) + DEPRECATED_LOG.addHandler(deprecated_log_handler) def log_system_info(): @@ -62,10 +73,20 @@ def log_system_info(): def build_config( # pylint: disable=too-many-arguments - target, config_path, c, extra_path, ignore, contrib, ignore_stdin, staged, fail_without_commits, verbose, - silent, debug + target, + config_path, + c, + extra_path, + ignore, + contrib, + ignore_stdin, + staged, + fail_without_commits, + verbose, + silent, + debug, ): - """ Creates a LintConfig object based on a set of commandline parameters. """ + """Creates a LintConfig object based on a set of commandline parameters.""" config_builder = LintConfigBuilder() # Config precedence: # First, load default config or config from configfile @@ -79,33 +100,33 @@ def build_config( # pylint: disable=too-many-arguments # Finally, overwrite with any convenience commandline flags if ignore: - config_builder.set_option('general', 'ignore', ignore) + config_builder.set_option("general", "ignore", ignore) if contrib: - config_builder.set_option('general', 'contrib', contrib) + config_builder.set_option("general", "contrib", contrib) if ignore_stdin: - config_builder.set_option('general', 'ignore-stdin', ignore_stdin) + config_builder.set_option("general", "ignore-stdin", ignore_stdin) if silent: - config_builder.set_option('general', 'verbosity', 0) + config_builder.set_option("general", "verbosity", 0) elif verbose > 0: - config_builder.set_option('general', 'verbosity', verbose) + config_builder.set_option("general", "verbosity", verbose) if extra_path: - config_builder.set_option('general', 'extra-path', extra_path) + config_builder.set_option("general", "extra-path", extra_path) if target: - config_builder.set_option('general', 'target', target) + config_builder.set_option("general", "target", target) if debug: - config_builder.set_option('general', 'debug', debug) + config_builder.set_option("general", "debug", debug) if staged: - config_builder.set_option('general', 'staged', staged) + config_builder.set_option("general", "staged", staged) if fail_without_commits: - config_builder.set_option('general', 'fail-without-commits', fail_without_commits) + config_builder.set_option("general", "fail-without-commits", fail_without_commits) config = config_builder.build() @@ -113,7 +134,7 @@ def build_config( # pylint: disable=too-many-arguments def get_stdin_data(): - """ Helper function that returns data send to stdin or False if nothing is send """ + """Helper function that returns data sent to stdin or False if nothing is sent""" # STDIN can only be 3 different types of things ("modes") # 1. An interactive terminal device (i.e. a TTY -> sys.stdin.isatty() or stat.S_ISCHR) # 2. A (named) pipe (stat.S_ISFIFO) @@ -145,13 +166,17 @@ def get_stdin_data(): def build_git_context(lint_config, msg_filename, commit_hash, refspec): - """ Builds a git context based on passed parameters and order of precedence """ + """Builds a git context based on passed parameters and order of precedence""" # Determine which GitContext method to use if a custom message is passed from_commit_msg = GitContext.from_commit_msg if lint_config.staged: LOG.debug("Fetching additional meta-data from staged commit") - from_commit_msg = lambda message: GitContext.from_staged_commit(message, lint_config.target) # noqa + from_commit_msg = ( + lambda message: GitContext.from_staged_commit( # pylint: disable=unnecessary-lambda-assignment + message, lint_config.target + ) + ) # Order of precedence: # 1. Any data specified via --msg-filename @@ -168,8 +193,10 @@ def build_git_context(lint_config, msg_filename, commit_hash, refspec): return from_commit_msg(stdin_input) if lint_config.staged: - raise GitLintUsageError("The 'staged' option (--staged) can only be used when using '--msg-filename' or " - "when piping data to gitlint via stdin.") + raise GitLintUsageError( + "The 'staged' option (--staged) can only be used when using '--msg-filename' or " + "when piping data to gitlint via stdin." + ) # 3. Fallback to reading from local repository LOG.debug("No --msg-filename flag, no or empty data passed to stdin. Using the local repo.") @@ -177,11 +204,25 @@ def build_git_context(lint_config, msg_filename, commit_hash, refspec): if commit_hash and refspec: raise GitLintUsageError("--commit and --commits are mutually exclusive, use one or the other.") - return GitContext.from_local_repository(lint_config.target, refspec=refspec, commit_hash=commit_hash) + # 3.1 Linting a range of commits + if refspec: + # 3.1.1 Not real refspec, but comma-separated list of commit hashes + if "," in refspec: + commit_hashes = [hash.strip() for hash in refspec.split(",")] + return GitContext.from_local_repository(lint_config.target, commit_hashes=commit_hashes) + # 3.1.2 Real refspec + return GitContext.from_local_repository(lint_config.target, refspec=refspec) + + # 3.2 Linting a specific commit + if commit_hash: + return GitContext.from_local_repository(lint_config.target, commit_hashes=[commit_hash]) + + # 3.3 Fallback to linting the current HEAD + return GitContext.from_local_repository(lint_config.target) def handle_gitlint_error(ctx, exc): - """ Helper function to handle exceptions """ + """Helper function to handle exceptions""" if isinstance(exc, GitContextError): click.echo(exc) ctx.exit(GIT_CONTEXT_ERROR_CODE) @@ -194,7 +235,7 @@ def handle_gitlint_error(ctx, exc): class ContextObj: - """ Simple class to hold data that is passed between Click commands via the Click context. """ + """Simple class to hold data that is passed between Click commands via the Click context.""" def __init__(self, config, config_builder, commit_hash, refspec, msg_filename, gitcontext=None): self.config = config @@ -205,29 +246,34 @@ class ContextObj: self.gitcontext = gitcontext +# fmt: off @click.group(invoke_without_command=True, context_settings={'max_content_width': 120}, epilog="When no COMMAND is specified, gitlint defaults to 'gitlint lint'.") @click.option('--target', envvar='GITLINT_TARGET', type=click.Path(exists=True, resolve_path=True, file_okay=False, readable=True), help="Path of the target git repository. [default: current working directory]") -@click.option('-C', '--config', type=click.Path(exists=True, dir_okay=False, readable=True, resolve_path=True), +@click.option('-C', '--config', envvar='GITLINT_CONFIG', + type=click.Path(exists=True, dir_okay=False, readable=True, resolve_path=True), help=f"Config file location [default: {DEFAULT_CONFIG_FILE}]") @click.option('-c', multiple=True, help="Config flags in format .