tools/yumfind: support provides other then name

Requested dependency should not necessary match actual package name --
it might be provided by RPM with different name. Now yumfind supports
this case.

Change-Id: I7858c3ee2973fcad64af2d10f3e3ed0e876d878e
This commit is contained in:
Ivan A. Melnikov 2013-09-27 18:25:06 +03:00
parent 2c2df6e905
commit 2517672d5d
2 changed files with 12 additions and 6 deletions

View File

@ -697,7 +697,7 @@ class YumDependencyHandler(base.DependencyHandler):
if matched:
pkg = json.loads(matched)
if isinstance(pkg, dict):
rpm_names_located.add(pkg['name'])
rpm_names_located.add(pkg['req_name'])
rpms_located.append(pkg)
rpm_names_missing = desired_rpm_names - rpm_names_located

View File

@ -28,11 +28,12 @@ import pkg_resources
from yum import YumBase
def format_rpm(pkg):
def format_rpm(pkg, rpm_name):
details = {
'arch': pkg.arch,
'epoch': pkg.epoch,
'name': pkg.name,
'req_name': rpm_name,
'release': pkg.release,
'version': pkg.version,
}
@ -47,8 +48,8 @@ def parse_py_req(text):
return pkg_resources.Requirement.parse(text)
def find_matches(base, rpm_name, py_req=None):
rpms = base.doPackageLists(patterns=[rpm_name], ignore_case=True,
def build_yum_map(base):
rpms = base.doPackageLists(ignore_case=True,
showdups=True)
all_rpms = []
all_rpms.extend(rpms.available)
@ -60,7 +61,11 @@ def find_matches(base, rpm_name, py_req=None):
for rpm in all_rpms:
for provides in rpm.provides:
yum_map[provides[0]].append((rpm.version, rpm))
return dict(yum_map)
def find_matches(yum_map, rpm_name, py_req=None):
rpm_matches = []
for (version, rpm) in yum_map.get(rpm_name, []):
if py_req is None or version in py_req:
@ -92,14 +97,15 @@ if __name__ == '__main__':
examine_what.append((rpm_name, None))
base = YumBase()
base.doConfigSetup(debuglevel=-1, errorlevel=-1)
yum_map = build_yum_map(base)
for (rpm_name, py_req) in examine_what:
req = parse_py_req(py_req)
matches = find_matches(base, rpm_name, req)
matches = find_matches(yum_map, rpm_name, req)
if matches:
# Pick the newest match.
pkg = sorted(matches)[-1]
if options.is_json:
print(json.dumps(format_rpm(pkg)))
print(json.dumps(format_rpm(pkg, rpm_name)))
else:
print(pkg)
else: