chore: import upstream snapshot with attribution
regression / regression-shards (style-16-prod style-9-prod style-17-prod iframe-render-compat variables-prod mp4-h265-sdr, shard-4) (push) Has been cancelled
regression / regression-shards (style-4-prod style-11-prod style-2-prod animejs-adapter typegpu-adapter parallel-capture-regression, shard-5) (push) Has been cancelled
regression / regression-shards (style-7-prod style-8-prod style-10-prod css-spinner-render-compat webm-transparency mp4-h264-sdr webm-vp9, shard-3) (push) Has been cancelled
regression / regression-shards (sub-composition-video style-18-prod raf-ball-render-compat font-variant-numeric sub-comp-t0 sub-comp-id-selector, shard-7) (push) Has been cancelled
Windows render verification / Detect changes (push) Has been cancelled
Windows render verification / Preflight (lint + format) (push) Has been cancelled
Windows render verification / Render on windows-latest (push) Has been cancelled
Windows render verification / Tests on windows-latest (push) Has been cancelled
CI / Detect changes (push) Has been cancelled
CI / Build (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Fallow audit (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Producer: integration tests (push) Has been cancelled
CI / Producer: unit tests (push) Has been cancelled
CI / File size check (push) Has been cancelled
CI / Test: skills (push) Has been cancelled
CI / Skills: manifest in sync (push) Has been cancelled
CI / CLI: npx shim (macos-latest) (push) Has been cancelled
CI / CLI: npx shim (ubuntu-latest) (push) Has been cancelled
CI / CLI: npx shim (windows-latest) (push) Has been cancelled
CI / SDK: unit + contract + smoke (push) Has been cancelled
CI / Test: runtime contract (push) Has been cancelled
CI / Studio: load smoke (push) Has been cancelled
CI / Smoke: global install (push) Has been cancelled
CI / CLI smoke (required) (push) Has been cancelled
CI / Semantic PR title (push) Has been cancelled
Player perf / Detect changes (push) Has been cancelled
Player perf / Preflight (lint + format) (push) Has been cancelled
Player perf / player-perf (push) Has been cancelled
Player perf / Perf: drift (push) Has been cancelled
Player perf / Perf: fps (push) Has been cancelled
Player perf / Perf: parity (push) Has been cancelled
Player perf / Perf: scrub (push) Has been cancelled
Player perf / Perf: load (push) Has been cancelled
preview-regression / Detect changes (push) Has been cancelled
preview-regression / Preflight (lint + format) (push) Has been cancelled
preview-regression / Preview parity (push) Has been cancelled
preview-regression / preview-regression (push) Has been cancelled
regression / regression (push) Has been cancelled
regression / Detect changes (push) Has been cancelled
regression / Preflight (lint + format) (push) Has been cancelled
regression / regression-shards (hdr-regression style-5-prod style-3-prod mov-prores, shard-1) (push) Has been cancelled
regression / regression-shards (overlay-montage-prod style-12-prod chat missing-host-comp-id png-sequence portrait-edge-bleed, shard-6) (push) Has been cancelled
regression / regression-shards (style-13-prod style-6-prod vignelli-stacking gsap-letters-render-compat audio-mux-parity, shard-8) (push) Has been cancelled
regression / regression-shards (style-15-prod hdr-hlg-regression style-1-prod many-cuts vfr-screen-recording render-symlinked-assets, shard-2) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docs / Validate docs (push) Has been cancelled
Sync skills to ClawHub / Publish changed skills (push) Has been cancelled
regression / regression-shards (style-16-prod style-9-prod style-17-prod iframe-render-compat variables-prod mp4-h265-sdr, shard-4) (push) Has been cancelled
regression / regression-shards (style-4-prod style-11-prod style-2-prod animejs-adapter typegpu-adapter parallel-capture-regression, shard-5) (push) Has been cancelled
regression / regression-shards (style-7-prod style-8-prod style-10-prod css-spinner-render-compat webm-transparency mp4-h264-sdr webm-vp9, shard-3) (push) Has been cancelled
regression / regression-shards (sub-composition-video style-18-prod raf-ball-render-compat font-variant-numeric sub-comp-t0 sub-comp-id-selector, shard-7) (push) Has been cancelled
Windows render verification / Detect changes (push) Has been cancelled
Windows render verification / Preflight (lint + format) (push) Has been cancelled
Windows render verification / Render on windows-latest (push) Has been cancelled
Windows render verification / Tests on windows-latest (push) Has been cancelled
CI / Detect changes (push) Has been cancelled
CI / Build (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Fallow audit (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Producer: integration tests (push) Has been cancelled
CI / Producer: unit tests (push) Has been cancelled
CI / File size check (push) Has been cancelled
CI / Test: skills (push) Has been cancelled
CI / Skills: manifest in sync (push) Has been cancelled
CI / CLI: npx shim (macos-latest) (push) Has been cancelled
CI / CLI: npx shim (ubuntu-latest) (push) Has been cancelled
CI / CLI: npx shim (windows-latest) (push) Has been cancelled
CI / SDK: unit + contract + smoke (push) Has been cancelled
CI / Test: runtime contract (push) Has been cancelled
CI / Studio: load smoke (push) Has been cancelled
CI / Smoke: global install (push) Has been cancelled
CI / CLI smoke (required) (push) Has been cancelled
CI / Semantic PR title (push) Has been cancelled
Player perf / Detect changes (push) Has been cancelled
Player perf / Preflight (lint + format) (push) Has been cancelled
Player perf / player-perf (push) Has been cancelled
Player perf / Perf: drift (push) Has been cancelled
Player perf / Perf: fps (push) Has been cancelled
Player perf / Perf: parity (push) Has been cancelled
Player perf / Perf: scrub (push) Has been cancelled
Player perf / Perf: load (push) Has been cancelled
preview-regression / Detect changes (push) Has been cancelled
preview-regression / Preflight (lint + format) (push) Has been cancelled
preview-regression / Preview parity (push) Has been cancelled
preview-regression / preview-regression (push) Has been cancelled
regression / regression (push) Has been cancelled
regression / Detect changes (push) Has been cancelled
regression / Preflight (lint + format) (push) Has been cancelled
regression / regression-shards (hdr-regression style-5-prod style-3-prod mov-prores, shard-1) (push) Has been cancelled
regression / regression-shards (overlay-montage-prod style-12-prod chat missing-host-comp-id png-sequence portrait-edge-bleed, shard-6) (push) Has been cancelled
regression / regression-shards (style-13-prod style-6-prod vignelli-stacking gsap-letters-render-compat audio-mux-parity, shard-8) (push) Has been cancelled
regression / regression-shards (style-15-prod hdr-hlg-regression style-1-prod many-cuts vfr-screen-recording render-symlinked-assets, shard-2) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docs / Validate docs (push) Has been cancelled
Sync skills to ClawHub / Publish changed skills (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,223 @@
|
||||
#!/usr/bin/env tsx
|
||||
|
||||
import { execFileSync } from "child_process";
|
||||
import { join } from "path";
|
||||
import { pathToFileURL } from "url";
|
||||
import {
|
||||
CLI_SEMVER_PATTERN,
|
||||
optionalFlagArg,
|
||||
optionalValueArg,
|
||||
parseVersionOptionArgument,
|
||||
validateCliDate,
|
||||
validateCliVersion,
|
||||
type InlineValueOption,
|
||||
} from "./cli-options.ts";
|
||||
import {
|
||||
missingChangelogArtifacts,
|
||||
releaseRequiresChangelog,
|
||||
unreviewedChangelogArtifacts,
|
||||
} from "./set-version.ts";
|
||||
|
||||
type PrepareOptions = {
|
||||
version: string;
|
||||
from?: string;
|
||||
to?: string;
|
||||
date?: string;
|
||||
force: boolean;
|
||||
skipTag: boolean;
|
||||
skipChangelogCheck: boolean;
|
||||
};
|
||||
|
||||
type MutablePrepareOptions = Omit<PrepareOptions, "version"> & {
|
||||
version?: string;
|
||||
};
|
||||
|
||||
type ValueOptionKey = "from" | "to" | "date";
|
||||
type BooleanOptionKey = "force" | "skipTag" | "skipChangelogCheck";
|
||||
export type StableReleaseAction = "draft" | "review" | "set-version";
|
||||
|
||||
const ROOT = join(import.meta.dirname, "..");
|
||||
|
||||
const VALUE_OPTIONS = new Map<string, ValueOptionKey>([
|
||||
["--from", "from"],
|
||||
["--to", "to"],
|
||||
["--date", "date"],
|
||||
]);
|
||||
|
||||
const BOOLEAN_OPTIONS = new Map<string, BooleanOptionKey>([
|
||||
["--force", "force"],
|
||||
["--no-tag", "skipTag"],
|
||||
["--skip-changelog-check", "skipChangelogCheck"],
|
||||
]);
|
||||
|
||||
const INLINE_VALUE_OPTIONS = [
|
||||
{ prefix: "--from=", key: "from" },
|
||||
{ prefix: "--to=", key: "to" },
|
||||
{ prefix: "--date=", key: "date" },
|
||||
] satisfies Array<InlineValueOption<ValueOptionKey>>;
|
||||
|
||||
function main() {
|
||||
const options = parsePrepareOptions(process.argv.slice(2));
|
||||
|
||||
if (!releaseRequiresChangelog(options)) {
|
||||
runSetVersion(options);
|
||||
return;
|
||||
}
|
||||
|
||||
const missingArtifacts = missingChangelogArtifacts(options.version);
|
||||
const unreviewedArtifacts = unreviewedChangelogArtifacts(options.version);
|
||||
const action = resolveStableReleaseAction({ missingArtifacts, unreviewedArtifacts });
|
||||
|
||||
if (action === "draft") {
|
||||
runDraft(options);
|
||||
printReviewNextSteps(options.version, missingArtifacts);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (action === "review") {
|
||||
printReviewNextSteps(options.version, unreviewedArtifacts);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
runSetVersion(options);
|
||||
}
|
||||
|
||||
export function parsePrepareOptions(args: string[]): PrepareOptions {
|
||||
const parsed = createDefaultOptions();
|
||||
|
||||
for (let index = 0; index < args.length; index += 1) {
|
||||
index = parseArgument(args, index, parsed);
|
||||
}
|
||||
|
||||
return finalizeOptions(parsed);
|
||||
}
|
||||
|
||||
function createDefaultOptions(): MutablePrepareOptions {
|
||||
return {
|
||||
force: false,
|
||||
skipTag: false,
|
||||
skipChangelogCheck: false,
|
||||
};
|
||||
}
|
||||
|
||||
function parseArgument(args: string[], index: number, parsed: MutablePrepareOptions) {
|
||||
return parseVersionOptionArgument(args, index, parsed, {
|
||||
inlineValueOptions: INLINE_VALUE_OPTIONS,
|
||||
valueOptions: VALUE_OPTIONS,
|
||||
booleanOptions: BOOLEAN_OPTIONS,
|
||||
printUsage,
|
||||
fail,
|
||||
});
|
||||
}
|
||||
|
||||
function finalizeOptions(parsed: MutablePrepareOptions): PrepareOptions {
|
||||
if (!parsed.version) {
|
||||
printUsage();
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
validateCliVersion(parsed.version, CLI_SEMVER_PATTERN, fail);
|
||||
if (parsed.date) {
|
||||
validateCliDate(parsed.date, fail);
|
||||
}
|
||||
|
||||
return {
|
||||
version: parsed.version,
|
||||
from: parsed.from,
|
||||
to: parsed.to,
|
||||
date: parsed.date,
|
||||
force: parsed.force,
|
||||
skipTag: parsed.skipTag,
|
||||
skipChangelogCheck: parsed.skipChangelogCheck,
|
||||
};
|
||||
}
|
||||
|
||||
export function resolveStableReleaseAction(state: {
|
||||
missingArtifacts: string[];
|
||||
unreviewedArtifacts: string[];
|
||||
}): StableReleaseAction {
|
||||
if (state.missingArtifacts.length > 0) {
|
||||
return "draft";
|
||||
}
|
||||
if (state.unreviewedArtifacts.length > 0) {
|
||||
return "review";
|
||||
}
|
||||
return "set-version";
|
||||
}
|
||||
|
||||
export function buildDraftCommandArgs(options: PrepareOptions) {
|
||||
return [
|
||||
"run",
|
||||
"changelog:draft",
|
||||
options.version,
|
||||
"--write",
|
||||
...optionalFlagArg("--force", options.force),
|
||||
...optionalValueArg("--from", options.from),
|
||||
...optionalValueArg("--to", options.to),
|
||||
...optionalValueArg("--date", options.date),
|
||||
];
|
||||
}
|
||||
|
||||
export function buildSetVersionCommandArgs(options: PrepareOptions) {
|
||||
return [
|
||||
"run",
|
||||
"set-version",
|
||||
options.version,
|
||||
...optionalFlagArg("--no-tag", options.skipTag),
|
||||
...optionalFlagArg("--skip-changelog-check", options.skipChangelogCheck),
|
||||
];
|
||||
}
|
||||
|
||||
function runDraft(options: PrepareOptions) {
|
||||
runBun(buildDraftCommandArgs(options));
|
||||
}
|
||||
|
||||
function runSetVersion(options: PrepareOptions) {
|
||||
runBun(buildSetVersionCommandArgs(options));
|
||||
}
|
||||
|
||||
function runBun(args: string[]) {
|
||||
try {
|
||||
execFileSync("bun", args, { cwd: ROOT, stdio: "inherit" });
|
||||
} catch (error) {
|
||||
const status =
|
||||
typeof (error as { status?: unknown }).status === "number"
|
||||
? (error as { status: number }).status
|
||||
: 1;
|
||||
process.exit(status);
|
||||
}
|
||||
}
|
||||
|
||||
function printReviewNextSteps(version: string, artifacts: string[]) {
|
||||
console.error(`\nRelease v${version} needs reviewed changelog copy before tagging.`);
|
||||
if (artifacts.length > 0) {
|
||||
console.error("Check:");
|
||||
artifacts.forEach((artifact) => console.error(` ${artifact}`));
|
||||
}
|
||||
console.error("\nReview and rewrite the generated summary, remove the TODO marker, then rerun:");
|
||||
console.error(` bun run release:prepare ${version}`);
|
||||
console.error(
|
||||
"\nThe non-zero exit is intentional so chained release commands stop before tagging.",
|
||||
);
|
||||
}
|
||||
|
||||
function printUsage() {
|
||||
console.log(`Usage:
|
||||
bun run release:prepare <version> [--force] [--from <ref>] [--to <ref>] [--date YYYY-MM-DD]
|
||||
bun run release:prepare <version> [--no-tag] [--skip-changelog-check]
|
||||
|
||||
Examples:
|
||||
bun run release:prepare 0.6.53
|
||||
bun run release:prepare 0.6.53 --from v0.6.52 --to HEAD
|
||||
bun run release:prepare 0.6.53 --force
|
||||
`);
|
||||
}
|
||||
|
||||
function fail(message: string): never {
|
||||
console.error(message);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
||||
main();
|
||||
}
|
||||
Reference in New Issue
Block a user