47 lines
3.1 KiB
Bash
Executable File
47 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Validate the real release workflow without committing or tagging the workspace.
|
|
set -euo pipefail
|
|
cd "$(dirname "${BASH_SOURCE[0]}")/.."
|
|
repository="$PWD"
|
|
check=$(mktemp -d "$repository/.tools/phase9-check.XXXXXX")
|
|
printf '%s\n' "$check" > .tools/phase9-check-path
|
|
mkdir -p "$check/source" "$check/evidence"
|
|
git rev-parse HEAD > "$check/evidence/workspace-head-before.txt"
|
|
git status --porcelain --untracked-files=all > "$check/evidence/workspace-status-before.txt"
|
|
git ls-files --cached --others --exclude-standard -z > "$check/files.list"
|
|
tar --null -T "$check/files.list" -cf "$check/source.tar"
|
|
tar --no-same-owner -xf "$check/source.tar" -C "$check/source"
|
|
git -C "$check/source" init -q
|
|
git -C "$check/source" add -A
|
|
git -C "$check/source" -c user.name='Phase 9 fixture' -c user.email='phase9@localhost' commit -qm 'Isolated source snapshot'
|
|
git clone -q "$check/source" "$check/clone"
|
|
git -C "$check/clone" config user.name 'Phase 9 fixture'
|
|
git -C "$check/clone" config user.email phase9@localhost
|
|
mkdir -p "$check/clone/node_modules" "$check/clone/.tools/packwiz"
|
|
cp -a node_modules/yaml node_modules/smol-toml "$check/clone/node_modules/"
|
|
cp .tools/packwiz/packwiz "$check/clone/.tools/packwiz/packwiz"
|
|
cp .tools/docker-compose "$check/clone/.tools/docker-compose"
|
|
cd "$check/clone"
|
|
./mcpack release 0.0.6 > "$check/evidence/release.log" 2>&1
|
|
node --input-type=module <<'JS' > "$check/evidence/assertions.txt"
|
|
import fs from 'node:fs';import path from 'node:path';import assert from 'node:assert/strict';import {execFileSync} from 'node:child_process';
|
|
import {parse} from 'smol-toml';import {verifyRelease} from './platform/runtime.mjs';
|
|
const git=args=>execFileSync('git',args,{encoding:'utf8'}).trim(),pack=parse(fs.readFileSync('pack/pack.toml','utf8'));
|
|
const release=verifyRelease(path.resolve('dist/'+pack.name+'-0.0.6'));
|
|
assert.equal(pack.version,'0.0.6');assert.equal(release.manifest.git.dirty,false);
|
|
assert.equal(release.manifest.git.commit,git(['rev-parse','HEAD']));
|
|
assert.equal(git(['rev-parse','v0.0.6^{}']),release.manifest.git.commit);
|
|
assert.equal(git(['cat-file','-t','v0.0.6']),'tag');
|
|
assert.equal(git(['diff-tree','--no-commit-id','--name-only','-r','HEAD']),'pack/pack.toml');
|
|
assert.equal(git(['status','--porcelain','--untracked-files=all']),'');
|
|
assert(!fs.existsSync('.tools/release.lock'));
|
|
assert(fs.readdirSync('dist').every(name=>!name.startsWith('.release-check-')));
|
|
console.log('Real pinned packwiz and Compose: candidate build, version commit, clean final build, complete checksums and annotated tag passed.');
|
|
JS
|
|
if ./mcpack release 0.0.6 > "$check/evidence/duplicate-refusal.log" 2>&1; then exit 1; fi
|
|
cd "$repository"
|
|
git rev-parse HEAD > "$check/evidence/workspace-head-after.txt"
|
|
git status --porcelain --untracked-files=all > "$check/evidence/workspace-status-after.txt"
|
|
node -e 'const fs=require("fs"),assert=require("assert/strict"),root=process.argv[1];for(const field of ["head","status"])assert.equal(fs.readFileSync(root+"/workspace-"+field+"-before.txt","utf8"),fs.readFileSync(root+"/workspace-"+field+"-after.txt","utf8"))' "$check/evidence"
|
|
printf 'Phase 9 real release workflow passed. Evidence: %s\n' "$check/evidence"
|