Sort versions by date then version for all products (#179)

This commit is contained in:
Marc Wrobel
2023-11-12 22:03:45 +01:00
parent e2de82c403
commit 600e77e212
35 changed files with 92 additions and 168 deletions

View File

@@ -26,8 +26,5 @@ for item in rss.getElementsByTagName("item"):
versions[version] = date
print(f"{version}: {date}")
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (desc)
sorted(versions.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -64,10 +64,4 @@ for branch in git.list_branches("refs/heads/?.?.x"):
fetch_versions_from_file(git.repo_dir / status_file, versions)
print("::endgroup::")
endoflife.write_releases(
PRODUCT,
dict(
# sort by date then version (desc)
sorted(versions.items(), key=lambda x: (x[1], x[0]), reverse=True)
),
)
endoflife.write_releases(PRODUCT, versions)

View File

@@ -53,16 +53,16 @@ def parse_date(s):
# Only update the date if we are adding first time or if the date is lower
def handle_version(key, version, date_text, releases):
def handle_version(key, version, date_text, versions):
try:
date = parse_date(date_text)
date_fmt = date.strftime("%Y-%m-%d")
if version not in releases[key]:
releases[key][version] = date
if version not in versions[key]:
versions[key][version] = date
print(f"{key}-{version}: {date_fmt}")
elif releases[key][version] > date:
releases[key][version] = date
elif versions[key][version] > date:
versions[key][version] = date
print(f"{key}-{version}: {date_fmt} [UPDATED]")
else:
print(f"{key}-{version}: {date_fmt} [IGNORED]")
@@ -71,7 +71,7 @@ def handle_version(key, version, date_text, releases):
print(f"{key}-{version}: Failed to parse {date_text} for {version}")
def parse(url, releases):
def parse(url, versions):
response = endoflife.fetch_url(url)
soup = BeautifulSoup(response, features="html5lib")
table = soup.find(id="tableWraper")
@@ -85,18 +85,17 @@ def parse(url, releases):
matches = re.findall(regex, version_text, re.MULTILINE)
for version in matches:
date_text = td_list[2].get_text().strip()
handle_version(key, version, date_text, releases)
handle_version(key, version, date_text, versions)
print("::group::apple")
releases_by_product = {k: {} for k in CONFIG.keys()}
versions_by_product = {k: {} for k in CONFIG.keys()}
for url in URLS:
parse(url, releases_by_product)
parse(url, versions_by_product)
for k in CONFIG.keys():
endoflife.write_releases(k, {
v: d.strftime("%Y-%m-%d") for v, d in releases_by_product[k].items()
})
versions = { v: d.strftime("%Y-%m-%d") for v, d in versions_by_product[k].items() }
endoflife.write_releases(k, versions)
print("::endgroup::")

View File

@@ -43,9 +43,6 @@ def fetch_releases():
print(f"::group::{PRODUCT}")
releases = fetch_releases()
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (desc)
sorted(releases.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
versions = fetch_releases()
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -62,17 +62,14 @@ def fetch_releases(url, regex, template):
def update_product(product_name, configs):
releases = {}
versions = {}
for config in configs:
t = config.get("template", DEFAULT_TAG_TEMPLATE)
regex = config.get("regex", DEFAULT_VERSION_REGEX)
releases = releases | fetch_releases(config[METHOD], regex, t)
versions = versions | fetch_releases(config[METHOD], regex, t)
endoflife.write_releases(product_name, dict(
# sort by version then date (asc)
sorted(releases.items(), key=lambda x: (x[0], x[1]))
))
endoflife.write_releases(product_name, versions)
p_filter = sys.argv[1] if len(sys.argv) > 1 else None

View File

@@ -52,4 +52,7 @@ def fetch_url(url, retry_count=5, timeout=30, data=None, headers=None, encoding=
def write_releases(product, releases, pathname="releases"):
with open(f"{pathname}/{product}.json", "w") as f:
f.write(json.dumps(releases, indent=2))
f.write(json.dumps(dict(
# sort by date then version (desc)
sorted(releases.items(), key=lambda x: (x[1], x[0]), reverse=True)
), indent=2))

View File

@@ -29,8 +29,5 @@ for version_block in r.html.find('.versions-list'):
print(f"{version}: {date}")
versions[version] = date
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (asc)
sorted(versions.items(), key=lambda x: (x[1], x[0]))
))
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -70,5 +70,5 @@ def get_all_versions():
return all_versions
releases = get_all_versions()
endoflife.write_releases('cos', releases)
versions = get_all_versions()
endoflife.write_releases('cos', versions)

View File

@@ -52,8 +52,5 @@ for base_url in URLS:
print(f"{version}: {date}")
versions = versions | FIXED_VERSIONS
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (desc)
sorted(versions.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -56,11 +56,8 @@ git = Git(REPO_URL)
git.setup()
git.checkout("master", file_list=["english/News"])
all_releases = {}
extract_major_releases(all_releases, git.repo_dir)
extract_point_releases(all_releases, git.repo_dir)
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (desc)
sorted(all_releases.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
all_versions = {}
extract_major_releases(all_versions, git.repo_dir)
extract_point_releases(all_versions, git.repo_dir)
endoflife.write_releases(PRODUCT, all_versions)
print("::endgroup::")

View File

@@ -39,15 +39,15 @@ def fetch_releases(distrowatch_id, regex, template):
def update_product(product_name, configs):
releases = {}
versions = {}
for config in configs:
t = config.get("template", DEFAULT_TAG_TEMPLATE)
if "regex" in config:
regex = config["regex"]
releases = releases | fetch_releases(config[METHOD], regex, t)
versions = versions | fetch_releases(config[METHOD], regex, t)
endoflife.write_releases(product_name, releases)
endoflife.write_releases(product_name, versions)
p_filter = sys.argv[1] if len(sys.argv) > 1 else None

View File

@@ -31,14 +31,14 @@ def fetch_releases(url, regex, releases):
def update_product(product_name, configs):
releases = {}
versions = {}
for config in configs:
url = f"https://hub.docker.com/v2/repositories/{config[METHOD]}/tags?page_size=100&page=1"
config = {"regex": REGEX} | config
fetch_releases(url, config["regex"], releases)
fetch_releases(url, config["regex"], versions)
endoflife.write_releases(product_name, releases)
endoflife.write_releases(product_name, versions)
p_filter = sys.argv[1] if len(sys.argv) > 1 else None

View File

@@ -41,5 +41,6 @@ def parse_platforms_pages():
print("::endgroup::")
return all_versions
versions = parse_platforms_pages()
endoflife.write_releases('eks', versions)

View File

@@ -158,9 +158,6 @@ def fetch_releases():
print(f"::group::{PRODUCT}")
releases = fetch_releases()
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (desc)
sorted(releases.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
versions = fetch_releases()
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -37,15 +37,15 @@ def fetch_releases(product_name, url, regex, template):
return releases
def update_product(product_name, configs):
releases = {}
versions = {}
for config in configs:
t = config.get("template", DEFAULT_TAG_TEMPLATE)
regex = config.get("regex", DEFAULT_VERSION_REGEX)
regex = regex.replace("(?<", "(?P<") # convert ruby regex to python regex
releases = releases | fetch_releases(product_name, config[METHOD], regex, t)
versions = versions | fetch_releases(product_name, config[METHOD], regex, t)
endoflife.write_releases(product_name, releases)
endoflife.write_releases(product_name, versions)
p_filter = sys.argv[1] if len(sys.argv) > 1 else None

View File

@@ -66,13 +66,13 @@ def fetch_releases(repo_id, regex):
def update_product(product_name, configs):
releases = {}
versions = {}
for config in configs:
config = config if "regex" in config else config | {"regex": REGEX}
releases = releases | fetch_releases(config[METHOD], config["regex"])
versions = versions | fetch_releases(config[METHOD], config["regex"])
endoflife.write_releases(product_name, releases)
endoflife.write_releases(product_name, versions)
p_filter = sys.argv[1] if len(sys.argv) > 1 else None

View File

@@ -52,10 +52,7 @@ def print_releases(releases):
print(f"::group::{PRODUCT}")
all_cycles = fetch_cycles()
all_releases = fetch_releases(all_cycles)
print_releases(all_releases)
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (desc)
sorted(all_releases.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
all_versions = fetch_releases(all_cycles)
print_releases(all_versions)
endoflife.write_releases(PRODUCT, all_versions)
print("::endgroup::")

View File

@@ -31,9 +31,6 @@ def fetch_releases():
print(f"::group::{PRODUCT}")
releases = fetch_releases()
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (desc)
sorted(releases.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
versions = fetch_releases()
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -29,8 +29,5 @@ for version_block in r.html.find('.versions-list'):
print(f"{version}: {date}")
versions[version] = date
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (asc)
sorted(versions.items(), key=lambda x: (x[1], x[0]))
))
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -35,8 +35,5 @@ for item in rss.getElementsByTagName("entry"):
versions[version] = date
print(f"{version}: {date}")
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (desc)
sorted(versions.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -45,15 +45,12 @@ def fetch_releases(package_identifier):
def update_product(product_name, configs):
releases = {}
versions = {}
for config in configs:
releases = releases | fetch_releases(config[METHOD])
versions = versions | fetch_releases(config[METHOD])
endoflife.write_releases(product_name, dict(
# sort by date then version (desc)
sorted(releases.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
endoflife.write_releases(product_name, versions)
p_filter = sys.argv[1] if len(sys.argv) > 1 else None

View File

@@ -31,13 +31,13 @@ def fetch_releases(npm_id, regex):
def update_product(product_name, configs):
releases = {}
versions = {}
for config in configs:
config = {"regex": REGEX} | config
releases = releases | fetch_releases(config[METHOD], config["regex"])
versions = versions | fetch_releases(config[METHOD], config["regex"])
endoflife.write_releases(product_name, releases)
endoflife.write_releases(product_name, versions)
p_filter = sys.argv[1] if len(sys.argv) > 1 else None

View File

@@ -14,7 +14,7 @@ BASE_URL = "https://portal.nutanix.com/api/v1/eol/find?type="
def fetch_releases(product_code):
releases = {}
versions = {}
url = BASE_URL + product_code
print(url)
response = endoflife.fetch_url(url)
@@ -24,17 +24,14 @@ def fetch_releases(product_code):
if 'GENERAL_AVAILABILITY' in version_data:
version = version_data["version"]
date = version_data["GENERAL_AVAILABILITY"].split("T")[0]
releases[version] = date
versions[version] = date
print(f"{version}: {date}")
return releases
return versions
for product_name, product_code in PRODUCTS.items():
print(f"::group::{product_name}")
all_releases = fetch_releases(product_code)
endoflife.write_releases(product_name, dict(
# sort by date then version (desc)
sorted(all_releases.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
all_versions = fetch_releases(product_code)
endoflife.write_releases(product_name, all_versions)
print("::endgroup::")

View File

@@ -40,10 +40,7 @@ def fetch_releases():
print(f"::group::{PRODUCT}")
all_releases = fetch_releases()
all_releases.pop('1.0_alpha') # only version we don't want, regex not needed
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (desc)
sorted(all_releases.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
all_versions = fetch_releases()
all_versions.pop('1.0_alpha') # only version we don't want, regex not needed
endoflife.write_releases(PRODUCT, all_versions)
print("::endgroup::")

View File

@@ -27,12 +27,9 @@ def fetch_versions(major_version):
print("::group::php")
releases = {}
versions = {}
for major_version in PHP_MAJOR_VERSIONS:
releases |= fetch_versions(major_version)
versions |= fetch_versions(major_version)
endoflife.write_releases('php', dict(sorted(
releases.items(), key=lambda x: list(map(int, x[0].split(".")))
)))
endoflife.write_releases('php', versions)
print("::endgroup::")

View File

@@ -35,9 +35,6 @@ def fetch_releases():
print(f"::group::{PRODUCT}")
releases = fetch_releases()
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (desc)
sorted(releases.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
versions = fetch_releases()
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -35,13 +35,13 @@ def fetch_releases(pypi_id, regex):
def update_product(product_name, configs):
releases = {}
versions = {}
for config in configs:
config = {"regex": REGEX} | config
releases = releases | fetch_releases(config[METHOD], config["regex"])
versions = versions | fetch_releases(config[METHOD], config["regex"])
endoflife.write_releases(product_name, releases)
endoflife.write_releases(product_name, versions)
p_filter = sys.argv[1] if len(sys.argv) > 1 else None

View File

@@ -19,7 +19,7 @@ def parse_date(d):
for db, url in DBS.items():
print(f"::group::{db}")
releases = {}
versions = {}
response = endoflife.fetch_url(url)
soup = BeautifulSoup(response, features="html5lib")
@@ -37,10 +37,7 @@ for db, url in DBS.items():
if date:
version = m.group("v")
print(f"{version} : {date}")
releases[version] = date
versions[version] = date
endoflife.write_releases(f"amazon-rds-{db.lower()}", dict(
# sort by date then version (desc)
sorted(releases.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
endoflife.write_releases(f"amazon-rds-{db.lower()}", versions)
print("::endgroup::")

View File

@@ -41,12 +41,6 @@ for branch in git.list_branches("refs/heads/enterprise-[4-9]*"):
print(f"::group::{PRODUCT}")
for version, date in versions.items():
print(f"{version}: {date}")
print("::endgroup::")
endoflife.write_releases(
PRODUCT,
dict(
# sort by date then version (desc)
sorted(versions.items(), key=lambda x: (x[1], x[0]), reverse=True)
),
)
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -31,8 +31,5 @@ for table in soup.findAll("tbody"):
versions[version] = date
print(f"{version}: {date}")
endoflife.write_releases('redhat-satellite', dict(
# sort by date then version (desc)
sorted(versions.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
endoflife.write_releases('redhat-satellite', versions)
print("::endgroup::")

View File

@@ -28,8 +28,6 @@ def parse_markdown_table(table_text):
print("::group::rockylinux")
response = endoflife.fetch_url(URL)
versions = parse_markdown_table(response)
endoflife.write_releases('rockylinux', versions)
print("::endgroup::")

View File

@@ -58,9 +58,6 @@ def fetch_releases():
print(f"::group::{PRODUCT}")
releases = fetch_releases()
endoflife.write_releases(PRODUCT, dict(
# sort by version then date (asc)
sorted(releases.items(), key=lambda x: (x[0], x[1]))
))
versions = fetch_releases()
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -14,7 +14,7 @@ def convert_date(date: str) -> str:
print(f"::group::{PRODUCT}")
releases = dict()
versions = dict()
main = endoflife.fetch_url(URL)
soup = BeautifulSoup(main, features="html5lib")
@@ -38,7 +38,7 @@ sorted_versions = sorted(
)
for v in sorted_versions:
if v in releases:
if v in versions:
continue # if we already know the release date, skip it
relnotes = endoflife.fetch_url(RELNOTES_URL_TEMPLATE.format(version=v))
@@ -46,11 +46,8 @@ for v in sorted_versions:
# convert x.y to x.y.0
version = f"{version}.0" if len(version.split(".")) == 2 else version
date = convert_date(date_str)
releases[version] = date
versions[version] = date
print(f"{version}: {date}")
endoflife.write_releases(PRODUCT, dict(
# sort by version then date (asc)
sorted(releases.items(), key=lambda x: (x[0], x[1]))
))
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -5,17 +5,15 @@ PRODUCT = "typo3"
URL = "https://get.typo3.org/api/v1/release/"
print(f"::group::{PRODUCT}")
releases = {}
versions = {}
response = endoflife.fetch_url(URL)
data = json.loads(response)
for v in data:
if v['type'] != 'development':
date = v["date"][0:10]
releases[v["version"]] = date
versions[v["version"]] = date
print(f"{v['version']}: {date}")
endoflife.write_releases(PRODUCT, dict(sorted(
releases.items(), key=lambda x: list(map(int, x[0].split(".")))
)))
endoflife.write_releases(PRODUCT, versions)
print("::endgroup::")

View File

@@ -30,14 +30,11 @@ def fetch_releases(releases, url) -> str:
print(f"::group::{PRODUCT}")
all_releases = {}
all_versions = {}
next_page_url = URL
while next_page_url:
next_page_url = fetch_releases(all_releases, next_page_url)
next_page_url = fetch_releases(all_versions, next_page_url)
endoflife.write_releases(PRODUCT, dict(
# sort by version then date (asc)
sorted(all_releases.items(), key=lambda x: (x[0], x[1]))
))
endoflife.write_releases(PRODUCT, all_versions)
print("::endgroup::")