summaryrefslogtreecommitdiffstats
path: root/gitlint-core/gitlint/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'gitlint-core/gitlint/contrib')
-rw-r--r--gitlint-core/gitlint/contrib/__init__.py0
-rw-r--r--gitlint-core/gitlint/contrib/rules/__init__.py0
-rw-r--r--gitlint-core/gitlint/contrib/rules/conventional_commit.py37
-rw-r--r--gitlint-core/gitlint/contrib/rules/signedoff_by.py18
4 files changed, 55 insertions, 0 deletions
diff --git a/gitlint-core/gitlint/contrib/__init__.py b/gitlint-core/gitlint/contrib/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/gitlint-core/gitlint/contrib/__init__.py
diff --git a/gitlint-core/gitlint/contrib/rules/__init__.py b/gitlint-core/gitlint/contrib/rules/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/gitlint-core/gitlint/contrib/rules/__init__.py
diff --git a/gitlint-core/gitlint/contrib/rules/conventional_commit.py b/gitlint-core/gitlint/contrib/rules/conventional_commit.py
new file mode 100644
index 0000000..9c9d5cb
--- /dev/null
+++ b/gitlint-core/gitlint/contrib/rules/conventional_commit.py
@@ -0,0 +1,37 @@
+import re
+
+from gitlint.options import ListOption
+from gitlint.rules import CommitMessageTitle, LineRule, RuleViolation
+
+RULE_REGEX = re.compile(r"([^(]+?)(\([^)]+?\))?!?: .+")
+
+
+class ConventionalCommit(LineRule):
+ """ This rule enforces the spec at https://www.conventionalcommits.org/. """
+
+ name = "contrib-title-conventional-commits"
+ id = "CT1"
+ target = CommitMessageTitle
+
+ options_spec = [
+ ListOption(
+ "types",
+ ["fix", "feat", "chore", "docs", "style", "refactor", "perf", "test", "revert", "ci", "build"],
+ "Comma separated list of allowed commit types.",
+ )
+ ]
+
+ def validate(self, line, _commit):
+ violations = []
+ match = RULE_REGEX.match(line)
+
+ if not match:
+ msg = "Title does not follow ConventionalCommits.org format 'type(optional-scope): description'"
+ violations.append(RuleViolation(self.id, msg, line))
+ else:
+ line_commit_type = match.group(1)
+ if line_commit_type not in self.options["types"].value:
+ opt_str = ', '.join(self.options['types'].value)
+ violations.append(RuleViolation(self.id, f"Title does not start with one of {opt_str}", line))
+
+ return violations
diff --git a/gitlint-core/gitlint/contrib/rules/signedoff_by.py b/gitlint-core/gitlint/contrib/rules/signedoff_by.py
new file mode 100644
index 0000000..139a1b1
--- /dev/null
+++ b/gitlint-core/gitlint/contrib/rules/signedoff_by.py
@@ -0,0 +1,18 @@
+
+from gitlint.rules import CommitRule, RuleViolation
+
+
+class SignedOffBy(CommitRule):
+ """ This rule will enforce that each commit body 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".
+ """
+
+ name = "contrib-body-requires-signed-off-by"
+ id = "CC1"
+
+ def validate(self, commit):
+ for line in commit.message.body:
+ if line.lower().startswith("signed-off-by"):
+ return []
+
+ return [RuleViolation(self.id, "Body does not contain a 'Signed-off-by' line", line_nr=1)]