]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blobdiff - wwwbin/ftp-freshness.py
Fix outdated syntax
[projects/pld-ftp-admin.git] / wwwbin / ftp-freshness.py
old mode 100644 (file)
new mode 100755 (executable)
index 5e2d33c..1f71180
@@ -1,20 +1,22 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # arekm, 2007
 
+from __future__ import print_function
+
 import os
-import re
-import struct
 import rpm
 import subprocess
+import sys
 
 # 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/" ]
+         "/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" ]
 specsdir = "/home/pld/admins/th/SPECS"
 
 if os.path.isdir(specsdir):
+    os.chdir(specsdir)
     cmd = ['git', 'pull']
 else:
     cmd = ['git', 'clone', '--depth=1', 'git://git.pld-linux.org/SPECS', specsdir]
@@ -22,100 +24,148 @@ 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):
-               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" ' + 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)
-
-       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 "GIT: %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 "GIT: %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 __init__(self):
+        self.pkg = {}
+        self.cvs = {}
+        self.cvs_new_nvr = []
+        self.cvs_new_nv = []
+        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', '#')
+        rpm.setVerbosity(rpm.RPMLOG_ERR)
+        if sys.version_info[0] == 2:
+            self.ts = rpm.ts()
+
+    def __print_stderr(self, msg):
+        if sys.version_info[0] == 3:
+            print(msg, file=sys.stderr, flush=True)
+        else:
+            print(msg, file=sys.stderr)
+
+    def __clean_macros(self):
+        if sys.version_info[0] == 3:
+            rpm.reloadConfig()
+        for macro in ['rel', '_rel', 'snap', '_snap', 'rc', '_rc', 'subver', 'githash']:
+            rpm.delMacro(macro)
+        if sys.version_info[0] == 2:
+            macros = rpm.getMacros()
+            for macro in iter(macros.keys()):
+                if macro[:5] == 'with_' or macro[:8] == 'without_':
+                    rpm.delMacro(macro.split()[0])
+
+    def __get_from_cvs(self, name):
+        spec = os.path.join(specsdir, name + '.spec')
+        if not os.path.isfile(spec):
+            self.__print_stderr('Spec file does not exist: %s' % spec)
+            return ('','','')
+        self.__print_stderr('Processing: %s.spec' % name)
+        self.__clean_macros()
+        try:
+            if sys.version_info[0] == 2:
+                s = self.ts.parseSpec(spec)
+                header = s.headers()[0]
+            else:
+                s = rpm.spec(spec)
+                header = s.sourceHeader
+            name = header[rpm.RPMTAG_NAME]
+            version = header[rpm.RPMTAG_VERSION]
+            release = header[rpm.RPMTAG_RELEASE].partition('@')[0]
+            return (name, version, release)
+        except (ValueError, rpm.error):
+            self.__print_stderr('Failed to parse: %s.spec' % name)
+            return ('','','')
+
+    def __update_cvs(self, name):
+        if name not in self.cvs:
+            self.cvs[name] = self.__get_from_cvs(name)
+
+    def __update_new(self, name):
+        cvs_nvr = self.cvs[name]
+        pkg_nvr = self.pkg[name]
+
+        try:
+            cvs_rpm_vr = rpm.labelCompare(cvs_nvr, pkg_nvr)
+        except ValueError:
+            cvs_rpm_vr = -1
+        try:
+            cvs_rpm_v = rpm.labelCompare((cvs_nvr[0], cvs_nvr[1], ""), (pkg_nvr[0], pkg_nvr[1], ""))
+        except ValueError:
+            cvs_rpm_v = -1
+
+        if cvs_rpm_v > 0:
+            self.cvs_new_nv.append(name)
+            return
+        if cvs_rpm_vr > 0:
+            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 = tuple(file_name.rsplit('-', 2))
+        name = nvr[0]
+        if name in self.pkg:
+            try:
+                if rpm.labelCompare(nvr, self.pkg[name]) > 0:
+                    self.pkg[name] = nvr
+            except ValueError:
+                pass
+        else:
+            self.pkg[name] = nvr
+        self.__update_cvs(name)
+
+    def print_nvr(self):
+        ver_int = "*** VERSION-RELEASE COMPARE FOR THE SAME VERSIONS ONLY ***\n"
+        ver_frac = "*** PACKAGES WITH FRACTIONAL RELEASE ***\n"
+        for name in self.cvs_new_nvr:
+            self.cvs_new_nvr.sort()
+            cvs_nvr = self.cvs[name]
+            pkg_nvr = self.pkg[name]
+            msg = "GIT: [%s.spec] %s-%s-%s vs FTP: %s-%s-%s\n" % (name, cvs_nvr[0], cvs_nvr[1], cvs_nvr[2], pkg_nvr[0], pkg_nvr[1], pkg_nvr[2])
+            if '.' in cvs_nvr[2]:
+                ver_frac += msg
+            else:
+                ver_int += msg
+        print(ver_int)
+        print(ver_frac)
+
+    def print_nv(self):
+        ver_int = "*** VERSION COMPARE ONLY ***\n"
+        ver_frac = "*** PACKAGES WITH FRACTIONAL RELEASE ***\n"
+        self.cvs_new_nv.sort()
+        for name in self.cvs_new_nv:
+            cvs_nvr = self.cvs[name]
+            pkg_nvr = self.pkg[name]
+            msg = "GIT: [%s.spec] %s-%s-%s vs FTP: %s-%s-%s\n" % (name, cvs_nvr[0], cvs_nvr[1], cvs_nvr[2], pkg_nvr[0], pkg_nvr[1], pkg_nvr[2])
+            if '.' in cvs_nvr[2]:
+                ver_frac += msg
+            else:
+                ver_int += msg
+        print(ver_int)
+        print(ver_frac)
 
 p = Pkgs()
 
 for d in dirs:
-       for rpm_file_name in os.listdir(d):
-               p.add_rpm(rpm_file_name)
+    rpm_files = [f for f in os.listdir(d) if f[-8:] == '.src.rpm']
+    for rpm_file_name in rpm_files:
+        p.add_rpm(rpm_file_name[:-8])
 
 p.prepare()
 
 p.print_nv()
-print "\n\n"
+print("\n\n")
 p.print_nvr()
This page took 0.084607 seconds and 4 git commands to generate.