diff options
author | Jan Rękorajski | 2019-01-04 12:04:50 (GMT) |
---|---|---|
committer | Jan Rękorajski | 2019-01-04 12:04:50 (GMT) |
commit | 4fa927dbf75145dd65de26f02fa89e05e7eee7b1 (patch) | |
tree | b35cf4fd595e231605fd8c7950aa9c51c2096c59 | |
parent | d498ed50ba557d202afcc07c2df3887d56ed00b5 (diff) | |
download | pld-ftp-admin-4fa927dbf75145dd65de26f02fa89e05e7eee7b1.zip pld-ftp-admin-4fa927dbf75145dd65de26f02fa89e05e7eee7b1.tar.gz |
Use RPM Python API for spec parsing
-rwxr-xr-x | wwwbin/ftp-freshness.py | 40 |
1 files changed, 32 insertions, 8 deletions
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): |