Merge pull request #15 from dear-clouds/master

Only affects src:all:kavita in generate-build-matrices.py
This commit is contained in:
Joe Milazzo
2025-06-28 12:23:35 -05:00
committed by GitHub

View File

@@ -1,113 +1,33 @@
import itertools
import json import json
import os import os
import re
import subprocess
import sys import sys
from pathlib import Path
from typing import NoReturn from typing import NoReturn
EXTENSION_REGEX = re.compile(r"^src/(?P<lang>\w+)/(?P<extension>\w+)")
MULTISRC_LIB_REGEX = re.compile(r"^lib-multisrc/(?P<multisrc>\w+)")
LIB_REGEX = re.compile(r"^lib/(?P<lib>\w+)")
MODULE_REGEX = re.compile(r"^:src:(?P<lang>\w+):(?P<extension>\w+)$")
CORE_FILES_REGEX = re.compile(
r"^(buildSrc/|core/|gradle/|build\.gradle\.kts|common\.gradle|gradle\.properties|settings\.gradle\.kts|utils/)"
)
def run_command(command: str) -> str:
result = subprocess.run(command, capture_output=True, text=True, shell=True)
if result.returncode != 0:
print(result.stderr.strip())
sys.exit(result.returncode)
return result.stdout.strip()
def get_module_list(ref: str) -> tuple[list[str], list[str]]:
changed_files = run_command(f"git diff --name-only {ref}").splitlines()
modules = set()
libs = set()
deleted = set()
core_files_changed = False
for file in map(lambda x: Path(x).as_posix(), changed_files):
if CORE_FILES_REGEX.search(file):
core_files_changed = True
elif match := EXTENSION_REGEX.search(file):
lang = match.group("lang")
extension = match.group("extension")
if Path("src", lang, extension).is_dir():
modules.add(f':src:{lang}:{extension}')
deleted.add(f"{lang}.{extension}")
elif match := MULTISRC_LIB_REGEX.search(file):
multisrc = match.group("multisrc")
if Path("lib-multisrc", multisrc).is_dir():
libs.add(f":lib-multisrc:{multisrc}:printDependentExtensions")
elif match := LIB_REGEX.search(file):
lib = match.group("lib")
if Path("lib", lib).is_dir():
libs.add(f":lib:{lib}:printDependentExtensions")
def is_extension_module(module: str) -> bool:
if not (match := MODULE_REGEX.search(module)):
return False
lang = match.group("lang")
extension = match.group("extension")
deleted.add(f"{lang}.{extension}")
return True
if len(libs) != 0 and not core_files_changed:
modules.update([
module for module in
run_command("./gradlew -q " + " ".join(libs)).splitlines()
if is_extension_module(module)
])
if os.getenv("IS_PR_CHECK") != "true" and not core_files_changed:
with Path(".github/always_build.json").open() as always_build_file:
always_build = json.load(always_build_file)
for extension in always_build:
modules.add(":src:" + extension.replace(".", ":"))
deleted.add(extension)
if core_files_changed:
(all_modules, all_deleted) = get_all_modules()
modules.update(all_modules)
deleted.update(all_deleted)
return list(modules), list(deleted)
def get_all_modules() -> tuple[list[str], list[str]]:
modules = []
deleted = []
for lang in Path("src").iterdir():
for extension in lang.iterdir():
modules.append(f":src:{lang.name}:{extension.name}")
deleted.append(f"{lang.name}.{extension.name}")
return modules, deleted
def main() -> NoReturn: def main() -> NoReturn:
_, ref, build_type = sys.argv _, _, build_type = sys.argv
modules, deleted = get_module_list(ref)
# Always build only src:all:kavita
modules = [":src:all:kavita"]
deleted = ["all.kavita"]
chunked = { chunked = {
"chunk": [ "chunk": [
{"number": i + 1, "modules": modules} {
for i, modules in "number": 1,
enumerate(itertools.batched( "modules": [f":src:all:kavita:assemble{build_type}"]
map(lambda x: f"{x}:assemble{build_type}", modules), }
int(os.getenv("CI_CHUNK_SIZE", 65))
))
] ]
} }
print(f"Module chunks to build:\n{json.dumps(chunked, indent=2)}\n\nModule to delete:\n{json.dumps(deleted, indent=2)}") print(
f"Module chunks to build:\n{json.dumps(chunked, indent=2)}\n\nModule to delete:\n{json.dumps(deleted, indent=2)}")
if os.getenv("CI") == "true": if os.getenv("CI") == "true":
with open(os.getenv("GITHUB_OUTPUT"), 'a') as out_file: with open(os.getenv("GITHUB_OUTPUT"), 'a') as out_file:
out_file.write(f"matrix={json.dumps(chunked)}\n") out_file.write(f"matrix={json.dumps(chunked)}\n")
out_file.write(f"delete={json.dumps(deleted)}\n") out_file.write(f"delete={json.dumps(deleted)}\n")
if __name__ == '__main__': if __name__ == '__main__':
main() main()