euscan-ng/pym/euscan/scan.py
2012-05-05 14:28:48 +02:00

140 lines
3.7 KiB
Python

import os
import sys
import portage
from portage.dbapi import porttree
import gentoolkit.pprinter as pp
from gentoolkit.query import Query
from gentoolkit.eclean.search import (port_settings)
from euscan import CONFIG, BLACKLIST_PACKAGES
from euscan import handlers
from euscan import helpers
import euscan
def filter_versions(cp, versions):
filtered = {}
for url, version in versions:
''' Try to keep the most specific urls (determinted by the length) '''
if version in filtered and len(url) < len(filtered[version]):
continue
''' Remove blacklisted versions '''
if helpers.version_blacklisted(cp, version):
continue
filtered[version] = url
return [(cp, filtered[version], version) for version in filtered]
def scan_upstream_urls(cpv, urls):
versions = []
for filename in urls:
for url in urls[filename]:
if not CONFIG['quiet']:
pp.uprint()
euscan.output.einfo("SRC_URI is '%s'" % url)
if '://' not in url:
euscan.output.einfo("Invalid url '%s'" % url)
continue
''' Try normal scan '''
if CONFIG["scan-dir"]:
versions.extend(handlers.scan(cpv, url))
if versions and CONFIG['oneshot']:
break
''' Brute Force '''
if CONFIG["brute-force"] > 0:
versions.extend(handlers.brute_force(cpv, url))
if versions and CONFIG['oneshot']:
break
cp, ver, rev = portage.pkgsplit(cpv)
return filter_versions(cp, versions)
def scan_upstream(query):
# check if the query is an ebuild file.
# if it's a valid ebuild convert the filename in an euscan query
ebuild_query = helpers.query_from_ebuild(query)
if ebuild_query:
query = ebuild_query
matches = Query(query).find(
include_masked=True,
in_installed=False
)
if not matches:
sys.stderr.write(
pp.warn("No package matching '%s'" % pp.pkgquery(query))
)
return []
matches = sorted(matches)
pkg = matches.pop()
while '9999' in pkg.version and len(matches):
pkg = matches.pop()
if not pkg:
sys.stderr.write(pp.warn("Package '%s' only have a dev version (9999)"
% pp.pkgquery(pkg.cp)))
return []
if pkg.cp in BLACKLIST_PACKAGES:
sys.stderr.write(
pp.warn("Package '%s' is blacklisted" % pp.pkgquery(pkg.cp))
)
return []
if not CONFIG['quiet']:
pp.uprint(
" * %s [%s]" % (pp.cpv(pkg.cpv), pp.section(pkg.repo_name()))
)
pp.uprint()
ebuild_path = pkg.ebuild_path()
if ebuild_path:
pp.uprint('Ebuild: ' + pp.path(os.path.normpath(ebuild_path)))
pp.uprint('Repository: ' + pkg.repo_name())
pp.uprint('Homepage: ' + pkg.environment("HOMEPAGE"))
pp.uprint('Description: ' + pkg.environment("DESCRIPTION"))
cpv = pkg.cpv
metadata = {
"EAPI": port_settings["EAPI"],
"SRC_URI": pkg.environment("SRC_URI", False),
}
use = frozenset(port_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:
sys.stderr.write(pp.warn("%s\n" % str(e)))
sys.stderr.write(
pp.warn("Invalid SRC_URI for '%s'" % pp.pkgquery(cpv))
)
return []
if "mirror" in portage.settings.features:
urls = aalist
else:
urls = alist
return scan_upstream_urls(pkg.cpv, urls)