#!/usr/bin/python3 # arekm, 2007 from __future__ import print_function import os import rpm import subprocess import sys # earlier == more important dirs = [ "/home/ftp/pub/Linux/PLD/dists/th/test/SRPMS/RPMS/", "/home/ftp/pub/Linux/PLD/dists/th/ready/SRPMS/RPMS/", "/home/ftp/pub/Linux/PLD/dists/th/PLD/SRPMS/RPMS/" ] #dirs = [ "/home/pld/admins/th/1" ] specsdir = "/home/pld/admins/th/SPECS" if os.path.isdir(specsdir): os.chdir(specsdir) cmd = ['git', 'pull'] else: cmd = ['git', 'clone', '--depth=1', 'git://git.pld-linux.org/SPECS', specsdir] p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (out, err) = p.communicate(None) os.chdir(specsdir) class Pkgs(object): def __init__(self): self.pkg = {} self.cvs = {} self.cvs_new_nvr = [] self.cvs_new_nv = [] rpm.addMacro('patch', '%{nil}') rpm.addMacro('requires_eq', '#') rpm.addMacro('requires_eq_to', '#') rpm.addMacro('requires_releq', '#') rpm.addMacro('requires_ge', '#') rpm.addMacro('requires_ge_to', '#') rpm.setVerbosity(rpm.RPMLOG_ERR) if sys.version_info[0] == 2: self.ts = rpm.ts() def __print_stderr(self, msg): if sys.version_info[0] == 3: print(msg, file=sys.stderr, flush=True) else: print(msg, file=sys.stderr) def __clean_macros(self): if sys.version_info[0] == 3: rpm.reloadConfig() for macro in ['rel', '_rel', 'snap', '_snap', 'rc', '_rc', 'subver', 'githash']: rpm.delMacro(macro) if sys.version_info[0] == 2: macros = rpm.getMacros() for macro in iter(macros.keys()): if macro[:5] == 'with_' or macro[:8] == 'without_': rpm.delMacro(macro.split()[0]) def __get_from_cvs(self, name): spec = os.path.join(specsdir, name + '.spec') if not os.path.isfile(spec): self.__print_stderr('Spec file does not exist: %s' % spec) return ('','','') self.__print_stderr('Processing: %s.spec' % name) self.__clean_macros() try: if sys.version_info[0] == 2: s = self.ts.parseSpec(spec) header = s.headers()[0] else: s = rpm.spec(spec) header = s.sourceHeader name = header[rpm.RPMTAG_NAME] version = header[rpm.RPMTAG_VERSION] release = header[rpm.RPMTAG_RELEASE].partition('@')[0] return (name, version, release) except (ValueError, rpm.error): self.__print_stderr('Failed to parse: %s.spec' % name) return ('','','') def __update_cvs(self, name): if name not in self.cvs: self.cvs[name] = self.__get_from_cvs(name) def __update_new(self, name): cvs_nvr = self.cvs[name] pkg_nvr = self.pkg[name] try: cvs_rpm_vr = rpm.labelCompare(cvs_nvr, pkg_nvr) except ValueError: cvs_rpm_vr = -1 try: cvs_rpm_v = rpm.labelCompare((cvs_nvr[0], cvs_nvr[1], ""), (pkg_nvr[0], pkg_nvr[1], "")) except ValueError: cvs_rpm_v = -1 if cvs_rpm_v > 0: self.cvs_new_nv.append(name) return if cvs_rpm_vr > 0: self.cvs_new_nvr.append(name) def prepare(self): self.cvs_new_nvr.sort() self.cvs_new_nvr = list(set(self.cvs_new_nvr)) self.cvs_new_nv.sort() self.cvs_new_nv = list(set(self.cvs_new_nv)) pkgs = list(self.pkg) + list(self.cvs) for name in list(set(pkgs)): self.__update_new(name) def add_rpm(self, file_name): nvr = tuple(file_name.rsplit('-', 2)) name = nvr[0] if name in self.pkg: try: if rpm.labelCompare(nvr, self.pkg[name]) > 0: self.pkg[name] = nvr except ValueError: pass else: self.pkg[name] = nvr self.__update_cvs(name) def print_nvr(self): ver_int = "*** VERSION-RELEASE COMPARE FOR THE SAME VERSIONS ONLY ***\n" ver_frac = "*** PACKAGES WITH FRACTIONAL RELEASE ***\n" for name in self.cvs_new_nvr: self.cvs_new_nvr.sort() cvs_nvr = self.cvs[name] pkg_nvr = self.pkg[name] msg = "GIT: [%s.spec] %s-%s-%s vs FTP: %s-%s-%s\n" % (name, cvs_nvr[0], cvs_nvr[1], cvs_nvr[2], pkg_nvr[0], pkg_nvr[1], pkg_nvr[2]) if '.' in cvs_nvr[2]: ver_frac += msg else: ver_int += msg print(ver_int) print(ver_frac) def print_nv(self): ver_int = "*** VERSION COMPARE ONLY ***\n" ver_frac = "*** PACKAGES WITH FRACTIONAL RELEASE ***\n" self.cvs_new_nv.sort() for name in self.cvs_new_nv: cvs_nvr = self.cvs[name] pkg_nvr = self.pkg[name] msg = "GIT: [%s.spec] %s-%s-%s vs FTP: %s-%s-%s\n" % (name, cvs_nvr[0], cvs_nvr[1], cvs_nvr[2], pkg_nvr[0], pkg_nvr[1], pkg_nvr[2]) if '.' in cvs_nvr[2]: ver_frac += msg else: ver_int += msg print(ver_int) print(ver_frac) p = Pkgs() for d in dirs: rpm_files = [f for f in os.listdir(d) if f[-8:] == '.src.rpm'] for rpm_file_name in rpm_files: p.add_rpm(rpm_file_name[:-8]) p.prepare() p.print_nv() print("\n\n") p.print_nvr()