mesonlib: Reimplement version comparison for speed
"""A library of random helper functionality."""
from pathlib import Path
from typing import List
-import functools
import sys
import stat
import time
@@ -506,7 +505,6 @@ def detect_vcs(source_dir):
return None
# a helper class which implements the same version ordering as RPM
-@functools.total_ordering
class Version:
def __init__(self, s):
self._s = s
@@ -527,7 +525,24 @@ class Version:
return '<Version: {}>'.format(self._s)
def __lt__(self, other):
- return self.__cmp__(other) == -1
+ if isinstance(other, Version):
+ return self.__cmp(other, operator.lt)
+ return NotImplemented
+
+ def __gt__(self, other):
+ if isinstance(other, Version):
+ return self.__cmp(other, operator.gt)
+ return NotImplemented
+
+ def __le__(self, other):
+ if isinstance(other, Version):
+ return self.__cmp(other, operator.le)
+ return NotImplemented
+
+ def __ge__(self, other):
+ if isinstance(other, Version):
+ return self.__cmp(other, operator.ge)
+ return NotImplemented
def __eq__(self, other):
if isinstance(other, Version):
@@ -539,25 +554,21 @@ class Version:
return self._v != other._v
return NotImplemented
- def __cmp__(self, other):
- def cmp(a, b):
- return (a > b) - (a < b)
-
+ def __cmp(self, other, comparator):
# compare each sequence in order
for ours, theirs in zip(self._v, other._v):
# sort a non-digit sequence before a digit sequence
ours_is_int = isinstance(ours, int)
- if ours_is_int != isinstance(theirs, int):
- return 1 if ours_is_int else -1
+ theirs_is_int = isinstance(theirs, int)
+ if ours_is_int != theirs_is_int:
+ return comparator(ours_is_int, theirs_is_int)
- # compare lexicographically
- c = cmp(ours, theirs)
- if c != 0:
- return c
+ if ours != theirs:
+ return comparator(ours, theirs)
# if equal length, all components have matched, so equal
# otherwise, the version with a suffix remaining is greater
- return cmp(len(self._v), len(other._v))
+ return comparator(len(self._v), len(other._v))
def _version_extract_cmpop(vstr2):
if vstr2.startswith('>='):
