summaryrefslogtreecommitdiffstats
path: root/gitlint/lint.py
blob: 3a0f51515402e2dfe93c838e43774f78a29ddd0e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from __future__ import print_function
from gitlint import rules


class GitLinter(object):
    def __init__(self, config):
        self.config = config

    @property
    def body_line_rules(self):
        return [rule for rule in self.config.body_rules if isinstance(rule, rules.LineRule)]

    @property
    def title_line_rules(self):
        return [rule for rule in self.config.title_rules if isinstance(rule, rules.LineRule)]

    def _apply_line_rules(self, lines, rules, line_nr_start):
        """ Iterates over the lines in a given git commit message and applies all the enabled line rules to
        each line """
        all_violations = []
        line_nr = line_nr_start
        for line in lines:
            for rule in rules:
                violation = rule.validate(line)
                if violation:
                    violation.line_nr = line_nr
                    all_violations.append(violation)
            line_nr += 1
        return all_violations

    def lint_commit_message(self, commit_message):
        lines = commit_message.split("\n")
        commit_message_title = [lines[0]]
        commit_message_body = lines[1:] if len(lines) > 1 else []
        title_violations = self._apply_line_rules(commit_message_title, self.title_line_rules, 1)
        body_violations = self._apply_line_rules(commit_message_body, self.body_line_rules, 2)
        violations = title_violations + body_violations
        for v in violations:
            print("{}: {} {}: \"{}\"".format(v.line_nr, v.rule_id, v.message, v.content))
        return len(violations)