# Class to facilitate sorting RPM packages based on version and # release by splitting the version and release into tuples with # numeric and non-numeric parts. # # This is based on code from the O'Reilly Python Cookbook, which # I don't have handy to cite the page number. # import os, re rpmcmd = '/bin/rpm' _fmt = r"--queryformat='%{NAME}:%{VERSION}:%{RELEASE}:%{ARCH}\n'" _digits = re.compile(r'(\d+)'); class RPM(object): def _ver(self, s): parts = [] for part in s.split('.'): r = _digits.split(part) r[1::2] = [int(p) for p in r[1::2]] parts.append(tuple(r)) return(tuple(parts)) def __init__(self, file=None, name=None, query=None): if not query: if file: cmd = '%s -qp %s %s' % (rpmcmd, _fmt, file) self.file = file else: cmd = '%s -q %s %s' % (rpmcmd, _fmt, name) self.file = 'installed' fh = os.popen(cmd) query = fh.readline().strip() fh.close() self.query = query (self.name, version, release, self.arch) = query.split(':') self._version = version self._release = release self.version = self._ver(version) self.release = self._ver(release) self.ver_rel = (self.version, self.release) def __cmp__(self, other): assert isinstance(other, RPM) return(cmp(self.ver_rel, other.ver_rel)) if __name__ == '__main__': print 'OK'; print rpmcmd print _fmt rpm = RPM(name='python') print rpm.query; print rpm.name print rpm.version print rpm.release print rpm.ver_rel print rpm.arch print rpm.__cmp__(rpm)