diff --git a/support/scripts/pkg-stats b/support/scripts/pkg-stats index b7b00e8634..1f983feb5c 100755 --- a/support/scripts/pkg-stats +++ b/support/scripts/pkg-stats @@ -24,8 +24,10 @@ from collections import defaultdict 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: @@ -43,10 +45,29 @@ 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 @@ -255,6 +276,16 @@ def package_init_make_info(): 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: @@ -311,6 +342,15 @@ td.somepatches { td.lotsofpatches { background: #ff9a69; } +td.good_url { + background: #d2ffc4; +} +td.missing_url { + background: #ffd870; +} +td.invalid_url { + background: #ff9a69; +} Statistics of Buildroot packages @@ -422,6 +462,20 @@ def dump_html_pkg(f, pkg): f.write(" %d\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 = "%s" % (pkg.url, pkg.url_status) + else: + td_class.append("good_url") + url_str = "Link" % pkg.url + f.write(" %s\n" % + (" ".join(td_class), url_str)) + f.write(" \n") @@ -437,6 +491,7 @@ def dump_html_all_pkgs(f, packages): Hash file Current version Warnings +Upstream URL """) for pkg in sorted(packages): @@ -517,6 +572,8 @@ def __main__(): 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")