Files
dsh/upstream/container/test/profile-package-compatibility-smoke.sh
T

74 lines
3.1 KiB
Bash

#!/bin/sh
set -eu
if [ "$#" -ne 1 ]; then
echo "usage: $0 <container>" >&2
exit 64
fi
container="$1"
profile=/data/dsh/profiles/web
legacy_store=/workspace/.pnpm-store
stable_store=/data/dsh/.pnpm-store
fixture=/workspace/profile-package-smoke
docker exec "$container" dsh-platform stop --wait >/dev/null
docker exec --user node "$container" sh -c "
set -eu
test -f '$profile/package.json'
mkdir -p '$legacy_store'
if [ -d '$stable_store' ]; then cp -a '$stable_store/.' '$legacy_store/'; fi
"
docker exec --user node --env PROFILE="$profile" --env LEGACY_STORE="$legacy_store" \
"$container" node --input-type=module -e '
import { readFileSync, writeFileSync } from "node:fs"
const path = process.env.PROFILE + "/pnpm-workspace.yaml"
const source = readFileSync(path, "utf8")
const line = `storeDir: ${JSON.stringify(process.env.LEGACY_STORE)}\n`
const pattern = /^storeDir:[^\r\n]*(?:\r?\n|$)/m
writeFileSync(path, pattern.test(source)
? source.replace(pattern, line)
: source.replace(/(?:\r?\n)?$/, `\n\n${line}`))
'
docker exec --user node "$container" sh -c "
set -eu
rm -rf '$profile/node_modules'
cd '$profile'
pnpm install --offline --frozen-lockfile --reporter=append-only >/dev/null
"
docker exec --user node --env PROFILE="$profile" --env LEGACY_STORE="$legacy_store" \
"$container" node -e '
const value = JSON.parse(require("fs").readFileSync(process.env.PROFILE + "/node_modules/.modules.yaml", "utf8"))
if (!value.storeDir.startsWith(process.env.LEGACY_STORE + "/")) throw new Error(value.storeDir)
'
docker exec "$container" dsh-platform start --wait >/dev/null
docker exec --user node --env PROFILE="$profile" --env STABLE_STORE="$stable_store" \
"$container" node -e '
const value = JSON.parse(require("fs").readFileSync(process.env.PROFILE + "/node_modules/.modules.yaml", "utf8"))
if (!value.storeDir.startsWith(process.env.STABLE_STORE + "/")) throw new Error(value.storeDir)
'
docker exec --user node "$container" sh -c "
set -eu
mkdir -p '$fixture'
printf '%s\n' '{\"name\":\"profile-package-smoke\",\"version\":\"1.0.0\",\"type\":\"module\",\"main\":\"index.mjs\",\"dsh\":{\"bundle\":{\"patch\":\"./cordis.patch.yml\"}}}' > '$fixture/package.json'
printf '%s\n' 'export default function () {}' > '$fixture/index.mjs'
printf '%s\n' '- insert:' ' - id: profile-package-smoke' ' name: file://$fixture/index.mjs' > '$fixture/cordis.patch.yml'
"
docker exec \
--env npm_config_userconfig=/root/.config/npm/npmrc \
--env npm_config_cache=/root/.npm \
"$container" dsh plugin --profile web add "$fixture" >/dev/null
docker exec "$container" sh -c "
set -eu
test \"\$(stat -c %U '$profile/package.json')\" = node
test \"\$(stat -c %U '$profile/pnpm-lock.yaml')\" = node
test \"\$(stat -c %U '$profile/node_modules/profile-package-smoke')\" = node
"
docker exec "$container" dsh plugin --profile web remove profile-package-smoke >/dev/null
docker exec --user node "$container" rm -rf "$fixture"
docker logs "$container" 2>&1 \
| grep -F "dsh: migrated Profile package storage from $legacy_store/" >/dev/null