]> git.pld-linux.org Git - projects/pld-ftp-admin.git/commitdiff
Use RPM Python API for spec parsing
authorJan Rękorajski <baggins@pld-linux.org>
Fri, 4 Jan 2019 12:04:50 +0000 (21:04 +0900)
committerJan Rękorajski <baggins@pld-linux.org>
Fri, 4 Jan 2019 12:04:50 +0000 (21:04 +0900)
wwwbin/ftp-freshness.py

index aa27b376e97b7fa7b77f58a4d7131537276cfa4c..2e52da262e1c584e23ef6a3227ac89f8a347fba6 100755 (executable)
@@ -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):
This page took 1.750888 seconds and 4 git commands to generate.