76 lines
2.7 KiB
Python
76 lines
2.7 KiB
Python
# This script is used by CI to modify the deployment matrix for the extension distribution
|
|
|
|
import argparse
|
|
import json
|
|
import sys
|
|
import logging
|
|
|
|
# Define command-line arguments
|
|
parser = argparse.ArgumentParser(description="Filter a JSON file based on excluded duckdb_arch values and select an OS")
|
|
parser.add_argument("--input", required=True, help="Input JSON file path")
|
|
parser.add_argument("--exclude", required=True, help="Semicolon-separated list of excluded duckdb_arch values")
|
|
parser.add_argument("--output", help="Output JSON file path")
|
|
parser.add_argument("--pretty", action="store_true", help="Pretty print the output JSON")
|
|
parser.add_argument("--select_os", help="Select an OS to include in the output JSON")
|
|
parser.add_argument("--deploy_matrix", action="store_true", help="Create a merged list used in deploy step")
|
|
args = parser.parse_args()
|
|
|
|
# Parse the input file path, excluded arch values, and output file path
|
|
input_json_file_path = args.input
|
|
excluded_arch_values = args.exclude.split(";")
|
|
output_json_file_path = args.output
|
|
select_os = args.select_os
|
|
|
|
# Read the input JSON file
|
|
with open(input_json_file_path, "r") as json_file:
|
|
data = json.load(json_file)
|
|
|
|
|
|
# Function to filter entries based on duckdb_arch values
|
|
def filter_entries(data, arch_values):
|
|
for os, config in data.items():
|
|
if "include" in config:
|
|
config["include"] = [entry for entry in config["include"] if entry["duckdb_arch"] not in arch_values]
|
|
if not config["include"]:
|
|
del config["include"]
|
|
|
|
return data
|
|
|
|
|
|
# Filter the JSON data
|
|
filtered_data = filter_entries(data, excluded_arch_values)
|
|
|
|
# Select an OS if specified
|
|
if select_os:
|
|
found = False
|
|
for os in filtered_data.keys():
|
|
if os == select_os:
|
|
filtered_data = filtered_data[os]
|
|
found = True
|
|
break
|
|
if found == False:
|
|
logging.warning('A selection OS was provided but not found')
|
|
filtered_data = []
|
|
|
|
# When deploy_matrix is specified, we only output a single merged include list with all the duckdb_archs
|
|
elif args.deploy_matrix:
|
|
deploy_archs = []
|
|
|
|
for os, config in filtered_data.items():
|
|
if "include" in config:
|
|
for item in config["include"]:
|
|
deploy_archs.append({"duckdb_arch": item["duckdb_arch"]})
|
|
|
|
filtered_data = {"include": deploy_archs}
|
|
|
|
# Determine the JSON formatting
|
|
indent = 2 if args.pretty else None
|
|
|
|
# If no output file is provided, print to stdout
|
|
if output_json_file_path:
|
|
with open(output_json_file_path, "w") as output_json_file:
|
|
if filtered_data:
|
|
json.dump(filtered_data, output_json_file, indent=indent)
|
|
else:
|
|
json.dump(filtered_data, sys.stdout, indent=indent)
|