#!/usr/bin/python import sys import os import os.path import re import logging logging.basicConfig() logger=logging.getLogger("release") logger.setLevel(logging.DEBUG) RPMMATCH=re.compile("^(?P.*)-(?P[^-]+)-(?P[^-]+)\.(?P[^-]+)\.rpm$") def rpmsplit(filename): regexp=RPMMATCH.match(filename) if regexp: return regexp.groupdict() else: return None def matchIncludePatterns(patterns, file): _match=False if patterns: for _pattern in patterns: if file == _pattern: _match=True break elif re.match(_pattern, file): _match=True break else: _match=True return _match def genlatest(path, latestrpms, includepatterns=None, subpath=""): logger.debug("Searching in %s, includepatterns: %s" %(os.path.join(path, subpath), includepatterns)) for file in os.listdir(os.path.join(path, subpath)): if os.path.splitext(file)[1] == ".rpm" and matchIncludePatterns(includepatterns, file): logger.debug("File: %s" %file) _rpmmeta1=rpmsplit(file) logger.debug("Found: %s" %_rpmmeta1) if latestrpms.has_key(_rpmmeta1["name"]) and latestrpms[_rpmmeta1["name"]].has_key(_rpmmeta1["architecture"]): _rpmmeta2=latestrpms[_rpmmeta1["name"]][_rpmmeta1["architecture"]] _rev1=_rpmmeta1["revision"] _rev2=_rpmmeta2["revision"] try: __rev1=int(_rev1) __rev2=int(_rev2) _rev1=__rev1 _rev2=__rev2 except: pass if _rpmmeta1["architecture"] == _rpmmeta2["architecture"] and (_rpmmeta1["version"] > _rpmmeta2["version"] or (_rpmmeta1["version"] == _rpmmeta2["version"] and _rev1 > _rev2)): latestrpms[_rpmmeta1["name"]][_rpmmeta1["architecture"]]= _rpmmeta1 latestrpms[_rpmmeta1["name"]][_rpmmeta1["architecture"]]["file"]=os.path.join(subpath, file) else: if not latestrpms.has_key(_rpmmeta1["name"]): latestrpms[_rpmmeta1["name"]]=dict() latestrpms[_rpmmeta1["name"]][_rpmmeta1["architecture"]]=_rpmmeta1 latestrpms[_rpmmeta1["name"]][_rpmmeta1["architecture"]]["file"]=os.path.join(subpath, file) elif os.path.isdir(os.path.join(path, subpath, file)): logger.debug("Expanding to subpath: %s" %(os.path.join(subpath, file))) genlatest(path, latestrpms, includepatterns, os.path.join(subpath, file)) def releaseRPM(actleveldir, newleveldir, rpm, createtree=True): import shutil logger.info("Releasing rpm %s" %(rpm)) if createtree and not os.path.exists(newleveldir): os.mkdir(newleveldir) try: shutil.copy(os.path.join(actleveldir, rpm), os.path.join(newleveldir, rpm)) except OSError, oe: logger.error("Could not copy file %s, error: %s" %(rpm, oe)); def usage(): print "%s actleveldir newleveldir [includepattern]*" %sys.argv[0] print """ Copies the latest rpm files from actleveldir to newleveldir. If includepatterns given (regexp supported) only the files which match one of the patterns are copied.""" if len(sys.argv)<=2: print "Wrong number of parameters" usage() sys.exit(1) actleveldir=sys.argv[1] newleveldir=sys.argv[2] includepatterns=sys.argv[3:] if not actleveldir or not newleveldir: usage() sys.exit(1) latestrpms=dict() genlatest(actleveldir, latestrpms, includepatterns) logger.info("Releasing from %s to %s" %(actleveldir, newleveldir)) for rpmmeta in latestrpms.values(): for arch in rpmmeta.values(): file=arch["file"] releaseRPM(actleveldir, newleveldir, file)