Files
scripts/maintainer-checks/maintainers.py
Paul Keith 63b1b6f833 maintainers: Add optional checking of jira developer status
* Also unify code style a bit

Change-Id: Ibc3a23aa07d6c17db9e042e0b6b298844d0edfeb
2017-08-07 15:20:06 +00:00

150 lines
5.3 KiB
Python
Executable File

#!/usr/bin/python3
import yaml
import re
import os
import json
import argparse
mydir = os.path.dirname(os.path.abspath(__file__))
parser = argparse.ArgumentParser()
parser.add_argument('-m', '--maintainers', help='list maintainers for devices', action='store_true', required=False)
parser.add_argument('-j', '--jira', dest="jira_file", required=False, help='Path to list of jira developers', metavar='FILE')
args = parser.parse_args()
# Paths to certain repos
repo = {
"updater": "../../updater",
"wiki": "../../wiki",
"hudson": "../../jenkins",
"cve": "../../cve"
}
# List of all codenames in hudson
codenames = []
# List of devices in cve tracker
cve_entries = []
# List of devices with updater pages
updater_pages = []
# List of jira developers
jira_devs = []
# Open file and input lines as items in list
hudson_file = os.path.join(mydir, repo["hudson"] + "/lineage-build-targets")
with open(hudson_file) as f:
for line in f:
# Ignore blank lines or lines with comments
if re.match(r"^\s*$", line) or re.match(r"#", line):
continue
# Add codenames to list
codenames.append(re.sub(r" .*", "", line.strip()))
# Sort codenames alphabetically
codenames.sort()
# Create list of devices in cve tracker
cve_json_file = os.path.join(mydir, repo["cve"] + "/kernels.json")
with open(cve_json_file) as f:
json_file = json.load(f)
for kernel in json_file:
for device in json_file[kernel]:
device = re.sub(r"android_device_[a-zA-Z0-9]*_", "", device)
cve_entries.append(device)
# CVE tracker checking
for codename in codenames:
if codename not in cve_entries:
print("{} doesn't have an entry in the CVE tracker".format(codename))
# Create list of updater pages
updater_json_file = os.path.join(mydir, repo["updater"] + "/devices.json")
with open(updater_json_file) as f:
json_file = json.load(f)
for device in json_file:
updater_pages.append(device["model"])
# Updater checking
for codename in codenames:
if codename not in updater_pages:
print("{} doesn't have an updater page".format(codename))
# Wiki checking
for codename in codenames:
wiki_yml_file = os.path.join(mydir, repo["wiki"] + "/_data/devices/" + codename + ".yml")
try:
with open(wiki_yml_file) as f:
yml = yaml.load(f)
except FileNotFoundError:
print("{} doesn't have a wiki page".format(codename))
continue
try:
if not yml["maintainers"]:
print("{} doesn't have a maintainer listed".format(codename))
except KeyError:
print("{} doesn't have a maintainers field".format(codename))
try:
if not yml["install_method"] or "TODO" in yml["install_method"]:
print("{} doesn't have an install method listed".format(codename))
elif "fastboot_generic" in yml["install_method"]:
print("{} uses fastboot_generic install method".format(codename))
elif "dd" in yml["install_method"]:
try:
if not yml["recovery_partition"]:
print("{} doesn't have a recovery partition listed".format(codename))
except KeyError:
print("{} doesn't have a recovery partition field".format(codename))
try:
if not yml["root_method"]:
print("{} doesn't have a root method listed".format(codename))
except KeyError:
print("{} doesn't have a root method field".format(codename))
except KeyError:
print("{} doesn't have an install method field".format(codename))
try:
if yml["twrp_site"]:
print("{} uses unofficial TWRP".format(codename))
except KeyError:
pass
# Optionally print out all maintainer info
if args.maintainers:
print("---------------MAINTAINER INFO DUMP---------------")
for codename in codenames:
wiki_yml_file = os.path.join(mydir, repo["wiki"] + "/_data/devices/" + codename + ".yml")
toprint = "{}:".format(codename)
try:
with open(wiki_yml_file) as f:
yml = yaml.load(f)
except FileNotFoundError:
# Skip devices without wiki pages, we already errored about it
continue
try:
for maintainer in yml["maintainers"]:
toprint += ", {}".format(maintainer)
except KeyError:
# Skip devices without maintainer fields, we already errored about it
continue
print(toprint.replace(":,", ":"))
if args.jira_file:
with open(args.jira_file) as f:
for line in f:
jira_devs.append(line.strip())
for codename in codenames:
wiki_yml_file = os.path.join(mydir, repo["wiki"] + "/_data/devices/" + codename + ".yml")
try:
with open(wiki_yml_file) as f:
yml = yaml.load(f)
except FileNotFoundError:
# Skip devices without wiki pages, we already errored about it
continue
try:
for maintainer in yml["maintainers"]:
if maintainer not in jira_devs:
print("{} is listed as a maintainer for {} but doesn't have a jira developer account".format(maintainer, codename))
except KeyError:
# Skip devices without maintainer fields, we already errored about it
continue