diff options
author | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2025-02-24 17:06:56 +0100 |
---|---|---|
committer | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2025-02-28 14:57:48 +0100 |
commit | a1e68f7a02a61d5b03ca2fb1b1f5ec75fb1c9e31 (patch) | |
tree | d4eca81e217eca6493dbd3ab341f93a1080e71b0 | |
parent | b9b8339487824c7020130c51ab908cf38be7e17f (diff) | |
download | justbuild-a1e68f7a02a61d5b03ca2fb1b1f5ec75fb1c9e31.tar.gz |
just-lock clone: Fix wrong order in resolving trees
Match correctly the behavior of just-mr, i.e., resolve the special
entries of the relevant subtree of the original tree instead of
taking the subtree of the resolved original tree. This also means
that the clones of archives can directly stage the relevant subdir
of the unpacked content and forward any 'special' pragma (same as
for other cloned repository types).
-rwxr-xr-x | bin/just-lock.py | 60 | ||||
-rw-r--r-- | test/end-to-end/just-lock/clone/archive-repos.sh | 36 |
2 files changed, 23 insertions, 73 deletions
diff --git a/bin/just-lock.py b/bin/just-lock.py index 4e747fb8..0310a090 100755 --- a/bin/just-lock.py +++ b/bin/just-lock.py @@ -70,12 +70,6 @@ GIT_NOBODY_ENV: Dict[str, str] = { "GIT_CONFIG_SYSTEM": "/dev/null", } -SPECIAL_PRAGMA_TO_CAS_RESOLVE_MAP: Dict[str, str] = { - "ignore": "ignore", - "resolve-partially": "tree-upwards", - "resolve-completely": "tree-all" -} - class ObjectType(Enum): FILE = 1 @@ -2051,10 +2045,9 @@ def rewrite_cloned_repo(repos: Json, *, clone_to: str, target_repo: str, # Keep relevant pragmas from the workspace root repository pragma: Json = {} existing: Json = repos[ws_root_repo]["repository"].get("pragma", {}) - if ws_root_desc["repository"]["type"] not in ["archive", "zip"]: - special = existing.get("special", None) - if special: - pragma["special"] = special + special = existing.get("special", None) + if special: + pragma["special"] = special to_git = existing.get("to_git", False) if to_git: pragma["to_git"] = True @@ -2188,13 +2181,8 @@ def clone_repo(repos: Json, known_repo: str, deps_chain: List[str], # Fetch the archive content = archive_fetch_with_parse(repository, fail_context=fail_context) - # Stage the content; first resolve special entries, if needed, then keep - # the relevant subdir, if given - special_pragma: Optional[str] = repository.get("pragma", - {}).get("special", None) - - if (special_pragma not in SPECIAL_PRAGMA_TO_CAS_RESOLVE_MAP.keys() - and subdir is None): + # Stage the content of the relevant subdir + if subdir is None: # Unpack directly to clone location unpack_archive(content, archive_type=repo_type, @@ -2203,43 +2191,12 @@ def clone_repo(repos: Json, known_repo: str, deps_chain: List[str], else: # Unpack to a temporary dir workdir: str = create_tmp_dir(type="archive-unpack") - srcdir: str = os.path.join(workdir, "src") unpack_archive(content, archive_type=repo_type, - unpack_to=srcdir, + unpack_to=workdir, fail_context=fail_context) - - move_from_dir: str = srcdir - if (special_pragma is not None and special_pragma - in SPECIAL_PRAGMA_TO_CAS_RESOLVE_MAP.keys()): - # Resolve the tree according to the pragma - resolve_special_arg = SPECIAL_PRAGMA_TO_CAS_RESOLVE_MAP[ - special_pragma] - resolved_tree = run_cmd( - g_LAUNCHER + [ - g_JUST, "add-to-cas", "--local-build-root", g_ROOT, - "--resolve-special=%s" % resolve_special_arg, srcdir - ], - cwd=workdir, - stdout=subprocess.PIPE, - fail_context=fail_context)[0].decode('utf-8').strip() - # Stage the resolved tree - resolved_dir: str = os.path.join(workdir, "resolved") - subdir_args: List[str] = [] - if subdir is not None: - subdir_args = ["-P", subdir] - run_cmd(g_LAUNCHER + [ - g_JUST, "install-cas", "--local-build-root", g_ROOT, - "%s::t" % resolved_tree, "-o", resolved_dir - ] + subdir_args, - cwd=workdir, - fail_context=fail_context) - move_from_dir = resolved_dir - else: - # Subdir is not None, so keep only that subdirectory - move_from_dir = os.path.join(move_from_dir, cast(str, subdir)) - - # Do the move into clone directory + # Keep relevant subdir + move_from_dir: str = os.path.join(workdir, subdir) os.makedirs(clone_to, exist_ok=True) for entry in os.listdir(move_from_dir): # shutil.move uses os.rename if on same filesystem or @@ -2250,7 +2207,6 @@ def clone_repo(repos: Json, known_repo: str, deps_chain: List[str], except Exception as ex: fail(fail_context + "Moving file path %s failed with:\n%r" % (os.path.join(move_from_dir, entry), ex)) - # Clean up tmp dir try_rmtree(workdir) diff --git a/test/end-to-end/just-lock/clone/archive-repos.sh b/test/end-to-end/just-lock/clone/archive-repos.sh index 2d0c314e..c2c8a5b9 100644 --- a/test/end-to-end/just-lock/clone/archive-repos.sh +++ b/test/end-to-end/just-lock/clone/archive-repos.sh @@ -57,7 +57,7 @@ cat > repos.in.json <<EOF , "content": "${ZIP_REPO_CONTENT}" , "fetch": "http://non-existent.example.org/zip_repo.zip" , "subdir": "root" - , "pragma": {"special": "resolve-partially"} + , "pragma": {"special": "resolve-completely"} } } , "tgz_repo": @@ -118,7 +118,9 @@ grep "${CLONE_TO}/zip" repos.json grep "${CLONE_TO}/tgz" repos.json grep "${CLONE_TO}/foreign" repos.json grep "${CLONE_TO}/distdir" repos.json -[ ! $(grep pragma repos.json) ] # special pragmas should have been resolved +# check special pragmas are kept +grep resolve-completely repos.json +grep ignore repos.json echo # Check setup with local clones: @@ -127,24 +129,16 @@ echo echo # Check that the clones have the expected content -"${JUST}" install-cas --local-build-root "${LBR_ARCHIVES}" \ - "$(jq '."repositories"."zip_repo"."workspace_root" | .[1]' "${CONF}" | tr -d '"')::t" \ - -P root -o "${INSTALL_ZIP}" -diff -ruN "${INSTALL_ZIP}" "${CLONE_TO}/zip" - -"${JUST}" install-cas --local-build-root "${LBR_ARCHIVES}" \ - "$(jq '."repositories"."tgz_repo"."workspace_root" | .[1]' "${CONF}" | tr -d '"')::t" \ - -P root/baz -o "${INSTALL_TGZ}" -diff -ruN "${INSTALL_TGZ}" "${CLONE_TO}/tgz" - -"${JUST}" install-cas --local-build-root "${LBR_ARCHIVES}" \ - "$(jq '."repositories"."foreign_file"."workspace_root" | .[1]' "${CONF}" | tr -d '"')::t" \ - -o "${INSTALL_FOREIGN}" -diff -ruN "${INSTALL_FOREIGN}" "${CLONE_TO}/foreign" - -"${JUST}" install-cas --local-build-root "${LBR_ARCHIVES}" \ - "$(jq '."repositories"."distdir_repo"."workspace_root" | .[1]' "${CONF}" | tr -d '"')::t" \ - -o "${INSTALL_DISTDIR}" -diff -ruN "${INSTALL_DISTDIR}" "${CLONE_TO}/distdir" +[ $(jq '."repositories"."zip_repo"."workspace_root" | .[1]' "${CONF}" | tr -d '"') \ + = $("${JUST}" add-to-cas --local-build-root "${LBR_CLONES}" --resolve-special=tree-all "${CLONE_TO}/zip") ] + +[ $(jq '."repositories"."tgz_repo"."workspace_root" | .[1]' "${CONF}" | tr -d '"') \ + = $("${JUST}" add-to-cas --local-build-root "${LBR_CLONES}" --resolve-special=ignore "${CLONE_TO}/tgz") ] + +[ $(jq '."repositories"."foreign_file"."workspace_root" | .[1]' "${CONF}" | tr -d '"') \ + = $("${JUST}" add-to-cas --local-build-root "${LBR_CLONES}" "${CLONE_TO}/foreign") ] + +[ $(jq '."repositories"."distdir_repo"."workspace_root" | .[1]' "${CONF}" | tr -d '"') \ + = $("${JUST}" add-to-cas --local-build-root "${LBR_CLONES}" "${CLONE_TO}/distdir") ] echo "OK" |