Files
endoflife-date-release-data/src/debian.py
Marc Wrobel 6ba7828f96 Refactor product releases writing
Create a common function to write resulting JSON files to the releases directory.
It makes this task simpler to read and maintain, while making it modifiable at a central point in the future.
One example of such modification could be the sorting of the versions in a uniform way for all the scripts.
2023-06-11 12:45:59 +02:00

86 lines
2.7 KiB
Python

import pathlib
import subprocess
from common import endoflife
from hashlib import sha1
from os.path import exists
from subprocess import call
"""Fetch Debian versions with their dates from www.debian.org source repository.
"""
PRODUCT = "debian"
REPO_URL = "https://salsa.debian.org/webmaster-team/webwml.git"
REPO_SHA1 = sha1(REPO_URL.encode()).hexdigest()
REPO_DIR = pathlib.Path(f"~/.cache/git/debian.md_{REPO_SHA1}").expanduser()
# Checkout the Debian website repository.
def clone_repository():
git_opts = f"--git-dir={REPO_DIR}/.git --work-tree={REPO_DIR}"
REPO_DIR.mkdir(parents=True, exist_ok=True)
if not exists(f"{REPO_DIR}/.git"):
call(f"git {git_opts} init", shell=True)
call(f"git {git_opts} remote add origin {REPO_URL}", shell=True)
call(f"git {git_opts} config core.sparseCheckout true", shell=True)
with open(f"{REPO_DIR}/.git/info/sparse-checkout", "w") as f:
f.write("english/News/")
ret_code = call(f"git {git_opts} pull --depth 1 origin master", shell=True)
exit(-ret_code) if ret_code < 0 else None
def extract_major_releases(releases):
child = subprocess.Popen(
f"grep -RhE -A 1 '<define-tag pagetitle>Debian [0-9]+.+</q> released' {REPO_DIR}/english/News "
f"| cut -d '<' -f 2 "
f"| cut -d '>' -f 2 "
f"| grep -v -- '--'",
shell=True, stdout=subprocess.PIPE)
output = child.communicate()[0].decode('utf-8')
is_release_line = True
version = None
for line in output.split('\n'):
if line:
if is_release_line:
version = line.split(" ")[1]
is_release_line = False
else:
date = line
print(f"{version}: {date}")
releases[version] = date
is_release_line = True
def extract_point_releases(releases):
child = subprocess.Popen(
f"grep -Rh -B 10 '<define-tag revision>' {REPO_DIR}/english/News "
"| grep -Eo '(release_date>(.*)<|revision>(.*)<)' "
"| cut -d '>' -f 2,4 "
"| tr -d '<' "
"| sed 's/[[:space:]]+/ /' "
"| paste -d ' ' - -",
shell=True, stdout=subprocess.PIPE)
output = child.communicate()[0].decode('utf-8')
for line in output.split('\n'):
if line:
parts = line.split(' ')
date = parts[0]
version = parts[1]
print(f"{version}: {date}")
releases[version] = date
print(f"::group::{PRODUCT}")
clone_repository()
releases = {}
extract_major_releases(releases)
extract_point_releases(releases)
endoflife.write_releases(PRODUCT, dict(
# sort by date then version (desc)
sorted(releases.items(), key=lambda x: (x[1], x[0]), reverse=True)
))
print("::endgroup::")