summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2025-01-27 15:20:55 +0100
committerPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2025-02-20 15:33:53 +0100
commitd42e1f7f8b9c60a0d1fe3df98802060eb5b0ef64 (patch)
tree914039d632dec31d846747d4eb598e39af7f24b7
parent3ea3651deb8a1164347b548dc13fada3d729361d (diff)
downloadjustbuild-d42e1f7f8b9c60a0d1fe3df98802060eb5b0ef64.tar.gz
just-lock: Add test for cloning archive-related repositories
...such as 'archive', 'zip', 'foreign file', and 'distdir'.
-rwxr-xr-xbin/just-lock.py10
-rw-r--r--test/end-to-end/just-lock/TARGETS12
-rw-r--r--test/end-to-end/just-lock/clone/archive-repos.sh150
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"