esphome/script/build_codeowners.py
2020-07-25 15:57:18 +02:00

69 lines
1.9 KiB
Python
Executable File

#!/usr/bin/env python3
from pathlib import Path
import sys
import argparse
from esphome.helpers import write_file_if_changed
from esphome.config import get_component
from esphome.core import CORE
parser = argparse.ArgumentParser()
parser.add_argument('--check', help="Check if the CODEOWNERS file is up to date.",
action='store_true')
args = parser.parse_args()
# The root directory of the repo
root = Path(__file__).parent.parent
components_dir = root / 'esphome' / 'components'
BASE = """
# This file is generated by script/build_codeowners.py
# People marked here will be automatically requested for a review
# when the code that they own is touched.
#
# Every time an issue is created with a label corresponding to an integration,
# the integration's code owner is automatically notified.
# Core Code
setup.py @esphome/core
esphome/*.py @esphome/core
esphome/core/* @esphome/core
# Integrations
""".strip()
parts = [BASE]
# Fake some diretory so that get_component works
CORE.config_path = str(root)
for path in sorted(components_dir.iterdir()):
if not path.is_dir():
continue
if not (path / '__init__.py').is_file():
continue
name = path.name
comp = get_component(name)
if comp.codeowners:
for owner in comp.codeowners:
if not owner.startswith('@'):
print(f"Codeowner {owner} for integration {name} must start with an '@' symbol!")
sys.exit(1)
parts.append(f"esphome/components/{name}/* {' '.join(comp.codeowners)}")
# End newline
parts.append('')
content = '\n'.join(parts)
codeowners_file = root / 'CODEOWNERS'
if args.check:
if codeowners_file.read_text() != content:
print("CODEOWNERS file is not up to date.")
print("Please run `script/build_codeowners.py`")
sys.exit(1)
print("CODEOWNERS file is up to date")
else:
write_file_if_changed(codeowners_file, content)
print("Wrote CODEOWNERS")