diff options
Diffstat (limited to 'test/end-to-end/cli/install-archived-repo.sh')
-rw-r--r-- | test/end-to-end/cli/install-archived-repo.sh | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/test/end-to-end/cli/install-archived-repo.sh b/test/end-to-end/cli/install-archived-repo.sh new file mode 100644 index 00000000..8faedf75 --- /dev/null +++ b/test/end-to-end/cli/install-archived-repo.sh @@ -0,0 +1,122 @@ +#!/bin/sh +# Copyright 2024 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. + +### +# Git repositories treat some filenames, such as .git, .gitignore etc., as +# magic names. We should not have such restrictions in handling blobs and trees. +# +# This test checks that trees can be added to CAS as they are, without +# ignoring/skipping any files or folders that might have special meaning to Git. +## + +set -eu + +ROOT=$(pwd) +JUST="${ROOT}/bin/tool-under-test" +JUST_MR="${ROOT}/bin/mr-tool-under-test" +BUILD_ROOT_A="${TEST_TMPDIR}/build-root-A" +BUILD_ROOT_B="${TEST_TMPDIR}/build-root-B" +BUILD_ROOT_C="${TEST_TMPDIR}/build-root-C" + +# create a Git repo, including a .gitignore file +mkdir -p repo +echo simple file > repo/foo.txt +(cd repo && ln -s foo symlink) +mkdir -p repo/foo/bar +echo another file > repo/foo/bar/data.txt +( + cd repo + echo data.txt > foo/bar/.gitignore + git init + git config user.name 'N.O.Body' + git config user.email 'nobody@example.org' + git add -f . 2>&1 + git commit -m "initial commit" +) + +find repo ! -name . -printf "%P\n" +tar cf repo.tar repo + +# Add repo directory to CAS and print tree id as we see it (with all entries) +echo +TREE=$("${JUST}" add-to-cas --local-build-root "${BUILD_ROOT_A}" repo) +echo "Source tree is ${TREE}" +echo + +# Generate archive and verify it has the correct content +"${JUST}" install-cas --local-build-root "${BUILD_ROOT_A}" \ + --archive -o repo.tar "${TREE}::t" 2>&1 +mkdir repo.unpacked +(cd repo.unpacked && tar xvf ../repo.tar 2>&1) +diff -ruN repo repo.unpacked + +# clean up no longer needed directories +rm -rf repo.unpacked + +# On a new build root, add the archive +ARCHIVE=$("${JUST}" add-to-cas --local-build-root "${BUILD_ROOT_B}" repo.tar) +echo +echo Archive has content "${ARCHIVE}" +echo + +# Verify that we can create the original tree from that archive +mkdir work +cd work +touch ROOT +cat > repos.json <<EOF +{ "repositories": + { "": + { "repository": + { "type": "archive" + , "content": "${ARCHIVE}" + , "fetch": "https://example.org/v1.2.3.tar" + } + , "target_root": "targets" + } + , "targets": {"repository": {"type": "file", "path": "."}} + } +} +EOF +cat repos.json +echo +cat > TARGETS <<'EOF' +{"": {"type": "install", "dirs": [[["TREE", null, "."], "."]]}} +EOF +CONF="$("${JUST_MR}" --norc --local-build-root "${BUILD_ROOT_B}" setup)" +echo +echo configuration $CONF +cat $CONF +echo +RECONSTRUCTED_TREE=$(jq -r '.repositories."".workspace_root[1]' "${CONF}") +[ "${RECONSTRUCTED_TREE}" = "${TREE}" ] + +# Build to get the tree unconditionally known to the local build root +"${JUST}" build --local-build-root "${BUILD_ROOT_B}" -C "${CONF}" 2>&1 + +# - installing the tree as archive should give the same content +"${JUST}" install-cas --local-build-root "${BUILD_ROOT_B}" \ + -o "${ROOT}/reconstructed.tar" --archive "${TREE}::t" 2>&1 +cmp "${ROOT}/repo.tar" "${ROOT}/reconstructed.tar" 2>&1 + +# - dumping the tree as archive to stdout also gives the same archive +"${JUST}" install-cas --local-build-root "${BUILD_ROOT_B}" \ + --archive "${TREE}::t" > "${ROOT}/fromstdout.tar" +cmp "${ROOT}/repo.tar" "${ROOT}/fromstdout.tar" 2>&1 + +# - hashing the archive again gives the original value +ARCHIVE_NEWLY_HASHED=$("${JUST}" add-to-cas --local-build-root "${BUILD_ROOT_C}" "${ROOT}/fromstdout.tar") +[ "${ARCHIVE_NEWLY_HASHED}" = "${ARCHIVE}" ] + +echo OK |