--- /dev/null
+#!/usr/bin/env python3
+#
+# This script tests a few things against the commit messages, search for
+# `def test_` to see the actual tests run.
+
+import git
+import os
+import pytest
+
+# Environment variables set by gitlab
+CI_COMMIT_SHA = os.environ['CI_COMMIT_SHA']
+CI_MERGE_REQUEST_TARGET_BRANCH_NAME = 'master'
+CI_SERVER_HOST = os.environ['CI_SERVER_HOST']
+
+# We need to add the real libinput as remote, our origin here is the user's
+# fork.
+repo = git.Repo('.')
+upstream = repo.create_remote('upstream', f'https://{CI_SERVER_HOST}/libinput/libinput.git')
+upstream.fetch()
+
+sha = CI_COMMIT_SHA
+branch = CI_MERGE_REQUEST_TARGET_BRANCH_NAME
+
+commits = list(repo.iter_commits(f'upstream/{branch}..{sha}'))
+
+
+def error(commit, message, long_message=''):
+ if long_message:
+ long_message = '\n\n\t' + long_message.replace('\n', '\n\t')
+ return f'on commit {str(commit)[:8]} "{commit.summary}": {message}{long_message}'
+
+
+@pytest.mark.parametrize('commit', commits)
+class TestCommits:
+ def test_author_email(self, commit):
+ assert '@users.noreply.gitlab.freedesktop.org' not in commit.author.email, \
+ error(commit, 'git author email invalid',
+ ('Please set your name and email with the commands\n',
+ ' git config --global user.name Your Name\n'
+ ' git config --global user.email your.email@provider.com\n'))
+
+ def test_signed_off_by(self, commit):
+ if not commit.message.startswith('Revert "'):
+ assert 'Signed-off-by:' in commit.message, \
+ error(commit, 'missing Signed-off-by tag',
+ 'Please add the required "Signed-off-by: author information" line to the commit message')
+
+ def test_fixup(self, commit):
+ assert not commit.message.startswith('fixup!'), \
+ error(commit, 'Remove fixup! tag',
+ 'Leftover "fixup!" commit message detected, please squash')
+ assert not commit.message.startswith('squash!'), \
+ error(commit, 'Remove squash! tag',
+ 'Leftover "squash!" commit message detected, please squash')
+
+ def test_line_length(self, commit):
+ lines = commit.message.split('\n')
+ first_line = lines[0]
+
+ assert len(first_line) < 85, \
+ error(commit, 'Commit message subject line too long')
+
+ try:
+ second_line = lines[1]
+ assert second_line == '', \
+ error(commit, 'Second line in commit message must be emtpy')
+ except IndexError:
+ pass