100 lines
3.2 KiB
Python
100 lines
3.2 KiB
Python
|
|
||
|
from collections import defaultdict
|
||
|
import copy
|
||
|
import json
|
||
|
import os
|
||
|
from pathlib import Path
|
||
|
import shutil
|
||
|
import subprocess
|
||
|
import sys
|
||
|
import tempfile
|
||
|
import toml
|
||
|
import util
|
||
|
import yaml
|
||
|
|
||
|
|
||
|
registry_path = Path(sys.argv[1])
|
||
|
desired_packages_path = Path(sys.argv[2])
|
||
|
package_overrides = json.loads(sys.argv[3])
|
||
|
dependencies_path = Path(sys.argv[4])
|
||
|
out_path = Path(sys.argv[5])
|
||
|
|
||
|
with open(desired_packages_path, "r") as f:
|
||
|
desired_packages = yaml.safe_load(f) or []
|
||
|
|
||
|
uuid_to_versions = defaultdict(list)
|
||
|
for pkg in desired_packages:
|
||
|
uuid_to_versions[pkg["uuid"]].append(pkg["version"])
|
||
|
|
||
|
with open(dependencies_path, "r") as f:
|
||
|
uuid_to_store_path = yaml.safe_load(f)
|
||
|
|
||
|
os.makedirs(out_path)
|
||
|
|
||
|
registry = toml.load(registry_path / "Registry.toml")
|
||
|
registry["packages"] = {k: v for k, v in registry["packages"].items() if k in uuid_to_versions}
|
||
|
|
||
|
for (uuid, versions) in uuid_to_versions.items():
|
||
|
if uuid in package_overrides:
|
||
|
info = package_overrides[uuid]
|
||
|
|
||
|
# Make a registry entry based on the info from the package override
|
||
|
path = Path(info["name"][0].upper()) / Path(info["name"])
|
||
|
registry["packages"][uuid] = {
|
||
|
"name": info["name"],
|
||
|
"path": str(path),
|
||
|
}
|
||
|
|
||
|
os.makedirs(out_path / path)
|
||
|
|
||
|
# Read the Project.yaml from the src
|
||
|
project = toml.load(Path(info["src"]) / "Project.toml")
|
||
|
|
||
|
# Generate all the registry files
|
||
|
with open(out_path / path / Path("Compat.toml"), "w") as f:
|
||
|
f.write('["%s"]\n' % info["version"])
|
||
|
# Write nothing in Compat.toml, because we've already resolved everything
|
||
|
with open(out_path / path / Path("Deps.toml"), "w") as f:
|
||
|
f.write('["%s"]\n' % info["version"])
|
||
|
if "deps" in project:
|
||
|
toml.dump(project["deps"], f)
|
||
|
with open(out_path / path / Path("Versions.toml"), "w") as f:
|
||
|
f.write('["%s"]\n' % info["version"])
|
||
|
f.write('git-tree-sha1 = "%s"\n' % info["treehash"])
|
||
|
with open(out_path / path / Path("Package.toml"), "w") as f:
|
||
|
toml.dump({
|
||
|
"name": info["name"],
|
||
|
"uuid": uuid,
|
||
|
"repo": "file://" + info["src"],
|
||
|
}, f)
|
||
|
|
||
|
elif uuid in registry["packages"]:
|
||
|
registry_info = registry["packages"][uuid]
|
||
|
name = registry_info["name"]
|
||
|
path = registry_info["path"]
|
||
|
|
||
|
os.makedirs(out_path / path)
|
||
|
|
||
|
# Copy some files to the minimal repo unchanged
|
||
|
for f in ["Compat.toml", "Deps.toml", "WeakCompat.toml", "WeakDeps.toml"]:
|
||
|
if (registry_path / path / f).exists():
|
||
|
shutil.copy2(registry_path / path / f, out_path / path)
|
||
|
|
||
|
# Copy the Versions.toml file, trimming down to the versions we care about
|
||
|
all_versions = toml.load(registry_path / path / "Versions.toml")
|
||
|
versions_to_keep = {k: v for k, v in all_versions.items() if k in versions}
|
||
|
for k, v in versions_to_keep.items():
|
||
|
del v["nix-sha256"]
|
||
|
with open(out_path / path / "Versions.toml", "w") as f:
|
||
|
toml.dump(versions_to_keep, f)
|
||
|
|
||
|
# Fill in the local store path for the repo
|
||
|
if not uuid in uuid_to_store_path: continue
|
||
|
package_toml = toml.load(registry_path / path / "Package.toml")
|
||
|
package_toml["repo"] = "file://" + uuid_to_store_path[uuid]
|
||
|
with open(out_path / path / "Package.toml", "w") as f:
|
||
|
toml.dump(package_toml, f)
|
||
|
|
||
|
with open(out_path / "Registry.toml", "w") as f:
|
||
|
toml.dump(registry, f)
|