diff --git a/src/couchbase-server.py b/src/couchbase-server.py index 40c98052..b4463984 100644 --- a/src/couchbase-server.py +++ b/src/couchbase-server.py @@ -3,54 +3,42 @@ from bs4 import BeautifulSoup from common import http from common import dates from common import endoflife +from datetime import datetime -"""Fetch versions with their dates from docs.couchbase.com. +"""Fetches versions from release notes of each minor version on docs.couchbase.com. -Versions are fetched from the release notes of each minor version. Date is not -accurate (only month and year are provided) but it's already better than the -previous implementation which use dates of the images on Docker Hub. Because -of that lack of precision, all dates are set to the 15th of the month. - -Notes: -- documentation for oldest versions is not available anymore on - docs.couchbase.com, so this script is using the Wayback Machine to fetch them. -- dates are not available for some versions, those had to be set manually. +Dates are not available for all versions, so they must be set manually in some cases. +Moreover dates are not accurate (only month and year are provided), so they are set to the last day of the month. """ -PRODUCT = "couchbase-server" -REGEX = r"^Release (?P\d+\.\d+(\.\d+)?) \((?P.+)\)$" URLS = "https://docs.couchbase.com/server" -FIXED_VERSIONS = { - "6.0.0": "2018-10-31", # https://www.couchbase.com/blog/announcing-couchbase-6-0/ - "6.0.1": "2019-02-15", # https://web.archive.org/web/20190307191211/https://docs.couchbase.com/server/6.0/release-notes/relnotes.html - "6.6.0": "2020-08-12", # https://www.couchbase.com/blog/whats-new-and-improved-in-couchbase-server-6-6/ - "7.2.0": "2023-06-01", # https://www.couchbase.com/blog/couchbase-capella-spring-release-72/ +VERSION_AND_DATE_PATTERN = re.compile(r"^Release (?P\d+\.\d+(\.\d+)?) \((?P.+)\)$") +MANUAL_VERSIONS = { + "6.0.0": datetime(2018, 10, 31), # https://www.couchbase.com/blog/announcing-couchbase-6-0/ + "6.0.1": datetime(2019, 2, 15), # https://web.archive.org/web/20190307191211/https://docs.couchbase.com/server/6.0/release-notes/relnotes.html + "6.6.0": datetime(2020, 8, 12), # https://www.couchbase.com/blog/whats-new-and-improved-in-couchbase-server-6-6/ + "7.2.0": datetime(2023, 6, 1), # https://www.couchbase.com/blog/couchbase-capella-spring-release-72/ } -print(f"::group::{PRODUCT}") -versions = {} - -response = http.fetch_url(f"{URLS}/current/install/install-intro.html") -soup = BeautifulSoup(response.text, features="html5lib") - -minor_versions = [options.attrs["value"] for options in soup.find(class_="version_list").find_all("option")] - -# there is no date available for x.y.0 -for minor in minor_versions: - versions[minor + '.0'] = 'N/A' +product = endoflife.Product("couchbase-server") +print(f"::group::{product.name}") +main = http.fetch_url(f"{URLS}/current/install/install-intro.html") +main_soup = BeautifulSoup(main.text, features="html5lib") +minor_versions = [options.attrs["value"] for options in main_soup.find(class_="version_list").find_all("option")] minor_version_urls = [f"{URLS}/{minor}/release-notes/relnotes.html" for minor in minor_versions] -for response in http.fetch_urls(minor_version_urls): - soup = BeautifulSoup(response.text, features="html5lib") - for title in soup.find_all("h2"): - versionAndDate = title.get_text().strip() - m = re.match(REGEX, versionAndDate) - if m: - version = f"{m['version']}.0" if len(m['version'].split('.')) == 2 else m['version'] - date = dates.parse_month_year_date(m['date']).strftime("%Y-%m-%d") - versions[version] = date - print(f"{version}: {date}") -versions = versions | FIXED_VERSIONS -endoflife.write_releases(PRODUCT, versions) +for minor_version in http.fetch_urls(minor_version_urls): + minor_version_soup = BeautifulSoup(minor_version.text, features="html5lib") + + for title in minor_version_soup.find_all("h2"): + match = VERSION_AND_DATE_PATTERN.match(title.get_text().strip()) + if match: + version = match["version"] + version = f"{version}.0" if len(version.split(".")) == 2 else version + date = dates.parse_month_year_date(match['date']) + product.declare_version(version, date) + +product.declare_versions(MANUAL_VERSIONS) +product.write() print("::endgroup::")