提交 b01e7c0a 编写于 作者: S Shinwell Hu

Merge branch 'next' of gitee.com:shinwell_hu/openEuler-Advisor into next

...@@ -116,13 +116,12 @@ Yours openEuler-Advisor. ...@@ -116,13 +116,12 @@ Yours openEuler-Advisor.
""" """
get openeuler spec file for specific package get openeuler spec file for specific package
""" """
specurl = self.specfile_url_template.format(package=pkg, specfile=pkg + ".spec")
exp = self.get_spec_exception() exp = self.get_spec_exception()
if pkg in exp: if pkg in exp:
dir_name = exp[pkg]["dir"] dir_name = exp[pkg]["dir"]
file_name = exp[pkg]["file"] file_name = exp[pkg]["file"]
specurl = self.specfile_url_template.format(package=pkg, specfile=dir_name + "/" + file_name) specurl = urllib.parse.urljoin(specurl, os.path.join(dir_name, file_name))
else:
specurl = self.specfile_url_template.format(package=pkg, specfile=pkg + ".spec")
try: try:
resp = self.get_gitee(specurl) resp = self.get_gitee(specurl)
......
...@@ -3,18 +3,24 @@ ...@@ -3,18 +3,24 @@
import re import re
import datetime import datetime
import time import time
from typing import List
__ALL__ = ["VersionRecommend"] __ALL__ = ["VersionRecommend"]
class VersionType: class VersionType(object):
def __init__(self):
self._version_type = None
def version_match(self, pkg_version): def version_match(self, pkg_version):
pass pass
def latest_version(self, version_entry): def latest_version(self, version_entry):
version_entry.sort(reverse = True) version_entry.sort(reverse=True)
return version_entry[0] return version_entry[0]
def maintain_version(self, version_entry, current_version, pkg_type): def maintain_version(self, version_entry, current_version, pkg_type):
_ = version_entry, pkg_type
return current_version return current_version
def _max(self, z1, z2): def _max(self, z1, z2):
...@@ -39,13 +45,9 @@ class VersionType: ...@@ -39,13 +45,9 @@ class VersionType:
else: else:
return -1 return -1
def __init__(self):
self._version_type = ''
def get_version_mode(self): def get_version_mode(self):
return self._version_type return self._version_type
def _split(self, x): def _split(self, x):
for f, s in re.findall(r'([\d.]+)|([^\d.]+)', x): for f, s in re.findall(r'([\d.]+)|([^\d.]+)', x):
if f: if f:
...@@ -55,8 +57,8 @@ class VersionType: ...@@ -55,8 +57,8 @@ class VersionType:
yield s yield s
class VersionTypeXYZW(VersionType):
class VersionType_x_y_z_w(VersionType):
def version_match(self, pkg_version): def version_match(self, pkg_version):
version = pkg_version.strip() version = pkg_version.strip()
digital_list = re.split(r'[._-]', version) digital_list = re.split(r'[._-]', version)
...@@ -168,10 +170,12 @@ class VersionType_x_y_z_w(VersionType): ...@@ -168,10 +170,12 @@ class VersionType_x_y_z_w(VersionType):
return '' return ''
def __init__(self): def __init__(self):
super().__init__()
self._version_type = 'x.y.z.w' self._version_type = 'x.y.z.w'
class VersionType_x_y_z(VersionType): class VersionTypeXYZ(VersionType):
def version_match(self, pkg_version): def version_match(self, pkg_version):
version = pkg_version.strip() version = pkg_version.strip()
digital_list = re.split(r'[._-]', version) digital_list = re.split(r'[._-]', version)
...@@ -263,10 +267,12 @@ class VersionType_x_y_z(VersionType): ...@@ -263,10 +267,12 @@ class VersionType_x_y_z(VersionType):
return '' return ''
def __init__(self): def __init__(self):
super().__init__()
self._version_type = 'x.y.z' self._version_type = 'x.y.z'
class VersionType_x_y(VersionType): class VersionTypeXY(VersionType):
def version_match(self, pkg_version): def version_match(self, pkg_version):
version = pkg_version.strip() version = pkg_version.strip()
digital_list = re.split(r'[._-]', version) digital_list = re.split(r'[._-]', version)
...@@ -279,6 +285,7 @@ class VersionType_x_y(VersionType): ...@@ -279,6 +285,7 @@ class VersionType_x_y(VersionType):
return True return True
def __init__(self): def __init__(self):
super().__init__()
self._version_type = 'x.y' self._version_type = 'x.y'
def latest_version(self, version_entry): def latest_version(self, version_entry):
...@@ -292,7 +299,6 @@ class VersionType_x_y(VersionType): ...@@ -292,7 +299,6 @@ class VersionType_x_y(VersionType):
if self._max(x, version[0]) < 0: if self._max(x, version[0]) < 0:
x = version[0] x = version[0]
version_candidate = [] version_candidate = []
for version in version_list: # 将第一位最大的列入候选列表,准备第二位比较 for version in version_list: # 将第一位最大的列入候选列表,准备第二位比较
if x == version[0]: if x == version[0]:
...@@ -309,7 +315,6 @@ class VersionType_x_y(VersionType): ...@@ -309,7 +315,6 @@ class VersionType_x_y(VersionType):
if self._max(y, version[1]) < 0: if self._max(y, version[1]) < 0:
y = version[1] y = version[1]
version_candidate.clear() version_candidate.clear()
for version in version_list: # x.y 版本类型中会小概率出现三位版本号,需要将第二位最大的列入候选列表,准备第三位比较 for version in version_list: # x.y 版本类型中会小概率出现三位版本号,需要将第二位最大的列入候选列表,准备第三位比较
if len(version) <= 1: # 过滤仅一位的版本号 if len(version) <= 1: # 过滤仅一位的版本号
...@@ -339,8 +344,7 @@ class VersionType_x_y(VersionType): ...@@ -339,8 +344,7 @@ class VersionType_x_y(VersionType):
def maintain_version(self, version_entry, current_version, pkg_type): def maintain_version(self, version_entry, current_version, pkg_type):
version_candidate = [] version_candidate = []
version_digital = re.split(r'[._-]', current_version) # 将版本号做拆分 version_digital = re.split(r'[._-]', current_version) # 将版本号做拆分
x = [] x = [version_digital[0]]
x.append(version_digital[0])
for version in version_entry: for version in version_entry:
version_temp = re.split(r'[._-]', version) version_temp = re.split(r'[._-]', version)
if version_digital[0] == version_temp[0]: # 如果版本号与当前版本前两位一致,说明是维护分支版本 if version_digital[0] == version_temp[0]: # 如果版本号与当前版本前两位一致,说明是维护分支版本
...@@ -359,7 +363,9 @@ class VersionType_x_y(VersionType): ...@@ -359,7 +363,9 @@ class VersionType_x_y(VersionType):
x.append(y) x.append(y)
return '.'.join(x) return '.'.join(x)
class VersionType_x(VersionType):
class VersionTypeX(VersionType):
def version_match(self, pkg_version): def version_match(self, pkg_version):
version = pkg_version.strip() version = pkg_version.strip()
digital_list = re.split(r'[._-]', version) digital_list = re.split(r'[._-]', version)
...@@ -370,9 +376,9 @@ class VersionType_x(VersionType): ...@@ -370,9 +376,9 @@ class VersionType_x(VersionType):
return True return True
def latest_version(self, version_entry): def latest_version(self, version_entry):
if len(version_entry) == 1: # 仅一个版本,当前即为最新版本 if 1 == len(version_entry): # 仅一个版本,当前即为最新版本
return version_entry[0] return version_entry[0]
version_list = [] version_list: List[List[str]] = []
for version in version_entry: for version in version_entry:
version_list.append(re.split(r'[._-]', version)) # 将 version 拆分为列表,方便后续比较 version_list.append(re.split(r'[._-]', version)) # 将 version 拆分为列表,方便后续比较
x = '0' x = '0'
...@@ -402,8 +408,7 @@ class VersionType_x(VersionType): ...@@ -402,8 +408,7 @@ class VersionType_x(VersionType):
def maintain_version(self, version_entry, current_version, pkg_type): def maintain_version(self, version_entry, current_version, pkg_type):
version_candidate = [] version_candidate = []
version_digital = re.split(r'[._-]', current_version) # 将版本号做拆分 version_digital = re.split(r'[._-]', current_version) # 将版本号做拆分
x = [] x = [version_digital[0]]
x.append(version_digital[0])
for version in version_entry: for version in version_entry:
version_temp = re.split(r'[._-]', version) version_temp = re.split(r'[._-]', version)
if version_digital[0] == version_temp[0]: # 如果版本号与当前版本前两位一致,说明是维护分支版本 if version_digital[0] == version_temp[0]: # 如果版本号与当前版本前两位一致,说明是维护分支版本
...@@ -421,11 +426,14 @@ class VersionType_x(VersionType): ...@@ -421,11 +426,14 @@ class VersionType_x(VersionType):
y = version[1] y = version[1]
x.append(y) x.append(y)
return '.'.join(x) return '.'.join(x)
def __init__(self): def __init__(self):
super().__init__()
self._version_type = 'x' self._version_type = 'x'
class VersionType_yyyy_x_y(VersionType): class VersionTypeYyyyXY(VersionType):
def version_match(self, pkg_version): def version_match(self, pkg_version):
version = pkg_version.strip() version = pkg_version.strip()
digital_list = re.split(r'[._-]', version) digital_list = re.split(r'[._-]', version)
...@@ -454,10 +462,12 @@ class VersionType_yyyy_x_y(VersionType): ...@@ -454,10 +462,12 @@ class VersionType_yyyy_x_y(VersionType):
return True return True
def __init__(self): def __init__(self):
super().__init__()
self._version_type = 'yyyy.x.y' self._version_type = 'yyyy.x.y'
class VersionType_yyyy_x(VersionType): class VersionTypeYyyyX(VersionType):
def version_match(self, pkg_version): def version_match(self, pkg_version):
version = pkg_version.strip() version = pkg_version.strip()
digital_list = re.split(r'[._-]', version) digital_list = re.split(r'[._-]', version)
...@@ -475,10 +485,12 @@ class VersionType_yyyy_x(VersionType): ...@@ -475,10 +485,12 @@ class VersionType_yyyy_x(VersionType):
return True return True
def __init__(self): def __init__(self):
super().__init__()
self._version_type = 'yyyy.x' self._version_type = 'yyyy.x'
class VersionType_yyyyw(VersionType): class VersionTypeYyyyW(VersionType):
def version_match(self, pkg_version): def version_match(self, pkg_version):
version = pkg_version.strip() version = pkg_version.strip()
if len(version) != 5: # 共5 位 if len(version) != 5: # 共5 位
...@@ -493,9 +505,12 @@ class VersionType_yyyyw(VersionType): ...@@ -493,9 +505,12 @@ class VersionType_yyyyw(VersionType):
return True return True
def __init__(self): def __init__(self):
super().__init__()
self._version_type = 'yyyyw' self._version_type = 'yyyyw'
class VersionType_yyyy_mm_dd(VersionType):
class VersionTypeYyyyMmDd(VersionType):
def version_match(self, pkg_version): def version_match(self, pkg_version):
version = pkg_version.strip() version = pkg_version.strip()
digital_list = re.split(r'[._-]', version) digital_list = re.split(r'[._-]', version)
...@@ -515,7 +530,7 @@ class VersionType_yyyy_mm_dd(VersionType): ...@@ -515,7 +530,7 @@ class VersionType_yyyy_mm_dd(VersionType):
try: try:
if '_' in version: if '_' in version:
d_time = time.mktime(time.strptime(version, "%Y_%m_%d")) d_time = time.mktime(time.strptime(version, "%Y_%m_%d"))
elif '-'in version: elif '-' in version:
d_time = time.mktime(time.strptime(version, "%Y-%m-%d")) d_time = time.mktime(time.strptime(version, "%Y-%m-%d"))
elif '.' in version: elif '.' in version:
d_time = time.mktime(time.strptime(version, "%Y.%m.%d")) d_time = time.mktime(time.strptime(version, "%Y.%m.%d"))
...@@ -528,15 +543,17 @@ class VersionType_yyyy_mm_dd(VersionType): ...@@ -528,15 +543,17 @@ class VersionType_yyyy_mm_dd(VersionType):
return False return False
else: else:
return True return True
except: # 时间格式非法 except ValueError as e: # 时间格式非法
print('Time foramt failed %s.', version) print('Time foramt failed %s.', version)
return False return False
def __init__(self): def __init__(self):
super().__init__()
self._version_type = 'yyyy.mm.dd' self._version_type = 'yyyy.mm.dd'
class VersionType_yyyy_mm(VersionType): class VersionTypeYyyyMm(VersionType):
def version_match(self, pkg_version): def version_match(self, pkg_version):
version = pkg_version.strip() version = pkg_version.strip()
digital_list = re.split(r'[._-]', version) digital_list = re.split(r'[._-]', version)
...@@ -559,20 +576,21 @@ class VersionType_yyyy_mm(VersionType): ...@@ -559,20 +576,21 @@ class VersionType_yyyy_mm(VersionType):
return True return True
def __init__(self): def __init__(self):
super().__init__()
self._version_type = 'yyyy.mm' self._version_type = 'yyyy.mm'
class VersionType_yyyymm(VersionType):
class VersionTypeYyyyMm(VersionType):
def version_match(self, pkg_version): def version_match(self, pkg_version):
version = pkg_version.strip() version = pkg_version.strip()
if len(version) != 6: # 长度为6 if len(version) != 6: # 长度为6
return False return False
if not version.isdigit(): #时间格式为数字 if not version.isdigit(): # 时间格式为数字
return False return False
digital_list = [] digital_list = [version[0:4], version[4:]]
digital_list.append(version[0:4])
digital_list.append(version[4:])
if len(digital_list[0]) != 4: # 第一位为发布年份,位数为4位 if len(digital_list[0]) != 4: # 第一位为发布年份,位数为4位
return False return False
...@@ -590,9 +608,12 @@ class VersionType_yyyymm(VersionType): ...@@ -590,9 +608,12 @@ class VersionType_yyyymm(VersionType):
return True return True
def __init__(self): def __init__(self):
super().__init__()
self._version_type = 'yyyymm' self._version_type = 'yyyymm'
class VersionType_x_yymm_z(VersionType):
class VersionTypeXYymmZ(VersionType):
def version_match(self, pkg_version): def version_match(self, pkg_version):
version = pkg_version.strip() version = pkg_version.strip()
digital_list = re.split(r'[._-]', version) digital_list = re.split(r'[._-]', version)
...@@ -608,17 +629,19 @@ class VersionType_x_yymm_z(VersionType): ...@@ -608,17 +629,19 @@ class VersionType_x_yymm_z(VersionType):
month = str(digital_list[1][-2:]) month = str(digital_list[1][-2:])
if year > datetime.datetime.now().year[-2:]: # 年份不能大于当前年份,不用考虑20000 年前的情况 if year > datetime.datetime.now().year[-2:]: # 年份不能大于当前年份,不用考虑20000 年前的情况
return False return False
if month > 12 or month == 0: if month > '12' or month == '0':
return False return False
if len(digital_list[2]) > 2: # 迭代号不大于2位 if len(digital_list[2]) > 2: # 迭代号不大于2位
return False return False
return True return True
def __init__(self): def __init__(self):
super().__init__()
self._version_type = 'x.yymm.z' self._version_type = 'x.yymm.z'
class VersionType_yyyymmdd(VersionType): class VersionTypeYyyymmdd(VersionType):
def version_match(self, pkg_version): def version_match(self, pkg_version):
version = pkg_version.strip() version = pkg_version.strip()
if len(version) != 8: # 日期长度满足 8 位要求 if len(version) != 8: # 日期长度满足 8 位要求
...@@ -642,17 +665,17 @@ class VersionType_yyyymmdd(VersionType): ...@@ -642,17 +665,17 @@ class VersionType_yyyymmdd(VersionType):
return False return False
else: else:
return True return True
except: # 时间格式非法 except ValueError as e: # 时间格式非法
print('Time format failed %s,', version) print('Time format failed %s,', version)
return False return False
def __init__(self): def __init__(self):
super().__init__()
self._version_type = 'yyyymmdd' self._version_type = 'yyyymmdd'
class VersionRecommend(object):
class VersionRecommend:
def __init__(self, version_entry, current_version, pkg_type): def __init__(self, version_entry, current_version, pkg_type):
self.latest_version = current_version # 提供初值,避免 current_version 为空导致后面出现异常 self.latest_version = current_version # 提供初值,避免 current_version 为空导致后面出现异常
self.maintain_version = current_version self.maintain_version = current_version
...@@ -667,18 +690,18 @@ class VersionRecommend: ...@@ -667,18 +690,18 @@ class VersionRecommend:
def _version_match(self, version_entry): def _version_match(self, version_entry):
version_method = {VersionType_x_y_z_w(): 0, version_method = {VersionTypeXYZW(): 0,
VersionType_x_y_z(): 0, VersionTypeXYZ(): 0,
VersionType_x_y(): 0, VersionTypeXY(): 0,
VersionType_x(): 0, VersionTypeX(): 0,
VersionType_yyyy_x_y(): 0, VersionTypeYyyyXY(): 0,
VersionType_yyyy_x(): 0, VersionTypeYyyyX(): 0,
VersionType_yyyyw(): 0, VersionTypeYyyyW(): 0,
VersionType_yyyy_mm_dd(): 0, VersionTypeYyyyMmDd(): 0,
VersionType_yyyy_mm(): 0, VersionTypeYyyyMm(): 0,
VersionType_yyyymm(): 0, VersionTypeYyyyMm(): 0,
VersionType_x_yymm_z(): 0, VersionTypeXYymmZ(): 0,
VersionType_yyyymmdd(): 0} VersionTypeYyyymmdd(): 0}
if not version_entry: if not version_entry:
return None return None
for version in version_entry[:]: for version in version_entry[:]:
...@@ -698,7 +721,7 @@ class VersionRecommend: ...@@ -698,7 +721,7 @@ class VersionRecommend:
return method return method
def _version_valid(self, version): def _version_valid(self, version):
m = re.match('^[a-z0-9_\-\.]*$',version) m = re.match("^[0-9a-zA-Z._-]*$", version)
if m is None: # 版本号应该是 数字/小写字母/下划线/. 组成 if m is None: # 版本号应该是 数字/小写字母/下划线/. 组成
return False return False
...@@ -738,6 +761,7 @@ class VersionRecommend: ...@@ -738,6 +761,7 @@ class VersionRecommend:
if __name__ == '__main__': if __name__ == '__main__':
version_recommend = VersionRecommend(['0.1','0.2','1.2.3','1.2.4','1.2.6','1.3.0','2.0.1','1.2','1.4','1.5-rc','2.0-rc'],'1.2.3',0) version_recommend = VersionRecommend(
['0.1', '0.2', '1.2.3', '1.2.4', '1.2.6', '1.3.0', '1.5-rc', '2.0-rc'], '1.2.3', 0)
print('latest_version', version_recommend.latest_version) print('latest_version', version_recommend.latest_version)
print('maintain_version', version_recommend.maintain_version) print('maintain_version', version_recommend.maintain_version)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册