def _check_1st_line(line, **kwargs):
    """First line check.

    Check that the first line has a known component name followed by a colon
    and then a short description of the commit.

    :param line: first line
    :type line: str
    :param components: list of known component names
    :type line: list
    :param max_first_line: maximum length of the first line
    :type max_first_line: int
    :return: errors as in (code, line number, *args)
    :rtype: list

    """
    components = kwargs.get('components', ())
    max_first_line = kwargs.get('max_first_line', 50)
    errors = []
    lineno = 1
    if len(line) > max_first_line:
        errors.append(('M190', lineno, max_first_line, len(line)))
    if line.endswith('.'):
        errors.append(('M191', lineno))
    if ':' not in line:
        errors.append(('M110', lineno))
    else:
        component, msg = line.split(':', 1)
        if component not in components:
            errors.append(('M111', lineno, component))
    return errors
