import re
import subprocess
import sys
+import requests # URL checking
INFRA_RE = re.compile("\$\(eval \$\(([a-z-]*)-package\)\)")
+URL_RE = re.compile("\s*https?://\S*\s*$")
class Package:
self.patch_count = 0
self.warnings = 0
self.current_version = None
+ self.url = None
+ self.url_status = None
def pkgvar(self):
return self.name.upper().replace("-", "_")
+ def set_url(self):
+ """
+ Fills in the .url field
+ """
+ self.url_status = "No Config.in"
+ for filename in os.listdir(os.path.dirname(self.path)):
+ if fnmatch.fnmatch(filename, 'Config.*'):
+ fp = open(os.path.join(os.path.dirname(self.path), filename), "r")
+ for config_line in fp:
+ if URL_RE.match(config_line):
+ self.url = config_line.strip()
+ self.url_status = "Found"
+ fp.close()
+ return
+ self.url_status = "Missing"
+ fp.close()
+
def set_infra(self):
"""
Fills in the .infras field
Package.all_versions[pkgvar] = value
+def check_url_status(pkg):
+ if pkg.url_status != "Missing" and pkg.url_status != "No Config.in":
+ try:
+ url_status_code = requests.head(pkg.url, timeout=5).status_code
+ if url_status_code >= 400:
+ pkg.url_status = "Invalid(%s)" % str(url_status_code)
+ except requests.exceptions.RequestException:
+ return
+
+
def calculate_stats(packages):
stats = defaultdict(int)
for pkg in packages:
td.lotsofpatches {
background: #ff9a69;
}
+td.good_url {
+ background: #d2ffc4;
+}
+td.missing_url {
+ background: #ffd870;
+}
+td.invalid_url {
+ background: #ff9a69;
+}
</style>
<title>Statistics of Buildroot packages</title>
</head>
f.write(" <td class=\"%s\">%d</td>\n" %
(" ".join(td_class), pkg.warnings))
+ # URL status
+ td_class = ["centered"]
+ url_str = pkg.url_status
+ if pkg.url_status == "Missing" or pkg.url_status == "No Config.in":
+ td_class.append("missing_url")
+ elif pkg.url_status.startswith("Invalid"):
+ td_class.append("invalid_url")
+ url_str = "<a href=%s>%s</a>" % (pkg.url, pkg.url_status)
+ else:
+ td_class.append("good_url")
+ url_str = "<a href=%s>Link</a>" % pkg.url
+ f.write(" <td class=\"%s\">%s</td>\n" %
+ (" ".join(td_class), url_str))
+
f.write(" </tr>\n")
<td class=\"centered\">Hash file</td>
<td class=\"centered\">Current version</td>
<td class=\"centered\">Warnings</td>
+<td class=\"centered\">Upstream URL</td>
</tr>
""")
for pkg in sorted(packages):
pkg.set_patch_count()
pkg.set_check_package_warnings()
pkg.set_current_version()
+ pkg.set_url()
+ check_url_status(pkg)
print("Calculate stats")
stats = calculate_stats(packages)
print("Write HTML")