summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/just-deduplicate-repos.py41
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 = {}