From 4fa927dbf75145dd65de26f02fa89e05e7eee7b1 Mon Sep 17 00:00:00 2001 From: Jan Rękorajski Date: Fri, 4 Jan 2019 21:04:50 +0900 Subject: Use RPM Python API for spec parsing diff --git a/wwwbin/ftp-freshness.py b/wwwbin/ftp-freshness.py index aa27b37..2e52da2 100755 --- a/wwwbin/ftp-freshness.py +++ b/wwwbin/ftp-freshness.py @@ -3,9 +3,10 @@ import os import re -import struct import rpm +import struct import subprocess +import sys # earlier == more important dirs = [ "/home/ftp/pub/Linux/PLD/dists/th/test/SRPMS/RPMS/", @@ -23,7 +24,6 @@ else: 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): @@ -32,6 +32,21 @@ class Pkgs(object): self.cvs_new_nvr = [] self.cvs_new_nv = [] self.re_n = re.compile('^(.*)-([^-]*)-([^-]*)\.src\.rpm$') + 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', '#') + self.ts = rpm.ts() + + def __clean_macros(self): + for macro in ['rel', '_rel', 'snap', '_snap', 'rc', '_rc', 'subver', 'githash']: + rpm.delMacro(macro) + macros = rpm.getMacros() + for macro in macros.iterkeys(): + if macro.startswith('with_') or macro.startswith('without_'): + rpm.delMacro(macro.split()[0]) def __get_from_rpm(self, file_name): m = self.re_n.match(file_name) @@ -43,12 +58,21 @@ class Pkgs(object): 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) + spec = os.path.join(specsdir, name + '.spec') + if not os.path.isfile(spec): + print >>sys.stderr, 'Spec file does not exist: %s' % spec + return ('','','') + print >>sys.stderr, 'Processing: %s.spec' % name + self.__clean_macros() + try: + s = self.ts.parseSpec(spec) + headers = s.headers() + name, version, release = headers[0].sprintf('%{name};%{version};%{release}').split(';') + release = release.partition('@')[0] + return (name, version, release) + except rpm.error: + print >>sys.stderr, 'Failed to parse: %s.spec' % name + return ('','','') def __update_cvs(self, name): if not self.cvs.has_key(name): -- cgit v0.10.2