[packages/pldnotify] - port to puyhon3 / rpm.org rpm, rel 4.9

baggins baggins at pld-linux.org
Mon Feb 22 19:45:42 CET 2021


commit 622fe9f6c33f8f2cc60c8be62e494091bfee511f
Author: Jan Rękorajski <baggins at pld-linux.org>
Date:   Mon Feb 22 19:45:09 2021 +0100

    - port to puyhon3 / rpm.org rpm, rel 4.9

 pldnotify.py   | 116 +++++++++++++++++++++++++++++----------------------------
 pldnotify.spec |   8 ++--
 2 files changed, 63 insertions(+), 61 deletions(-)
---
diff --git a/pldnotify.spec b/pldnotify.spec
index 20de9f8..79b8880 100644
--- a/pldnotify.spec
+++ b/pldnotify.spec
@@ -1,7 +1,7 @@
 Summary:	Tool to check for updates in RPM .spec files
 Name:		pldnotify
-Version:	4.8
-Release:	2
+Version:	4.9
+Release:	1
 License:	GPL
 Group:		Applications/File
 Source0:	%{name}.awk
@@ -13,8 +13,8 @@ Requires:	npm
 Requires:	perl-HTML-Tree
 Requires:	perl-base
 Requires:	php-pear-PEAR
-Requires:	python-requests
-Requires:	python-rpm >= 5.4.15-26
+Requires:	python3-requests
+Requires:	python3-rpm
 Requires:	rpmbuild(macros) >= 1.539
 Requires:	ruby-rubygems
 Requires:	sed
diff --git a/pldnotify.py b/pldnotify.py
index 216ea09..02f0180 100755
--- a/pldnotify.py
+++ b/pldnotify.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 import argparse
 import requests
@@ -12,38 +12,45 @@ RPM Spec parser
 class RPMSpec:
     def __init__(self, specfile):
         self._specfile = specfile
-        self._spec = None
-        self._macros = None
+        self._header = None
+        self._name = None
+        self._version = None
 
-    def getSpec(self):
-        if not self._spec:
-            ts = rpm.TransactionSet()
-            self._spec = ts.parseSpec(self._specfile)
-
-        return self._spec
+    def getSpecHeader(self):
+        if not self._header:
+            spec = rpm.spec(self._specfile)
+            self._header = spec.sourceHeader
+        return self._header
 
     # compare version against current package
     # using rpm.labelCompare function
     def compare(self, version):
         v1 = (None, version, '1')
