diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-04-25 13:14:47 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-04-25 16:34:02 +0200 |
commit | 32b934caf5b2619c78dc4d05a77fecbade603ae1 (patch) | |
tree | e1bfb410737cfd5d0680af06e93ffd00d60ab8f2 | |
parent | b61e6ac8e042f9bcc684c10f085553455b13fab1 (diff) | |
download | justbuild-32b934caf5b2619c78dc4d05a77fecbade603ae1.tar.gz |
just-deduplicate-repos: merge pragma of identified repositories
While just-deduplcate-repos only identifies repositories that are
semantically indistinguishable, there still is the pragma to consider.
- If the repository in one use requires to be present, we have to
fetch it, hence cannot treat it as absent.
- If a repository in one place has to be transformed to a git root,
this also has to happen for the copy we keep.
-rwxr-xr-x | bin/just-deduplicate-repos.py | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/bin/just-deduplicate-repos.py b/bin/just-deduplicate-repos.py index f6bf9548..ca4780b0 100755 --- a/bin/just-deduplicate-repos.py +++ b/bin/just-deduplicate-repos.py @@ -16,7 +16,7 @@ import json import sys -from typing import Any, List, Optional +from typing import Any, Dict, List, Optional, Union, cast # generic JSON type Json = Any @@ -171,12 +171,49 @@ def dedup(repos: Json, user_keep: List[str]) -> Json: return sorted(candidates, key=lambda s: (s.count("/"), len(s), s))[0] + def merge_pragma(rep: str, merged: List[str]) -> Json: + desc = cast(Union[str, Dict[str, Json]], + repos["repositories"][rep]["repository"]) + if not isinstance(desc, dict): + return desc + pragma = desc.get("pragma", {}) + # Clear pragma absent unless all merged repos that are not references + # have the pragma + absent = pragma.get("absent", False) + for c in merged: + alt_desc = cast(Union[str, Dict[str, Json]], + repos["repositories"][c]["repository"]) + if (isinstance(alt_desc, dict)): + absent = \ + absent and alt_desc.get("pragma", {}).get("absent", False) + pragma = dict(pragma, **{"absent": absent}) + if not absent: + del pragma["absent"] + # Add pragma to_git if at least one of the merged repos requires it + to_git = pragma.get("to_git", False) + for c in merged: + alt_desc = cast(Union[str, Dict[str, Json]], + repos["repositories"][c]["repository"]) + if (isinstance(alt_desc, dict)): + to_git = \ + to_git or alt_desc.get("pragma", {}).get("to_git", False) + pragma = dict(pragma, **{"to_git": to_git}) + if not to_git: + del pragma["to_git"] + # Update the pragma + desc = dict(desc, **{"pragma": pragma}) + if not pragma: + del desc["pragma"] + return desc + bisim = bisimilar_repos(repos["repositories"]) renaming = {} + updated_repos = {} for c in bisim: if len(c) == 1: continue rep = choose_representative(c) + updated_repos[rep] = merge_pragma(rep, c) for repo in c: if ((repo not in keep) and (repo != rep)): renaming[repo] = rep @@ -198,6 +235,8 @@ def dedup(repos: Json, user_keep: List[str]) -> Json: for name in repos["repositories"].keys(): if name not in renaming: desc = repos["repositories"][name] + if name in updated_repos: + desc = dict(desc, **{"repository": updated_repos[name]}) if "bindings" in desc: bindings = desc["bindings"] new_bindings = {} |