Attempt to fix issues with packaging.version.parse
Defined a new class "ArchPkgVersion" to handle versions. May replace usage of `packaging.version.parse(...)`.
This commit is contained in:
parent
bf8ba7fcd7
commit
cdfb371ea9
1 changed files with 177 additions and 2 deletions
179
update.py
179
update.py
|
@ -24,6 +24,172 @@ AUR_GIT_REPO_PATH = "https://aur.archlinux.org"
|
||||||
AUR_GIT_REPO_PATH_TEMPLATE = AUR_GIT_REPO_PATH + "/{}.git"
|
AUR_GIT_REPO_PATH_TEMPLATE = AUR_GIT_REPO_PATH + "/{}.git"
|
||||||
GLOBAL_LOG_FILE = "log.txt"
|
GLOBAL_LOG_FILE = "log.txt"
|
||||||
DEFAULT_EDITOR = "/usr/bin/nano"
|
DEFAULT_EDITOR = "/usr/bin/nano"
|
||||||
|
ENDS_WITH_DIGIT_REGEX = re.compile("^(.*?)([0-9]+)$")
|
||||||
|
|
||||||
|
|
||||||
|
class ArchPkgVersion():
|
||||||
|
def __init__(self, version_str):
|
||||||
|
self.versions = []
|
||||||
|
self.pkgver = 0
|
||||||
|
end_dash_idx = version_str.rfind('-')
|
||||||
|
if end_dash_idx != -1:
|
||||||
|
try:
|
||||||
|
self.pkgver = int(version_str[end_dash_idx+1:])
|
||||||
|
except ValueError:
|
||||||
|
self.pkgver = version_str[end_dash_idx+1:]
|
||||||
|
version_str = version_str[:end_dash_idx]
|
||||||
|
|
||||||
|
for sub in version_str.split('.'):
|
||||||
|
try:
|
||||||
|
integer = int(sub)
|
||||||
|
self.versions.append(integer)
|
||||||
|
except ValueError:
|
||||||
|
match = ENDS_WITH_DIGIT_REGEX.match(sub)
|
||||||
|
if match is not None:
|
||||||
|
subversion = []
|
||||||
|
subversion.append(match.groups()[0])
|
||||||
|
subversion.append(int(match.groups()[1]))
|
||||||
|
self.versions.append(tuple(subversion))
|
||||||
|
else:
|
||||||
|
self.versions.append(sub)
|
||||||
|
|
||||||
|
def compare_with(self, other_self):
|
||||||
|
self_count = len(self.versions)
|
||||||
|
other_count = len(other_self.versions)
|
||||||
|
if other_count < self_count:
|
||||||
|
count = other_count
|
||||||
|
else:
|
||||||
|
count = self_count
|
||||||
|
for i in range(count):
|
||||||
|
if type(self.versions[i]) is tuple:
|
||||||
|
if type(other_self.versions[i]) is tuple:
|
||||||
|
self_subcount = len(self.versions[i])
|
||||||
|
other_subcount = len(other_self.versions[i])
|
||||||
|
if other_subcount < self_subcount:
|
||||||
|
subcount = other_subcount
|
||||||
|
else:
|
||||||
|
subcount = self_subcount
|
||||||
|
for j in range(subcount):
|
||||||
|
try:
|
||||||
|
if self.versions[i][j] < other_self.versions[i][j]:
|
||||||
|
return -1
|
||||||
|
elif self.versions[i][j] > other_self.versions[i][j]:
|
||||||
|
return 1
|
||||||
|
except TypeError:
|
||||||
|
if str(self.versions[i][j]) < str(other_self.versions[i][j]):
|
||||||
|
return -1
|
||||||
|
elif str(self.versions[i][j]) > str(other_self.versions[i][j]):
|
||||||
|
return 1
|
||||||
|
if self_subcount < other_subcount:
|
||||||
|
return -1
|
||||||
|
elif self_subcount > other_subcount:
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
# self is tuple but other is not
|
||||||
|
return 1
|
||||||
|
elif type(other_self.versions[i]) is tuple:
|
||||||
|
# other is tuple but self is not
|
||||||
|
return -1
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
if self.versions[i] < other_self.versions[i]:
|
||||||
|
return -1
|
||||||
|
elif self.versions[i] > other_self.versions[i]:
|
||||||
|
return 1
|
||||||
|
except TypeError:
|
||||||
|
if str(self.versions[i]) < str(other_self.versions[i]):
|
||||||
|
return -1
|
||||||
|
elif str(self.versions[i]) > str(other_self.versions[i]):
|
||||||
|
return 1
|
||||||
|
if self_count < other_count:
|
||||||
|
return -1
|
||||||
|
elif self_count > other_count:
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
if self.pkgver < other_self.pkgver:
|
||||||
|
return -1
|
||||||
|
elif self.pkgver > other_self.pkgver:
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
except TypeError:
|
||||||
|
if str(self.pkgver) < str(other_self.pkgver):
|
||||||
|
return -1
|
||||||
|
elif str(self.pkgver) > str(other_self.pkgver):
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
if isinstance(other, version.Version):
|
||||||
|
other = ArchPkgVersion(str(other))
|
||||||
|
|
||||||
|
if isinstance(other, ArchPkgVersion):
|
||||||
|
return self.compare_with(other) == 0
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
if isinstance(other, version.Version):
|
||||||
|
other = ArchPkgVersion(str(other))
|
||||||
|
|
||||||
|
if isinstance(other, ArchPkgVersion):
|
||||||
|
return self.compare_with(other) != 0
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def __lt__(self, other):
|
||||||
|
if isinstance(other, version.Version):
|
||||||
|
other = ArchPkgVersion(str(other))
|
||||||
|
|
||||||
|
if isinstance(other, ArchPkgVersion):
|
||||||
|
return self.compare_with(other) < 0
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def __le__(self, other):
|
||||||
|
if isinstance(other, version.Version):
|
||||||
|
other = ArchPkgVersion(str(other))
|
||||||
|
|
||||||
|
if isinstance(other, ArchPkgVersion):
|
||||||
|
result = self.compare_with(other)
|
||||||
|
return result <= 0
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def __gt__(self, other):
|
||||||
|
if isinstance(other, version.Version):
|
||||||
|
other = ArchPkgVersion(str(other))
|
||||||
|
|
||||||
|
if isinstance(other, ArchPkgVersion):
|
||||||
|
return self.compare_with(other) > 0
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def __ge__(self, other):
|
||||||
|
if isinstance(other, version.Version):
|
||||||
|
other = ArchPkgVersion(str(other))
|
||||||
|
|
||||||
|
if isinstance(other, ArchPkgVersion):
|
||||||
|
result = self.compare_with(other)
|
||||||
|
return result >= 0
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
self_str = ""
|
||||||
|
for idx in range(len(self.versions)):
|
||||||
|
if type(self.versions[idx]) is tuple:
|
||||||
|
for sub in self.versions[idx]:
|
||||||
|
self_str += str(sub)
|
||||||
|
else:
|
||||||
|
self_str += str(self.versions[idx])
|
||||||
|
if idx + 1 < len(self.versions):
|
||||||
|
self_str += '.'
|
||||||
|
self_str += "-" + str(self.pkgver)
|
||||||
|
return self_str
|
||||||
|
|
||||||
|
|
||||||
def log_print(*args, **kwargs):
|
def log_print(*args, **kwargs):
|
||||||
|
@ -506,6 +672,15 @@ def get_pkgbuild_version(
|
||||||
return False, None, None, None
|
return False, None, None, None
|
||||||
|
|
||||||
|
|
||||||
|
def version_parse_checked(version_str: str):
|
||||||
|
try:
|
||||||
|
return version.parse(version_str)
|
||||||
|
except version.InvalidVersion:
|
||||||
|
self_version = ArchPkgVersion(version_str)
|
||||||
|
log_print(f'WARNING: version.parse(\"{version_str}\") failed to parse! Defaulting to self-defined version \"{self_version}\".')
|
||||||
|
return self_version
|
||||||
|
|
||||||
|
|
||||||
def get_srcinfo_check_result(
|
def get_srcinfo_check_result(
|
||||||
current_epoch: Union[str, None],
|
current_epoch: Union[str, None],
|
||||||
current_version: str,
|
current_version: str,
|
||||||
|
@ -554,8 +729,8 @@ def get_srcinfo_check_result(
|
||||||
elif (
|
elif (
|
||||||
pkgver is not None
|
pkgver is not None
|
||||||
and pkgrel is not None
|
and pkgrel is not None
|
||||||
and version.parse(current_version)
|
and version_parse_checked(current_version)
|
||||||
< version.parse(pkgver + "-" + pkgrel)
|
< version_parse_checked(pkgver + "-" + pkgrel)
|
||||||
):
|
):
|
||||||
log_print(
|
log_print(
|
||||||
'Current installed version of "{}" is out of date (older version).'.format(
|
'Current installed version of "{}" is out of date (older version).'.format(
|
||||||
|
|
Loading…
Reference in a new issue