-        v2 = (None, self.macros()['version'], '1')
-        return rpm.labelCompare(v1, v2)
-
-    def macros(self):
-        if not self._macros:
-            s = self.getSpec()
-            macros = {}
-            for key, macro in s.macros().items():
-                # skip functions
-                if 'opts' in macro:
-                    continue
-                # skip unused macros, except name and version
-                if macro['used'] <= 0 and (key not in ['name', 'version']):
-                    continue
-                macros[key] = macro['body']
-            self._macros = macros
-
-        return self._macros
+        v2 = (None, self.version, '1')
+        try:
+            return rpm.labelCompare(v1, v2)
+        except ValueError:
+            return -1
+
+    @property
+    def name(self):
+        if not self._name:
+            if not self._header:
+                self.getSpecHeader()
+            self._name = self._header[rpm.RPMTAG_NAME]
+            if not self._name:
+                raise ValueError("%s: spec with no name" % self._specfile)
+        return self._name
+
+    @property
+    def version(self):
+        if not self._version:
+            if not self._header:
+                self.getSpecHeader()
+            self._version = self._header[rpm.RPMTAG_VERSION]
+            if not self._version:
+                raise ValueError("%s: spec with no version" % self._specfile)
+        return self._version
 
 """
 Class containing specific remote repositories,
@@ -54,25 +61,15 @@ class Checker:
     distro = 'pld-linux'
     checkers = ['anitya']
 
-    def __init__(self, specfile):
+    def __init__(self, specfile, debug):
+        self.debug = debug
         self.spec = RPMSpec(specfile)
 
-        try:
-            macros = self.spec.macros()
-        except rpm.error, e:
-            raise ValueError, "%s: %s" % (specfile, e.message)
-
-        try:
-            self.name = macros['name']
-            self.version = macros['version']
-        except Exception, e:
-            raise ValueError, "%s: macro error: %s" % (specfile, e.message)
-
         name = path.splitext(path.basename(specfile))[0]
-        if self.name != name:
-            print "WARNING: name mismatch: %s!=%s" % (self.name, name)
+        if self.spec.name != name:
+            print("WARNING: name mismatch: %s!=%s" % (self.spec.name, name))
 
-        print "%s: %s" % (self.name, self.version)
+        print("%s: %s" % (self.spec.name, self.spec.version))
 
     def find_recent(self):
         current = None
@@ -80,14 +77,16 @@ class Checker:
         for fn in self.checkers:
             try:
                 v = getattr(self, fn)()
-            except ValueError, e:
-                print "WARNING: skipping %s: %s" % (fn, e)
+            except ValueError as e:
+                print("WARNING: skipping %s: %s" % (fn, e))
                 continue
 
-            print "DEBUG: %s: %s" % (fn, v)
+            if self.debug:
+                print("DEBUG: %s: %s" % (fn, v))
 
             if self.spec.compare(v) <= 0:
-                print "DEBUG: skipping %s (is not newer)" % (v)
+                if self.debug:
+                    print("DEBUG: skipping %s (is not newer)" % (v))
                 continue
 
             current = v
@@ -99,16 +98,16 @@ class Checker:
         Raise ValueError or version from anitya project.
     """
     def anitya(self):
-        url = "https://release-monitoring.org/api/project/%s/%s" % (self.distro, self.name)
+        url = "https://release-monitoring.org/api/project/%s/%s" % (self.distro, self.spec.name)
         response = requests.get(url)
         data = response.json()
         if 'error' in data:
             error = data['error']
-            if error == 'No package "%s" found in distro "%s"' % (self.name, self.distro):
+            if error == 'No package "%s" found in distro "%s"' % (self.spec.name, self.distro):
                 res = self.anitya_alternatives()
                 if res != None:
                     error = error + "\n" + res
-            raise ValueError, error
+            raise ValueError(error)
 
         return data['version']
 
@@ -116,7 +115,7 @@ class Checker:
         Return alternatives found from Anitya
     """
     def anitya_alternatives(self):
-        url = "https://release-monitoring.org/api/projects/?pattern=%s" % self.name
+        url = "https://release-monitoring.org/api/projects/?pattern=%s" % self.spec.name
         data = requests.get(url).json()
 
         if data['total'] == 0:
@@ -146,23 +145,26 @@ def main():
 
     args = parser.parse_args()
 
+    if not args.debug:
+        rpm.setVerbosity(rpm.RPMLOG_ERR)
+
     i = 0
     n = len(args.packages)
-    print "Checking %d packages" % n
+    print("Checking %d packages" % n)
     for package in args.packages:
         i += 1
-        print "[%d/%d] checking %s" % (i, n, package)
+        print("[%d/%d] checking %s" % (i, n, package))
         try:
-            checker = Checker(package)
+            checker = Checker(package, args.debug)
             ver = checker.find_recent()
-        except Exception, e:
-            print "ERROR: %s" % e
+        except Exception as e:
+            print("ERROR: %s" % e)
             continue
 
         if ver:
-            print "[%s] Found an update: %s" % (package, ver)
+            print("[%s] Found an update: %s" % (package, ver))
         else:
-            print "[%s] No updates found" % (package)
+            print("[%s] No updates found" % (package))
 
 if __name__ == '__main__':
     main()
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/pldnotify.git/commitdiff/622fe9f6c33f8f2cc60c8be62e494091bfee511f



More information about the pld-cvs-commit mailing list