summaryrefslogtreecommitdiff
path: root/bin/just-lock.py
diff options
context:
space:
mode:
Diffstat (limited to 'bin/just-lock.py')
-rwxr-xr-xbin/just-lock.py44
1 files changed, 30 insertions, 14 deletions
diff --git a/bin/just-lock.py b/bin/just-lock.py
index 3f1ed1ae..1639a656 100755
--- a/bin/just-lock.py
+++ b/bin/just-lock.py
@@ -745,8 +745,29 @@ def rewrite_file_repo(repo: Json, remote_type: str, remote_stub: Dict[str, Any],
fail("Unsupported remote type!")
+def update_pragmas(repo: Json, pragma: Json) -> Json:
+ """Update the description with any input-provided "absent" and "to_git"
+ pragmas, as needed:
+ - for all repositories, merge the "absent" pragma
+ - for "file"-type repositories, merge the "to_git" pragma"""
+ existing: Json = dict(repo.get("pragma", {})) # operate on copy
+ # all repos support "absent pragma"
+ absent: bool = existing.get("absent", False) or pragma.get("absent", False)
+ if absent:
+ existing["absent"] = True
+ # support "to_git" pragma for "file"-type repos
+ if repo.get("type") == "file":
+ to_git = existing.get("to_git", False) or pragma.get("to_git", False)
+ if to_git:
+ existing["to_git"] = True
+ # all other pragmas as kept; if no pragma was set, do not set any
+ if existing:
+ repo = dict(repo, **{"pragma": existing})
+ return repo
+
+
def rewrite_repo(repo_spec: Json, *, remote_type: str,
- remote_stub: Dict[str, Any], assign: Json, absent: bool,
+ remote_stub: Dict[str, Any], assign: Json, pragma: Json,
as_layer: bool, fail_context: str) -> Json:
"""Rewrite description of imported repositories."""
new_spec: Json = {}
@@ -766,8 +787,9 @@ def rewrite_repo(repo_spec: Json, *, remote_type: str,
elif repo.get("type") in ["computed", "tree structure"]:
target: str = repo.get("repo", None)
repo = dict(repo, **{"repo": assign[target]})
- if absent and isinstance(repo, dict):
- repo["pragma"] = dict(repo.get("pragma", {}), **{"absent": True})
+ # update pragmas, as needed
+ if isinstance(repo, dict):
+ repo = update_pragmas(repo, pragma)
new_spec["repository"] = repo
# rewrite other roots and bindings, if actually needed to be imported
if not as_layer:
@@ -823,19 +845,13 @@ def handle_import(remote_type: str, remote_stub: Dict[str, Any],
% (json.dumps(import_map, indent=2), ))
pragma: Json = repo_desc.get("pragma", None)
- if pragma is not None and not isinstance(pragma, dict):
+ if pragma is None:
+ pragma = {}
+ elif not isinstance(pragma, dict):
fail(
fail_context +
"Expected \"repos\" entry subfield \"pragma\" to be a map, but found:\n%r"
% (json.dumps(pragma, indent=2), ))
- absent: bool = False if pragma is None else pragma.get("absent", False)
- if absent is None:
- absent = False
- elif not isinstance(absent, bool):
- fail(
- fail_context +
- "Expected \"repos\" entry pragma \"absent\" to be a bool, but found:\n%r"
- % (json.dumps(absent, indent=2), ))
# Handle import with renaming
foreign_repos: Json = foreign_config.get("repositories", {})
@@ -869,7 +885,7 @@ def handle_import(remote_type: str, remote_stub: Dict[str, Any],
remote_type=remote_type,
remote_stub=remote_stub,
assign=total_assign,
- absent=absent,
+ pragma=pragma,
as_layer=False,
fail_context=fail_context)
for repo in extra_imports:
@@ -877,7 +893,7 @@ def handle_import(remote_type: str, remote_stub: Dict[str, Any],
remote_type=remote_type,
remote_stub=remote_stub,
assign=total_assign,
- absent=absent,
+ pragma=pragma,
as_layer=True,
fail_context=fail_context)