summaryrefslogtreecommitdiffstats
path: root/gitlint/contrib/rules/conventional_commit.py
diff options
context:
space:
mode:
Diffstat (limited to 'gitlint/contrib/rules/conventional_commit.py')
-rw-r--r--gitlint/contrib/rules/conventional_commit.py17
1 files changed, 8 insertions, 9 deletions
diff --git a/gitlint/contrib/rules/conventional_commit.py b/gitlint/contrib/rules/conventional_commit.py
index 71f6adf..9c9d5cb 100644
--- a/gitlint/contrib/rules/conventional_commit.py
+++ b/gitlint/contrib/rules/conventional_commit.py
@@ -3,7 +3,7 @@ import re
from gitlint.options import ListOption
from gitlint.rules import CommitMessageTitle, LineRule, RuleViolation
-RULE_REGEX = re.compile(r"[^(]+?(\([^)]+?\))?: .+")
+RULE_REGEX = re.compile(r"([^(]+?)(\([^)]+?\))?!?: .+")
class ConventionalCommit(LineRule):
@@ -23,16 +23,15 @@ class ConventionalCommit(LineRule):
def validate(self, line, _commit):
violations = []
+ match = RULE_REGEX.match(line)
- for commit_type in self.options["types"].value:
- if line.startswith(commit_type):
- break
- else:
- msg = "Title does not start with one of {0}".format(', '.join(self.options['types'].value))
- violations.append(RuleViolation(self.id, msg, line))
-
- if not 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