From 55f761496835c56417995ddefaf41d313fb2cda5 Mon Sep 17 00:00:00 2001 From: Jason Pepas Date: Fri, 25 Aug 2006 13:54:46 +0000 Subject: Added 'get_pkgs2()' to rpmlisting.py, which parses rpm filenames instead of using the rpm command to read rpm meta data. On my machine, this resulted in a runtime reduction from half an hour to 3 seconds. git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@2110 ce84e21b-d406-0410-9b95-82705330c041 --- tools/rpmlisting.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'tools') diff --git a/tools/rpmlisting.py b/tools/rpmlisting.py index c6347e97b..1f23e9905 100644 --- a/tools/rpmlisting.py +++ b/tools/rpmlisting.py @@ -137,6 +137,29 @@ pkgs = { return pkgs +def get_pkgs2(rpmdir): + """scan a dir of rpms and generate a pkgs structure. this version parses the filenames directly instead of reading their metadata. on my machine, this brought runtime from half an hour down to 3 seconds.""" + pkgs = {} + rpms = [item for item in os.listdir(rpmdir) if item.endswith('.rpm')] + for filename in rpms: + name, version, release, arch = None, None, None, None + (major, minor) = sys.version_info[:2] + if major >= 2 and minor >= 4: + (blob, arch, extension) = filename.rsplit('.', 2) + (name, version, release) = blob.rsplit('-', 2) + else: + (rextension, rarch, rblob) = filename[::-1].split('.', 2) + (blob, arch, extension) = (rblob[::-1], rarch[::-1], rextension[::-1]) + (rrelease, rversion, rname) = blob[::-1].split('-', 2) + (name, version, release) = (rname[::-1], rversion[::-1], rrelease[::-1]) + rpmblob = {'file':filename, 'name':name, 'version':version, 'release':release, 'arch':arch} + if pkgs.has_key(name): + pkgs[name].append(rpmblob) + else: + pkgs[name] = [rpmblob] + return pkgs + + def prune_pkgs(pkgs): """prune a pkgs structure to contain only the latest version of each package (includes multiarch results).""" latest_pkgs = {} @@ -189,7 +212,7 @@ def scan_rpm_dir(rpmdir, uri, group, priority=0, output=sys.stdout): """the meat of this library.""" output.write('\n' % (uri, priority)) output.write(' \n' % group) - pkgs = prune_archs(prune_pkgs(get_pkgs(rpmdir))) + pkgs = prune_archs(prune_pkgs(get_pkgs2(rpmdir))) for rpmblobs in sorted_values(pkgs): if len(rpmblobs) == 1: # regular pkgmgr entry -- cgit v1.2.3-1-g7c22