Fix pre-commit and tox and gitlint settings 20/96320/2
authorGuillaume Lambert <guillaume.lambert@orange.com>
Wed, 2 Jun 2021 19:03:10 +0000 (21:03 +0200)
committerGuillaume Lambert <guillaume.lambert@orange.com>
Sat, 5 Jun 2021 19:44:41 +0000 (19:44 +0000)
- create a .gitlint configuration to enforce subject line < 50 char
  and body lines < 72 char and a Signed-off-by field presence.
- (auto)update repository revisions in pre-commit configuration file
- fix pre-commit tox profile to make it work locally
- create a gitlint profile that works in CI
- create pre-commit-install and pre-commit-uninstall tox profiles to
  (un)install hooks locally and (un)perform tests at each "git commit"
  call (i.e. without calling manually the pre-commit tox profile)
- precise pre-commit stages/types in the pre-commit configuration file
  so that hooks are installed correctly. This avoids messages about
  skipped tests when they are run at a wrong stage.

Signed-off-by: Guillaume Lambert <guillaume.lambert@orange.com>
Change-Id: I75b3b54b13e3d865ad6f563630bb0034456e7fe1
(cherry picked from commit 18f25b40e64bc60341d4036f09db14401fe9aaf6)

.gitlint [new file with mode: 0644]
.pre-commit-config.yaml
tox.ini

diff --git a/.gitlint b/.gitlint
new file mode 100644 (file)
index 0000000..85c1b7a
--- /dev/null
+++ b/.gitlint
@@ -0,0 +1,81 @@
+# All these sections are optional, edit this file as you like.
+[general]
+# Ignore certain rules, you can reference them by their id or by their full
+# name
+# ignore=title-trailing-punctuation, T3
+# verbosity should be a value between 1 and 3, the command line -v flags take
+# precedence over this
+# verbosity = 2
+# By default gitlint will ignore merge commits. Set to 'false' to disable.
+# ignore-merge-commits=true
+# By default gitlint will ignore fixup commits. Set to 'false' to disable.
+# ignore-fixup-commits=true
+# By default gitlint will ignore squash commits. Set to 'false' to disable.
+# ignore-squash-commits=true
+# Enable debug mode (prints more output). Disabled by default.
+# debug=true
+# Set the extra-path where gitlint will search for user defined rules
+# See http://jorisroovers.github.io/gitlint/user_defined_rules for details
+# extra-path=examples/
+# contrib=contrib-title-conventional-commits,contrib-body-requires-signed-off-b
+contrib=contrib-body-requires-signed-off-by
+[title-max-length]
+# line-length=80
+line-length=50
+# [title-must-not-contain-word]
+# Comma-separated list of words that should not occur in the title. Matching is
+# case insensitive. It's fine if the keyword occurs as part of a larger word
+# (so "WIPING" will not cause a violation, but "WIP: my title" will.
+# words=wip
+# [title-match-regex]
+# python like regex (https://docs.python.org/2/library/re.html) that the
+# commit-msg title must be matched to.
+# Note that the regex can contradict with other rules if not used correctly
+# (e.g. title-must-not-contain-word).
+# regex=^US[0-9]*
+[B1]
+# B1 = body-max-line-length
+# line-length=120
+line-length=72
+# [body-min-length]
+# min-length=5
+# [body-is-missing]
+# Whether to ignore this rule on merge commits (which typically only have a title)
+# default = True
+# ignore-merge-commits=false
+# [body-changed-file-mention]
+# List of files that need to be explicitly mentioned in the body when they are
+# changed This is useful for when developers often erroneously edit certain
+# files or git submodules.  By specifying this rule, developers can only change
+# the file when they explicitly reference it in the commit message.
+# files=gitlint/rules.py,README.md
+# [author-valid-email]
+# python like regex (https://docs.python.org/2/library/re.html) that the
+# commit author email address should be matched to
+# For example, use the following regex if you only want to allow email
+# addresses from foo.com
+# regex=[^@]+@foo.com
+# [ignore-by-title]
+# Ignore certain rules for commits of which the title matches a regex
+# E.g. Match commit titles that start with "Release"
+# regex=^Release(.*)
+#
+# Ignore certain rules, you can reference them by their id or by their full name
+# Use 'all' to ignore all rules
+# ignore=T1,body-min-length
+# [ignore-by-body]
+# Ignore certain rules for commits of which the body has a line that matches a
+# regex
+# E.g. Match bodies that have a line that contain "release"
+# regex=(.*)release(.*)
+#
+# Ignore certain rules, you can reference them by their id or by their full name
+# Use 'all' to ignore all rules
+# ignore=T1,body-min-length
+# Enable Conventional Commit subject line enforcement
+# https://www.conventionalcommits.org/en/v1.0.0/
+#
+# Since we want all subjects to be well formed, enforce the topics
+# to the following (fairly standard) topics and require them to be Mixed Case
+#[contrib-title-conventional-commits]
+#types=Fix,Feat,Chore,Docs,Style,Refactor,Perf,Test,Revert,CI,Build
index bdde670a595f0b96a6eb302d4bdd5e3adf67507e..88987acea59c03d225d38e546acebb712fb8b767 100644 (file)
@@ -1,19 +1,21 @@
 ---
 repos:
   - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v3.2.0
+    rev: v4.0.1
     hooks:
       - id: trailing-whitespace
 
   - repo: https://github.com/jorisroovers/gitlint
-    rev: v0.13.1
+    rev: v0.15.1
     hooks:
       - id: gitlint
+        stages: [commit-msg]
 
   - repo: https://github.com/Lucas-C/pre-commit-hooks
-    sha: v1.1.9
+    rev: v1.1.10
     hooks:
       - id: remove-tabs
+        stages: [commit]
         exclude: >
             (?x)^(
                 .git/COMMIT_EDITMSG|
diff --git a/tox.ini b/tox.ini
index eaf48bd0b05ebabf6074e945e804e52cb53aedb2..7018fdf3dc56eb74240831efcc01ce0a088ee9d8 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
 [tox]
 minversion = 1.6
-envlist = pre-commit,docs,docs-linkcheck
+envlist = pre-commit,gitlint,docs,docs-linkcheck
 skipsdist = true
 
 [testenv:docs]
@@ -14,12 +14,38 @@ basepython = python3
 deps = -rdocs/requirements.txt
 commands = sphinx-build -b linkcheck -d {envtmpdir}/doctrees ./docs/ {toxinidir}/docs/_build/linkcheck
 
+[testenv:pre-commit-install]
+basepython = python3
+deps = pre-commit
+commands =
+    pre-commit install
+    pre-commit install --hook-type commit-msg
+
+[testenv:pre-commit-uninstall]
+basepython = python3
+deps = pre-commit
+commands =
+    pre-commit uninstall
+    pre-commit uninstall --hook-type commit-msg
+
 [testenv:pre-commit]
 basepython = python3
 deps = pre-commit
+passenv = HOME
 commands =
     pre-commit run --all-files --show-diff-on-failure
     pre-commit run gitlint --hook-stage commit-msg --commit-msg-filename .git/COMMIT_EDITMSG
+    # Gitlint only proposes a pre-commit configuration for the commit-msg stage but none for the commit stage.
+    # Its default arguments --passed and --msg-filename are different from CI recommandations.
+    # As a result, the line above is skipped in jenkins CI since there cannot be a .git/COMMIT_EDITMSG file
+    # and the HOME variable must be passed to tox virtualenv so that Gitlint can access the git user configuration.
+    # A dedicated gitlint profile for CI is proposed below.
+
+[testenv:gitlint]
+basepython = python3
+deps = gitlint
+commands =
+    gitlint
 
 [testenv:spelling]
 basepython = python3