commit 5a2e7d0f6ababbcdcfdd8fd31f474618ae72665b
parent e61dd7086ea88097c36143c4ee37e37ffb83ede0
Author: parazyd <parazyd@dyne.org>
Date:   Sat, 16 Dec 2017 23:52:16 +0100
Implement new algorithm for package_newer().
This patch should bring more robustness to package version detection and
avoid false positives and false negatives that have been appearing.
Diffstat:
1 file changed, 29 insertions(+), 5 deletions(-)
diff --git a/lib/package.py b/lib/package.py
@@ -106,15 +106,39 @@ def package_banned(pkg, banned_pkgs):
 
 def package_newer(pkg1, pkg2):
     """
-    Checks whether the package of a lower priority is newer than the package
-    of the higher priority and returns True if so.
+    Checks whether the package of a lower priority has a higher version than
+    the package of the higher priority and returns True if so.
+
+    Ref: https://www.debian.org/doc/debian-policy/#version
     """
-    higher_prio = pkg1.get('Version').split('+')
-    lower_prio = pkg2.get('Version').split('+')
+    # The choice of dropping [1:] is because we don't care for +deb or +devuan
+    hi_prio = pkg1.get('Version').split('+')[0]
+    lo_prio = pkg2.get('Version').split('+')[0]
+
+    # Epoch check
+    hi_ep = 0
+    lo_ep = 0
+    if ':' in hi_prio:
+        hi_ep = int(hi_prio.split(':')[0])
+        hi_prio = hi_prio.split(':')[1]
+    if ':' in lo_prio:
+        lo_ep = int(lo_prio.split(':')[0])
+        lo_prio = lo_prio.split(':')[1]
+    if lo_ep > hi_ep:
+        return True
 
-    if lower_prio[0] > higher_prio[0]:
+    # [0] will be upstream, [1] should be the package build
+    hi_prio = hi_prio.split('-')
+    lo_prio = lo_prio.split('-')
+    if lo_prio[0] > hi_prio[0]:
         return True
 
+    if len(hi_prio) > 1 and len(lo_prio) > 1:
+        hi_prio[1] = hi_prio[1].replace('.', '')
+        lo_prio[1] = lo_prio[1].replace('.', '')
+        if int(lo_prio[1]) > int(hi_prio[1]):
+            return True
+
     return False