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