Add catalog branching
This commit is contained in:
parent
3d4e4f40c2
commit
9135214802
20
mangle/generators/generate_catalog_branched
Normal file
20
mangle/generators/generate_catalog_branched
Normal file
@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
# Creates a prepopulate from KPR and then creates a catalog
|
||||
set -e
|
||||
|
||||
if [ -n "$1" ]; then
|
||||
NEWMAJOR=$1
|
||||
else
|
||||
echo "Major version not specified"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
tmpdir=$(mktemp -d)
|
||||
bash generate_prepopulate_from_kpr ${NEWMAJOR}
|
||||
git clone https://github.com/rocky-linux/peridot-releng.git "${tmpdir}/peridot-releng"
|
||||
cp prepopcatalog.py "${tmpdir}/peridot-releng/pungicatalog/"
|
||||
pushd "${tmpdir}/peridot-releng" || { echo "Could not change directory"; exit 1; }
|
||||
python3 pungicatalog/prepopcatalog.py --major ${NEWMAJOR} --minor 0 --prepopulate-path /tmp/prepopulate.json --output-path "${tmpdir}/branched.cfg"
|
||||
popd || { echo "Could not change back..."; exit 1; }
|
||||
|
||||
echo "File located at: ${tmpdir}/branched.cfg"
|
156
mangle/generators/prepopcatalog.py
Normal file
156
mangle/generators/prepopcatalog.py
Normal file
@ -0,0 +1,156 @@
|
||||
#!/usr/bin/env python3
|
||||
# This is copied into peridot-releng and ran. This file is likely temporary
|
||||
# until we decide if this goes into that git repo.
|
||||
import argparse
|
||||
import os
|
||||
import json
|
||||
|
||||
from catalog import (
|
||||
PeridotCatalogSync,
|
||||
PeridotCatalogSyncPackage,
|
||||
PeridotCatalogSyncPackageType,
|
||||
PeridotCatalogSyncRepository,
|
||||
)
|
||||
|
||||
def main(prepopulate: str, output_path: str, major: int, minor: int):
|
||||
print(f"Using prepopulate file: {prepopulate}")
|
||||
|
||||
with open(prepopulate) as json_file:
|
||||
prepop = json.load(json_file)
|
||||
json_file.close()
|
||||
|
||||
# Create a catalog
|
||||
catalog = PeridotCatalogSync()
|
||||
catalog.major = major
|
||||
catalog.minor = minor
|
||||
|
||||
# Create indexes
|
||||
package_index = {}
|
||||
repo_module_index = {}
|
||||
module_name_index = {}
|
||||
module_defaults = []
|
||||
|
||||
# Read prepopulate json and create package objects
|
||||
all_arches = []
|
||||
for repo in prepop.keys():
|
||||
for arch in prepop[repo].keys():
|
||||
if arch not in all_arches:
|
||||
all_arches.append(arch)
|
||||
for package in prepop[repo][arch].keys():
|
||||
if package not in package_index:
|
||||
package_index[package] = {}
|
||||
if repo not in package_index[package]:
|
||||
package_index[package][repo] = {
|
||||
"include_filter": [],
|
||||
"multilib": [],
|
||||
}
|
||||
na_list = prepop[repo][arch][package]
|
||||
for na in na_list:
|
||||
splitted = na.split(".")
|
||||
arch_package = splitted[len(splitted) - 1]
|
||||
if arch != arch_package and arch_package != "noarch":
|
||||
if arch not in package_index[package][repo]["multilib"]:
|
||||
package_index[package][repo]["multilib"].append(arch)
|
||||
if na not in package_index[package][repo]["include_filter"]:
|
||||
package_index[package][repo]["include_filter"].append(na)
|
||||
|
||||
arch_specific_excludes = {}
|
||||
na_index = {}
|
||||
for pkg in package_index.keys():
|
||||
for repo in package_index[pkg].keys():
|
||||
na_list = list(
|
||||
filter(
|
||||
lambda x: x.endswith(".noarch"),
|
||||
package_index[pkg][repo]["include_filter"],
|
||||
)
|
||||
)
|
||||
if not na_list:
|
||||
continue
|
||||
exclude_arches = {}
|
||||
for na in na_list:
|
||||
for arch in all_arches:
|
||||
if (
|
||||
arch not in prepop[repo]
|
||||
or pkg not in prepop[repo][arch]
|
||||
or na not in prepop[repo][arch][pkg]
|
||||
):
|
||||
if na not in exclude_arches:
|
||||
exclude_arches[na] = []
|
||||
exclude_arches[na].append(arch)
|
||||
na_index[na] = na
|
||||
if not exclude_arches:
|
||||
continue
|
||||
if pkg not in arch_specific_excludes:
|
||||
arch_specific_excludes[pkg] = {}
|
||||
if repo not in arch_specific_excludes[pkg]:
|
||||
arch_specific_excludes[pkg][repo] = []
|
||||
arch_specific_excludes[pkg][repo].append(exclude_arches)
|
||||
|
||||
# Index arch specific excludes by repo and arch
|
||||
repo_arch_index = {}
|
||||
for pkg in arch_specific_excludes.keys():
|
||||
for repo in arch_specific_excludes[pkg].keys():
|
||||
if repo not in repo_arch_index:
|
||||
repo_arch_index[repo] = {}
|
||||
for arches2 in arch_specific_excludes[pkg][repo]:
|
||||
for na in arches2.keys():
|
||||
for arch in arches2[na]:
|
||||
if arch not in repo_arch_index[repo]:
|
||||
repo_arch_index[repo][arch] = []
|
||||
if na not in repo_arch_index[repo][arch]:
|
||||
repo_arch_index[repo][arch].append(na)
|
||||
|
||||
# Add noarch packages not in a specific arch to exclude filter
|
||||
for repo in repo_arch_index.keys():
|
||||
repo_key = f"^{repo}$"
|
||||
filter_tuple = {}
|
||||
for arch in repo_arch_index[repo].keys():
|
||||
if arch not in filter_tuple:
|
||||
filter_tuple[arch] = []
|
||||
for na in repo_arch_index[repo][arch]:
|
||||
na = na.removesuffix(".noarch")
|
||||
if na not in filter_tuple[arch]:
|
||||
filter_tuple[arch].append(na)
|
||||
catalog.exclude_filter.append((repo_key, filter_tuple))
|
||||
|
||||
for package in package_index.keys():
|
||||
package_type = PeridotCatalogSyncPackageType.PACKAGE_TYPE_NORMAL_FORK
|
||||
if package in module_name_index:
|
||||
package_type = PeridotCatalogSyncPackageType.PACKAGE_TYPE_NORMAL_FORK_MODULE
|
||||
elif package.startswith("rocky-"):
|
||||
package_type = PeridotCatalogSyncPackageType.PACKAGE_TYPE_NORMAL_SRC
|
||||
|
||||
catalog.add_package(
|
||||
PeridotCatalogSyncPackage(
|
||||
package,
|
||||
package_type,
|
||||
[
|
||||
PeridotCatalogSyncRepository(
|
||||
x,
|
||||
package_index[package][x]["include_filter"],
|
||||
package_index[package][x]["multilib"],
|
||||
(get_modules_for_repo(package, x, repo_module_index) if x in repo_module_index else None) if package in module_name_index else None,
|
||||
)
|
||||
for x in package_index[package].keys()
|
||||
],
|
||||
)
|
||||
)
|
||||
|
||||
print(f"Found {len(catalog.packages)} packages")
|
||||
|
||||
f = open(output_path, "w")
|
||||
f.write(catalog.to_prototxt())
|
||||
f.close()
|
||||
|
||||
print(f"Catalog written to {output_path}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Create a catalog from a standalone prepopulate.json"
|
||||
)
|
||||
parser.add_argument("--prepopulate-path", type=str, required=True)
|
||||
parser.add_argument("--major", type=int, required=True)
|
||||
parser.add_argument("--minor", type=int, required=True)
|
||||
parser.add_argument("--output-path", type=str, default="hidden.cfg")
|
||||
args = parser.parse_args()
|
||||
main(args.prepopulate_path, args.output_path, args.major, args.minor)
|
Loading…
Reference in New Issue
Block a user