summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Rękorajski2019-01-04 12:04:50 (GMT)
committerJan Rękorajski2019-01-04 12:04:50 (GMT)
commit4fa927dbf75145dd65de26f02fa89e05e7eee7b1 (patch)
treeb35cf4fd595e231605fd8c7950aa9c51c2096c59
parentd498ed50ba557d202afcc07c2df3887d56ed00b5 (diff)
downloadpld-ftp-admin-4fa927dbf75145dd65de26f02fa89e05e7eee7b1.zip
pld-ftp-admin-4fa927dbf75145dd65de26f02fa89e05e7eee7b1.tar.gz
Use RPM Python API for spec parsing
-rwxr-xr-xwwwbin/ftp-freshness.py40
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):