blob: 160e72fbc8d9e5134909f84283423c2681f67c7e [file] [log] [blame]
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0
"""Run presubmit checks for subject lines
This script is intended to be used by `repo`. For more information, please see
https://chromium.googlesource.com/chromiumos/repohooks/+/refs/heads/main/README.md.
Enforces the following rules:
- Each uploaded patch must have valid subject line tag
- ChromeOS only commits must not have FROMLIST:, FROMGIT:,
or UPSTREAM: tags
- Patches with FROMLIST:, FROMGIT:, BACKPORT:, or UPSTREAM: tags
must not include ChromeOS only files
"""
import os
import subprocess
import sys
TAG_MISSING_MSG = 'The subject of this patch does not include a valid tag'
BAD_TAG_MSG = 'Bad subject tag for patch touching ChromeOS specific files'
UPSTREAM_TAGS = ('FROMLIST:', 'UPSTREAM:', 'FROMGIT:', 'BACKPORT:')
OTHER_TAGS = ('CHROMIUM:', 'WIP:', 'TEST:', 'TEST-ONLY:', 'Revert', 'Reland',
'DO-NOT-SUBMIT')
CHROMEOS_FILES = ('chromeos/', 'OWNERS', 'PRESUBMIT.cfg', 'unblocked_terms.txt')
def repo_path():
"""Return path to repository"""
return subprocess.check_output(
['git', 'rev-parse', '--show-toplevel'], encoding='utf-8').strip()
def includes_chromium(files):
"""Check if the CL modifies files that belong to ChromiumOS"""
gitroot=repo_path()
return any(os.path.relpath(f, gitroot).startswith(CHROMEOS_FILES)
for f in files)
def check_commit(commit, files):
"""Inspect commit messages to validate subject line."""
commit_message = subprocess.check_output(
['git', 'log', '-n', '1', '--format=%B', commit],
encoding='utf-8',
)
if not commit_message.startswith(UPSTREAM_TAGS + OTHER_TAGS):
print(TAG_MISSING_MSG, file=sys.stderr)
return False
if commit_message.startswith(UPSTREAM_TAGS) and includes_chromium(files):
print(BAD_TAG_MSG, file=sys.stderr)
return False
return True
def main():
"""Main function."""
presubmit_files = os.environ.get('PRESUBMIT_FILES')
if presubmit_files is None:
sys.exit('Need a value for PRESUBMIT_FILES')
presubmit_commit = os.environ.get('PRESUBMIT_COMMIT')
if presubmit_commit is None:
sys.exit('Need a value for PRESUBMIT_COMMIT')
if not check_commit(presubmit_commit, presubmit_files.splitlines()):
sys.exit(1)
if __name__ == '__main__':
main()