build/lib/tools/info/output-debs-to-repo-json.py

131 lines
5.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
#
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2023 Ricardo Pardini <ricardo@pardini.net>
# This file is a part of the Armbian Build Framework https://github.com/armbian/build/
#
import json
import logging
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from common import armbian_utils
# Prepare logging
armbian_utils.setup_logging()
log: logging.Logger = logging.getLogger("output-debs-to-repo-json")
def generate_deb_summary(info):
ret = []
for artifact_id in info["artifacts"]:
artifact = info["artifacts"][artifact_id]
# skip = not not artifact["oci"]["up-to-date"]
# if skip:
# continue
artifact_name = artifact['in']['artifact_name']
desc = f"{artifact['out']['artifact_name']}={artifact['out']['artifact_version']}"
out = artifact["out"]
artifact_type = out["artifact_type"]
artifact_version = out["artifact_version"]
artifact_final_version_reversioned = out["artifact_final_version_reversioned"]
artifact_deb_repo = out["artifact_deb_repo"]
if not (artifact_type == "deb" or artifact_type == "deb-tar"):
continue
all_debs: dict[str, dict] = {}
artifact_map_debs_keys = out["artifact_map_debs_keys_ARRAY"]
artifact_map_debs_values = out["artifact_map_debs_values_ARRAY"]
artifact_map_packages_keys = out["artifact_map_packages_keys_ARRAY"]
artifact_map_packages_values = out["artifact_map_packages_values_ARRAY"]
artifact_map_debs_reversioned_keys = out["artifact_map_debs_reversioned_keys_ARRAY"]
artifact_map_debs_reversioned_values = out["artifact_map_debs_reversioned_values_ARRAY"]
# Sanity check: all those array should have the same amount of elements.
if not (len(artifact_map_debs_keys) == len(artifact_map_debs_values) == len(artifact_map_packages_keys) ==
len(artifact_map_packages_values) == len(artifact_map_debs_reversioned_keys) == len(artifact_map_debs_reversioned_values)):
log.error(f"Error: artifact {artifact_id} has different amount of keys and values in the map: {artifact}")
continue
# Sanity check: all keys should be the same
if not (artifact_map_debs_keys == artifact_map_packages_keys == artifact_map_debs_reversioned_keys):
log.error(f"Error: artifact {artifact_id} has different keys in the map: {artifact}")
continue
for i in range(len(artifact_map_debs_keys)):
key = artifact_map_debs_keys[i]
# add to all_debs, but check if it's already there
if key in all_debs:
log.error(f"Error: artifact {artifact_id} has duplicated key {key} in the map: {artifact}")
continue
if artifact_deb_repo == "global":
repo_target = "armbian"
else:
repo_target = f'armbian-{artifact_deb_repo}'
all_debs[key] = {
"relative_deb_path": (artifact_map_debs_reversioned_values[i]),
"package_name": (artifact_map_packages_values[i]),
"repo_target": repo_target
}
# Aggregate all repo_targets from their debs. There can be only one. Eg: each artifact can only be in one repo_target, no matter how many debs.
repo_targets = set()
for key in all_debs:
repo_targets.add(all_debs[key]["repo_target"])
if len(repo_targets) > 1:
log.error(f"Error: artifact {artifact_id} has debs in different repo_targets: {artifact}")
continue
repo_target = repo_targets.pop()
inputs = artifact["in"]["original_inputs"]
# get the invocation, in array format. "what do I run to download the debs" for this artifact. args are NOT quoted.
invocation = (["download-artifact"] + armbian_utils.map_to_armbian_params(inputs["vars"], False) + inputs["configs"])
item = {
"id": artifact_id, "desc": desc,
"artifact_name": artifact_name,
"artifact_type": artifact_type,
"artifact_version": artifact_version,
"artifact_final_version_reversioned": artifact_final_version_reversioned,
"artifact_deb_repo": artifact_deb_repo,
"repo_target": repo_target,
"download_invocation": invocation,
"debs": all_debs
}
ret.append(item)
return ret
# This is called like this:
# /usr/bin/python3 /armbian/lib/tools/info/output-debs-to-repo.py /armbian/output/info /armbian/output/info/outdated-artifacts-images.json
# first arg the output directory (output/info)
info_output_dir = sys.argv[1]
output_json_file = os.path.join(info_output_dir, "debs-to-repo-info.json")
outdated_artifacts_image_json_filepath = sys.argv[2]
# read the json file passed as second argument as a json object
with open(outdated_artifacts_image_json_filepath) as f:
info = json.load(f)
artifact_debs = generate_deb_summary(info)
# dump the json to a debs-to-repo-info.json file in the output directory
with open(output_json_file, "w") as f:
json.dump(artifact_debs, f, indent=4)
log.info(f"Done writing {output_json_file}")