summaryrefslogtreecommitdiffstats
path: root/maintainer-checks/maintainers.py
blob: 50befabc861bc6dd2370913f1a253b41bc7354d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/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"]:
            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