[apache-http-server] Refactor script (#212)

Make the script more readable, mostly by:

- using the endoflife.Product class,
- removing the unnecessary use of functions,
- renaming a few variables,
- declaring a constant for regexes.
This commit is contained in:
Marc Wrobel
2023-12-10 13:19:17 +01:00
committed by GitHub
parent 06c462c3cc
commit 7d462ffe90
2 changed files with 25 additions and 49 deletions

View File

@@ -1,62 +1,38 @@
import re
from pathlib import Path
from common import dates
from common import endoflife
from common.git import Git
"""Fetch apache versions from its git repository.
"""Fetches Apache HTTP Server versions and release date from its git repository
by looking at the STATUS file of each <major>.<minor>.x branch."""
Every branch formatted like 2.4.x has a STATUS file which contains a version
history. Not every version was released, the lines are filtered with
(?:Released|Announced) to get the released versions only (they were not
consistent in the past with the wording, it seems better now).
"""
VERSION_AND_DATE_PATTERNS = [
# for most versions
re.compile(r"\s+(?P<version>\d+\.\d+\.\d+)\s*:.*(?:Released|Announced|Released and Retired)\s(?:on\s)?(?P<date>\w+\s\d\d?,\s\d{4})"),
# for older 2.0.x versions (only GA versions are considered)
re.compile(r"\s+(?P<version>\d+\.\d+\.\d+)\s*:.*released\s(?P<date>\w+\s\d\d?,\s\d{4}) as GA"),
# for older 1.3.x versions, we take the date of the tag and not the date of the release (too difficult to parse)
re.compile(r"\s+(?P<version>\d+\.\d+\.\d+)\s*:.*Tagged and [rR]olled\s(?:on\s)?(?P<date>\w+\.?\s\d\d?,\s\d{4})"),
]
PRODUCT = "apache-http-server"
REPO_URL = "https://github.com/apache/httpd.git"
product = endoflife.Product("apache-http-server")
print(f"::group::{product.name}")
git = Git("https://github.com/apache/httpd.git")
git.setup()
for branch in git.list_branches("refs/heads/?.?.x"):
git.checkout(branch, file_list=["STATUS"])
def parse(date: str) -> str:
date = date.replace("Feburary", "February")
date = date.replace(". ", " ")
return dates.parse_date(date).strftime("%Y-%m-%d")
def fetch_versions_from_file(release_notes_file: Path, versions: dict):
release_notes_file = git.repo_dir / "STATUS"
if not release_notes_file.exists():
return {}
continue
with open(release_notes_file, "rb") as f:
plain = f.read().decode("utf-8", errors="ignore")
release_notes = f.read().decode("utf-8", errors="ignore")
# for most versions
for (version, date_str) in re.findall(r"\s+(?P<version>\d+\.\d+\.\d+)\s*:.*(?:Released|Announced|Released and Retired)\s(?:on\s)?(?P<date>\w+\s\d\d?,\s\d{4})", plain):
date = parse(date_str)
versions[version] = date
print(f"{version}: {date}")
for pattern in VERSION_AND_DATE_PATTERNS:
for (version, date_str) in pattern.findall(release_notes):
product.declare_version(version, dates.parse_date(date_str))
# for older 2.0.x versions (only GA versions are considered)
for (version, date_str) in re.findall(r"\s+(?P<version>\d+\.\d+\.\d+)\s*:.*released\s(?P<date>\w+\s\d\d?,\s\d{4}) as GA", plain):
date = parse(date_str)
versions[version] = date
print(f"{version}: {date}")
# for older 1.3.x versions, we take the date of the tag and not the date of the release (too difficult to parse)
for (version, date_str) in re.findall(r"\s+(?P<version>\d+\.\d+\.\d+)\s*:.*Tagged and [rR]olled\s(?:on\s)?(?P<date>\w+\.?\s\d\d?,\s\d{4})", plain):
date = parse(date_str)
versions[version] = date
print(f"{version}: {date}")
git = Git(REPO_URL)
git.setup()
versions = {}
print(f"::group::{PRODUCT}")
for branch in git.list_branches("refs/heads/?.?.x"):
status_file = "STATUS"
git.checkout(branch, file_list=[status_file])
fetch_versions_from_file(git.repo_dir / status_file, versions)
product.write()
print("::endgroup::")
endoflife.write_releases(PRODUCT, versions)