Files
2026-10-04 00:30:09 +07:00

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"