#!/usr/bin/python # arekm, 2007 import os import re import struct import rpm import subprocess # 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 = [] self.re_n = re.compile('^(.*)-([^-]*)-([^-]*)\.src\.rpm$') def __get_from_rpm(self, file_name): m = self.re_n.match(file_name) if not m: return False name = m.group(1).strip() version = m.group(2).strip() release = m.group(3).strip() return (name, version, release) def __get_from_cvs(self, name): f = os.popen('rpm --specfile -q --queryformat "%{name}\n%{version}\n%{release}\n" ' + specsdir + '/' + name + '.spec 2> /dev/null', 'r') name = f.readline().strip() version = f.readline().strip() release = f.readline().strip() f.close() return (name, version, release) def __update_cvs(self, name): if not self.cvs.has_key(name): self.cvs[name] = self.__get_from_cvs(name) def __update_new(self, name): cvs_nvr = self.cvs[name] pkg_nvr = self.pkg[name] cvs_rpm_vr = rpm.labelCompare((cvs_nvr[0], cvs_nvr[1], cvs_nvr[2]), (pkg_nvr[0], pkg_nvr[1], pkg_nvr[2])) cvs_rpm_v = rpm.labelCompare((cvs_nvr[0], cvs_nvr[1], ""), (pkg_nvr[0], pkg_nvr[1], "")) rpm_cvs_vr = rpm.labelCompare((pkg_nvr[0], pkg_nvr[1], pkg_nvr[2]), (cvs_nvr[0], cvs_nvr[1], cvs_nvr[2])) rpm_cvs_v = rpm.labelCompare((pkg_nvr[0], pkg_nvr[1], ""), (cvs_nvr[0], cvs_nvr[1], "")) if rpm_cvs_v < 0 and cvs_rpm_v > 0: self.cvs_new_nv.append(name) else: if rpm_cvs_vr < 0 and cvs_rpm_vr > 0 and cvs_nvr[1] == pkg_nvr[1]: 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 = self.__get_from_rpm(file_name) if not nvr: return False name = nvr[0] if self.pkg.has_key(name): if rpm.labelCompare(nvr, self.pkg[name]) > 0: del self.pkg[name] self.pkg[name] = nvr else: self.pkg[name] = nvr self.__update_cvs(name) def print_nvr(self): print "*** VERSION-RELEASE COMPARE FOR THE SAME VERSIONS ONLY ***" for name in self.cvs_new_nvr: self.cvs_new_nvr.sort() cvs_nvr = self.cvs[name] pkg_nvr = self.pkg[name] print "GIT: [%s.spec] %s-%s-%s vs FTP: %s-%s-%s" % (name, cvs_nvr[0], cvs_nvr[1], cvs_nvr[2], pkg_nvr[0], pkg_nvr[1], pkg_nvr[2]) def print_nv(self): print "*** VERSION COMPARE ONLY ***" self.cvs_new_nv.sort() for name in self.cvs_new_nv: cvs_nvr = self.cvs[name] pkg_nvr = self.pkg[name] print "GIT: [%s.spec] %s-%s-%s vs FTP: %s-%s-%s" % (name, cvs_nvr[0], cvs_nvr[1], cvs_nvr[2], pkg_nvr[0], pkg_nvr[1], pkg_nvr[2]) p = Pkgs() for d in dirs: for rpm_file_name in os.listdir(d): p.add_rpm(rpm_file_name) p.prepare() p.print_nv() print "\n\n" p.print_nvr()