Files
ChocolateyPackages/EthanBrown.SublimeText2.WebPackages/tools/PackageCache/SublimeLinter/sublimelinter/modules/git_commit_message.py
2013-04-04 08:54:25 -04:00

112 lines
4.0 KiB
Python

# -*- coding: utf-8 -*-
# git_commit_message.py - sublimelint package for checking Git commit messages
from base_linter import BaseLinter
CONFIG = {
'language': 'Git Commit Message'
}
class ErrorType:
WARNING = 'warning'
VIOLATION = 'violation'
ERROR = 'error'
class Linter(BaseLinter):
def built_in_check(self, view, code, filename):
lines = code.splitlines()
lineno = 0
real_lineno = 0
first_line_of_message = None
first_line_of_body = None
errors = []
for line in lines:
real_lineno += 1
if line.startswith('#'):
continue
if line.startswith('diff --git'):
break
lineno += 1
if first_line_of_message is None:
if line.strip():
first_line_of_message = lineno
if len(line) > 68:
errors.append({
'type': ErrorType.ERROR,
'message': 'Subject line must be 68 characters or less (github will truncate).',
'lineno': real_lineno,
'col': 68,
})
elif len(line) > 50:
errors.append({
'type': ErrorType.WARNING,
'message': 'Subject line should be 50 characters or less.',
'lineno': real_lineno,
'col': 50,
})
elif lineno != 1:
errors.append({
'type': ErrorType.ERROR,
'message': 'Subject must be on first line.',
'lineno': real_lineno,
})
elif line[0].upper() != line[0]:
errors.append({
'type': ErrorType.VIOLATION,
'message': 'Subject line should be capitalized.',
'lineno': real_lineno,
})
elif first_line_of_body is None:
if len(line):
first_line_of_body = lineno
if lineno == first_line_of_message + 1:
if len(line):
errors.append({
'message': 'Leave a blank line between the message subject and body.',
'lineno': first_line_of_message + 1,
})
elif lineno > first_line_of_message + 2:
errors.append({
'message': 'Leave exactly 1 blank line between the message subject and body.',
'lineno': real_lineno,
})
if first_line_of_body is not None:
if len(line) > 72:
errors.append({
'message': 'Lines must not exceed 72 characters.',
'lineno': real_lineno,
'col': 72,
})
return errors
def parse_errors(self, view, errors, lines, errorUnderlines, violationUnderlines, warningUnderlines, errorMessages, violationMessages, warningMessages):
for error in errors:
error_type = error.get('type', ErrorType.ERROR)
col = error.get('col', 0)
messages = {
ErrorType.WARNING: warningMessages,
ErrorType.VIOLATION: violationMessages,
ErrorType.ERROR: errorMessages,
}[error_type]
underlines = {
ErrorType.WARNING: warningUnderlines,
ErrorType.VIOLATION: violationUnderlines,
ErrorType.ERROR: errorUnderlines,
}[error_type]
self.add_message(error['lineno'], lines, error['message'], messages)
self.underline_range(view, error['lineno'], col, underlines, length=1)