xref: /cloud-hypervisor/scripts/gitlint/rules/TitleStartsWithComponent.py (revision 07475d2bc1bd706bcdc5e029c0a920969937daa7)
1ea7999e0SRuslan Mstoifrom gitlint.rules import LineRule, RuleViolation, CommitMessageTitle
2ea7999e0SRuslan Mstoiimport re
3ea7999e0SRuslan Mstoi
4ea7999e0SRuslan Mstoi
5ea7999e0SRuslan Mstoiclass TitleStartsWithComponent(LineRule):
6ea7999e0SRuslan Mstoi    """This rule will enforce that the commit message title starts with valid
7ea7999e0SRuslan Mstoi    component name
8ea7999e0SRuslan Mstoi    """
9ea7999e0SRuslan Mstoi
10ea7999e0SRuslan Mstoi    # A rule MUST have a human friendly name
11ea7999e0SRuslan Mstoi    name = "title-has-valid-component"
12ea7999e0SRuslan Mstoi
13ea7999e0SRuslan Mstoi    # A rule MUST have a *unique* id.
14ea7999e0SRuslan Mstoi    # We recommend starting with UL (for User-defined Line-rule)
15ea7999e0SRuslan Mstoi    id = "UL1"
16ea7999e0SRuslan Mstoi
17ea7999e0SRuslan Mstoi    # A line-rule MUST have a target (not required for CommitRules).
18ea7999e0SRuslan Mstoi    target = CommitMessageTitle
19ea7999e0SRuslan Mstoi
20ea7999e0SRuslan Mstoi    def validate(self, line, _commit):
21ea7999e0SRuslan Mstoi        valid_components = [
22ea7999e0SRuslan Mstoi            'api_client',
23ea7999e0SRuslan Mstoi            'arch',
24ea7999e0SRuslan Mstoi            'block',
25ea7999e0SRuslan Mstoi            'build',
26ea7999e0SRuslan Mstoi            'ch-remote',
27ea7999e0SRuslan Mstoi            'ci',
28ea7999e0SRuslan Mstoi            'devices',
29ea7999e0SRuslan Mstoi            'docs',
30ea7999e0SRuslan Mstoi            'event_monitor',
31ea7999e0SRuslan Mstoi            'fuzz',
32ea7999e0SRuslan Mstoi            'github',
33ea7999e0SRuslan Mstoi            'gitignore',
34*07475d2bSBo Chen            'gitlint',
35ea7999e0SRuslan Mstoi            'hypervisor',
36ea7999e0SRuslan Mstoi            'Jenkinsfile',
37ea7999e0SRuslan Mstoi            'misc',
38ea7999e0SRuslan Mstoi            'net_gen',
39ea7999e0SRuslan Mstoi            'net_util',
40ea7999e0SRuslan Mstoi            'option_parser',
41ea7999e0SRuslan Mstoi            'pci',
42ea7999e0SRuslan Mstoi            'performance-metrics',
43ea7999e0SRuslan Mstoi            'rate_limiter',
44ea7999e0SRuslan Mstoi            'README',
45ea7999e0SRuslan Mstoi            'resources',
46ea7999e0SRuslan Mstoi            'scripts',
47ea7999e0SRuslan Mstoi            'serial_buffer',
48ea7999e0SRuslan Mstoi            'test_data',
49ea7999e0SRuslan Mstoi            'test_infra',
50ea7999e0SRuslan Mstoi            'tests',
51ea7999e0SRuslan Mstoi            'tpm',
52ea7999e0SRuslan Mstoi            'tracer',
53ea7999e0SRuslan Mstoi            'vhost_user_block',
54ea7999e0SRuslan Mstoi            'vhost_user_net',
55ea7999e0SRuslan Mstoi            'virtio-devices',
56ea7999e0SRuslan Mstoi            'vm-allocator',
57ea7999e0SRuslan Mstoi            'vm-device',
58ea7999e0SRuslan Mstoi            'vmm',
59ea7999e0SRuslan Mstoi            'vm-migration',
60ea7999e0SRuslan Mstoi            'vm-virtio']
61ea7999e0SRuslan Mstoi
62ea7999e0SRuslan Mstoi        pattern = re.compile(r'^(.+):\s(.+)$')
63ea7999e0SRuslan Mstoi        match = pattern.match(line)
64ea7999e0SRuslan Mstoi
65ea7999e0SRuslan Mstoi        if not match:
66ea7999e0SRuslan Mstoi            self.log.debug("Invalid commit title {}", line)
67ea7999e0SRuslan Mstoi            return [RuleViolation(self.id, "Commit title does not comply with "
68ea7999e0SRuslan Mstoi                                  "rule: 'component: change summary'")]
69ea7999e0SRuslan Mstoi        component = match.group(1)
70ea7999e0SRuslan Mstoi        summary = match.group(2)
71ea7999e0SRuslan Mstoi        self.log.debug(f"\nComponent: {component}\nSummary: {summary}")
72ea7999e0SRuslan Mstoi
73ea7999e0SRuslan Mstoi        if component not in valid_components:
74ea7999e0SRuslan Mstoi            return [RuleViolation(self.id,
75ea7999e0SRuslan Mstoi                                  f"Invalid component: {component}, "
76ea7999e0SRuslan Mstoi                                  f"valid components are: {valid_components}")]
77