diff --git a/scripts/dp-depman/example-pack/pack.mcmeta b/scripts/dp-depman/example-pack/pack.mcmeta index 3d5121a..970be50 100644 --- a/scripts/dp-depman/example-pack/pack.mcmeta +++ b/scripts/dp-depman/example-pack/pack.mcmeta @@ -1,8 +1,10 @@ { "pack": { "description": "example-pack — demonstrates dp-depman dependency system", - "pack_format": 107, - "min_format": 107, - "max_format": 107 + "pack_format": 48, + "supported_formats": { + "min_inclusive": 41, + "max_inclusive": 71 + } } } diff --git a/scripts/dp-depman/scripts/dp-resolve.py b/scripts/dp-depman/scripts/dp-resolve.py index dbafb2b..57cf582 100644 --- a/scripts/dp-depman/scripts/dp-resolve.py +++ b/scripts/dp-depman/scripts/dp-resolve.py @@ -390,27 +390,34 @@ def build_merged_zip(manifest: dict, resolved: dict, root: Path, token: str | No merged_path = out / f"{manifest['id']}-{manifest['version']}-merged.zip" seen: dict[str, str] = {} + contents: dict[str, bytes] = {} conflicts = [] + for dep_id, info in resolved.items(): + with zipfile.ZipFile(get_dep_zip(dep_id, info, root, token, (deps or {}).get(dep_id))) as dz: + for name in dz.namelist(): + if name.endswith("/"): + continue + if name in seen: + conflicts.append(f" CONFLICT: '{name}' ({seen[name]} -> overwritten by {dep_id})") + seen[name] = dep_id + contents[name] = dz.read(name) + + pack_root = _get_pack_root(manifest, root) + for file in pack_root.rglob("*"): + if file.is_file() and not _should_exclude(file, pack_root): + arc = str(file.relative_to(pack_root)) + if arc in seen: + conflicts.append(f" CONFLICT: '{arc}' ({seen[arc]} -> overwritten by {manifest['id']} (override))") + seen[arc] = f"{manifest['id']} (override)" + contents[arc] = file.read_bytes() + with zipfile.ZipFile(merged_path, "w", zipfile.ZIP_DEFLATED) as zf: - for dep_id, info in resolved.items(): - with zipfile.ZipFile(get_dep_zip(dep_id, info, root, token, (deps or {}).get(dep_id))) as dz: - for name in dz.namelist(): - if name in seen: - conflicts.append(f" CONFLICT: '{name}' ({seen[name]} ↔ {dep_id})") - else: - seen[name] = dep_id - zf.writestr(name, dz.read(name)) - - pack_root = _get_pack_root(manifest, root) - for file in pack_root.rglob("*"): - if file.is_file() and not _should_exclude(file, pack_root): - arc = str(file.relative_to(pack_root)) - seen[arc] = f"{manifest['id']} (override)" - zf.write(file, arc) + for arc, data in contents.items(): + zf.writestr(arc, data) if conflicts: - warn("Namespace conflicts detected — main pack overrides:") + warn("Namespace conflicts detected — later source overrides:") for c in conflicts: warn(c)