#!/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" ] cvsdir = "/home/pld/admins/th/" cmd = ['cvs', '-Q', '-z3', '-d:pserver:cvs@cvs.pld-linux.org:/cvsroot', 'ls', '-l', 'packages'] p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (out, err) = p.communicate(None) re_dir = re.compile('^(.*)\s+\(directory\)') packages = [] i = 0 j = 0 for line in out.split('\n'): m = re_dir.match(line) if not m: continue if j == 0: packages.append([]) spec = m.group(1).strip() packages[i].append('packages/' + spec + '/' + spec + '.spec') j = j + 1 if j > 100: i = i + 1 j = 0 os.chdir(cvsdir) for p in packages: cmd = ['cvs', '-Q', '-z3', '-d:pserver:cvs@cvs.pld-linux.org:/cvsroot', 'co'] + p ret = subprocess.call(cmd) 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" ' + cvsdir + '/packages/' + name + '/' + 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 "CVS: %s %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 "CVS: %s %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()