From f6e2882b445a7c81679b649c03e4a4d2130ff85c Mon Sep 17 00:00:00 2001 From: Corentin Chary Date: Mon, 6 Aug 2012 23:30:29 +0200 Subject: [PATCH] euscan: optimize SRC_URI fetching Signed-off-by: Corentin Chary --- pym/euscan/out.py | 22 +++++++++++++++++-- pym/euscan/scan.py | 54 ++++++++++++++++++++++++++++------------------ 2 files changed, 53 insertions(+), 23 deletions(-) diff --git a/pym/euscan/out.py b/pym/euscan/out.py index 65947ee..ab97b69 100644 --- a/pym/euscan/out.py +++ b/pym/euscan/out.py @@ -10,6 +10,7 @@ import portage from portage.output import EOutput, TermProgressBar from gentoolkit import pprinter as pp +mirrors_ = None class ProgressHandler(object): def __init__(self, progress_bar): @@ -96,10 +97,27 @@ def to_ebuild_uri(cpv, url): url = url.replace(src, '${%s}' % dst) return url +def from_mirror(url): + if not url.startswith('mirror://'): + return url + + global mirrors_ + if mirrors_ is None: + mirrors_ = portage.settings.thirdpartymirrors() + + for mirror_name in mirrors_: + prefix = 'mirror://' + mirror_name + if url.startswith(prefix): + return url.replace(prefix, mirrors_[mirror_name][0]) + + return url def to_mirror(url): - mirrors = portage.settings.thirdpartymirrors() - for mirror_name in mirrors: + global mirrors_ + if mirrors_ is None: + mirrors_ = portage.settings.thirdpartymirrors() + + for mirror_name in mirrors_: for mirror_url in mirrors[mirror_name]: if url.startswith(mirror_url): url_part = url.split(mirror_url)[1] diff --git a/pym/euscan/scan.py b/pym/euscan/scan.py index a55c6d9..cbbd97f 100644 --- a/pym/euscan/scan.py +++ b/pym/euscan/scan.py @@ -13,6 +13,7 @@ from gentoolkit.package import Package from euscan import CONFIG, BLACKLIST_PACKAGES from euscan import handlers, output +from euscan.out import from_mirror from euscan.helpers import version_blacklisted from euscan.version import is_version_stable from euscan.ebuild import package_from_ebuild @@ -43,6 +44,31 @@ def filter_versions(cp, versions): for version in filtered ] +def parse_src_uri(uris): + ret = {} + + uris = uris.split() + uris.reverse() + while uris: + uri = uris.pop() + + if '://' not in uri: + continue + if 'mirror://' in uri: + uri = from_mirror(uri) + + if uris and uris[-1] == "->": + operator = uris.pop() + file = uris.pop() + else: + file = os.path.basename(uri) + + if file not in ret: + ret[file] = [] + + ret[file].append(uri) + + return ret def scan_upstream(query, on_progress=None): """ @@ -110,30 +136,16 @@ def scan_upstream(query, on_progress=None): "ebuild", pp.path(os.path.normpath(ebuild_path)) ) + uris, homepage, description = pkg.environment(('SRC_URI', 'HOMEPAGE', 'DESCRIPTION')) + output.metadata("repository", pkg.repo_name()) - output.metadata("homepage", pkg.environment("HOMEPAGE")) - output.metadata("description", pkg.environment("DESCRIPTION")) + output.metadata("homepage", homepage) + output.metadata("description", description) + else: + uris = pkg.environment('SRC_URI') cpv = pkg.cpv - metadata = { - "EAPI": portage.settings["EAPI"], - "SRC_URI": pkg.environment("SRC_URI", False), - } - use = frozenset(portage.settings["PORTAGE_USE"].split()) - try: - alist = porttree._parse_uri_map(cpv, metadata, use=use) - aalist = porttree._parse_uri_map(cpv, metadata) - except Exception as e: - output.ewarn(pp.warn("%s\n" % str(e))) - output.ewarn( - pp.warn("Invalid SRC_URI for '%s'" % pp.pkgquery(cpv)) - ) - return None - - if "mirror" in portage.settings.features: - urls = aalist - else: - urls = alist + urls = parse_src_uri(uris) versions = handlers.scan(pkg, urls, on_progress)