diff options
author | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2025-01-27 15:20:55 +0100 |
---|---|---|
committer | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2025-02-20 15:33:53 +0100 |
commit | d42e1f7f8b9c60a0d1fe3df98802060eb5b0ef64 (patch) | |
tree | 914039d632dec31d846747d4eb598e39af7f24b7 | |
parent | 3ea3651deb8a1164347b548dc13fada3d729361d (diff) | |
download | justbuild-d42e1f7f8b9c60a0d1fe3df98802060eb5b0ef64.tar.gz |
just-lock: Add test for cloning archive-related repositories
...such as 'archive', 'zip', 'foreign file', and 'distdir'.
-rwxr-xr-x | bin/just-lock.py | 10 | ||||
-rw-r--r-- | test/end-to-end/just-lock/TARGETS | 12 | ||||
-rw-r--r-- | test/end-to-end/just-lock/clone/archive-repos.sh | 150 |
3 files changed, 167 insertions, 5 deletions
diff --git a/bin/just-lock.py b/bin/just-lock.py index 56ebe385..30cfb978 100755 --- a/bin/just-lock.py +++ b/bin/just-lock.py @@ -1962,13 +1962,13 @@ def rewrite_cloned_repo(repos: Json, *, clone_to: str, target_repo: str, } } - # Keep any existing "special" or "to_git" pragmas from the workspace root - # repository + # Keep relevant pragmas from the workspace root repository pragma: Json = {} existing: Json = repos[ws_root_repo]["repository"].get("pragma", {}) - special = existing.get("special", None) - if special: - pragma["special"] = special + if ws_root_desc["repository"]["type"] not in ["archive", "zip"]: + special = existing.get("special", None) + if special: + pragma["special"] = special to_git = existing.get("to_git", False) if to_git: pragma["to_git"] = True diff --git a/test/end-to-end/just-lock/TARGETS b/test/end-to-end/just-lock/TARGETS index 30df531b..3be0193a 100644 --- a/test/end-to-end/just-lock/TARGETS +++ b/test/end-to-end/just-lock/TARGETS @@ -108,6 +108,17 @@ , ["end-to-end", "lock-tool-under-test"] ] } +, "clone-archive": + { "type": ["@", "rules", "shell/test", "script"] + , "name": ["clone-archive"] + , "test": ["clone/archive-repos.sh"] + , "deps": + [ ["", "mr-tool-under-test"] + , ["", "tool-under-test"] + , ["end-to-end", "lock-tool-under-test"] + , ["end-to-end/just-mr", "create_test_archives"] + ] + } , "TESTS": { "type": ["@", "rules", "test", "suite"] , "arguments_config": ["TEST_BOOTSTRAP_JUST_MR"] @@ -128,6 +139,7 @@ , "plain-imports" , "clone-file" , "clone-git" + , "clone-archive" ] } ] diff --git a/test/end-to-end/just-lock/clone/archive-repos.sh b/test/end-to-end/just-lock/clone/archive-repos.sh new file mode 100644 index 00000000..2d0c314e --- /dev/null +++ b/test/end-to-end/just-lock/clone/archive-repos.sh @@ -0,0 +1,150 @@ +#!/bin/sh +# Copyright 2025 Huawei Cloud Computing Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eu + +readonly JUST_LOCK="${PWD}/bin/lock-tool-under-test" +readonly JUST="${PWD}/bin/tool-under-test" +readonly JUST_MR="${PWD}/bin/mr-tool-under-test" + +readonly LOCK_LBR="${TEST_TMPDIR}/local-build-root" +readonly LBR_ARCHIVES="${TEST_TMPDIR}/local-build-root-archives" +readonly LBR_CLONES="${TEST_TMPDIR}/local-build-root-clones" + +readonly INSTALL_ZIP="${TEST_TMPDIR}/install-zip" +readonly INSTALL_TGZ="${TEST_TMPDIR}/install-tgz" +readonly INSTALL_FOREIGN="${TEST_TMPDIR}/install-foreign" +readonly INSTALL_DISTDIR="${TEST_TMPDIR}/install-distdir" + +readonly ROOT=`pwd` +readonly DISTDIR="${TEST_TMPDIR}/distfiles" +readonly WRKDIR="${TEST_TMPDIR}/work" + +# Set up zip and tgz archives +mkdir -p "${DISTDIR}" +cd "${DISTDIR}" + +${ROOT}/src/create_test_archives + +readonly ZIP_REPO_CONTENT=$("${JUST}" add-to-cas --local-build-root "${LOCK_LBR}" "${DISTDIR}/zip_repo.zip") +readonly TGZ_REPO_CONTENT=$("${JUST}" add-to-cas --local-build-root "${LOCK_LBR}" "${DISTDIR}/tgz_repo.tar.gz") + +# Set up foreign file +echo Here be dragons > "${DISTDIR}/foreign.txt" +readonly FOREIGN=$("${JUST}" add-to-cas --local-build-root "${LOCK_LBR}" "${DISTDIR}/foreign.txt") + +# Input configuration file +mkdir -p "${WRKDIR}" +cd "${WRKDIR}" +touch ROOT +cat > repos.in.json <<EOF +{ "repositories": + { "zip_repo": + { "repository": + { "type": "zip" + , "content": "${ZIP_REPO_CONTENT}" + , "fetch": "http://non-existent.example.org/zip_repo.zip" + , "subdir": "root" + , "pragma": {"special": "resolve-partially"} + } + } + , "tgz_repo": + { "repository": + { "type": "archive" + , "content": "${TGZ_REPO_CONTENT}" + , "fetch": "http://non-existent.example.org/tgz_repo.tar.gz" + , "subdir": "root/baz" + , "pragma": {"special": "ignore"} + } + } + , "foreign_file": + { "repository": + { "type": "foreign file" + , "content": "${FOREIGN}" + , "fetch": "http://nonexistent.example.com/foreign.txt" + , "name": "data.txt" + } + } + , "distdir_repo": + { "repository": + { "type": "distdir" + , "repositories": ["zip_repo", "tgz_repo"] + } + } + } +} +EOF +echo +echo Input config: +cat repos.in.json +echo + +# Check setup with archived content +CONF=$("${JUST_MR}" -L '["env", "PATH='"${PATH}"'"]' --norc --just "${JUST}" \ + -C repos.in.json --distdir "${DISTDIR}" \ + --local-build-root "${LBR_ARCHIVES}" setup --all) 2>&1 +echo + +echo Clone repos: +CLONE_TO="cloned_foo" +cat > clone.json <<EOF +{ "${CLONE_TO}/zip": ["zip_repo", []] +, "${CLONE_TO}/tgz": ["tgz_repo", []] +, "${CLONE_TO}/foreign": ["foreign_file", []] +, "${CLONE_TO}/distdir": ["distdir_repo", []] +} +EOF +"${JUST_LOCK}" -C repos.in.json -o repos.json --local-build-root "${LOCK_LBR}" \ + --just "${JUST}" --clone $(cat clone.json | jq -c) 2>&1 +echo +echo Output config: +cat repos.json +echo + +echo Check output configuration: +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 +echo + +# Check setup with local clones: +"${JUST_MR}" -L '["env", "PATH='"${PATH}"'"]' --norc --just "${JUST}" \ + -C repos.json --local-build-root "${LBR_CLONES}" setup --all 2>&1 +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" + +echo "OK" |