react/scripts/release/snapshot-test.js

109 lines
3.0 KiB
JavaScript
Executable File

#!/usr/bin/env node
'use strict';
const {exec, spawn} = require('child-process-promise');
const {join} = require('path');
const {readFileSync} = require('fs');
const theme = require('./theme');
const {getDateStringForCommit, logPromise, printDiff} = require('./utils');
const cwd = join(__dirname, '..', '..');
const CIRCLE_CI_BUILD = 12707;
const COMMIT = 'b3d1a81a9';
const VERSION = '1.2.3';
const run = async () => {
const defaultOptions = {
cwd,
env: process.env,
};
try {
// Start with a known build/revision:
// https://circleci.com/gh/facebook/react/12707
let promise = spawn(
'node',
[
'./scripts/release/prepare-release-from-ci.js',
`--build=${CIRCLE_CI_BUILD}`,
],
defaultOptions
);
logPromise(
promise,
theme`Checking out "next" build {version ${CIRCLE_CI_BUILD}}`
);
await promise;
const dateString = await getDateStringForCommit(COMMIT);
// Upgrade the above build top a known React version.
// Note that using the --local flag skips NPM checkout.
// This isn't totally necessary but is useful if we want to test an unpublished "next" build.
promise = spawn(
'node',
[
'./scripts/release/prepare-release-from-npm.js',
`--version=0.0.0-${COMMIT}-${dateString}`,
'--local',
],
defaultOptions
);
promise.childProcess.stdin.setEncoding('utf-8');
promise.childProcess.stdout.setEncoding('utf-8');
promise.childProcess.stdout.on('data', data => {
if (data.includes('✓ Version for')) {
// Update all packages to a stable version
promise.childProcess.stdin.write(VERSION);
} else if (data.includes('(y/N)')) {
// Accept all of the confirmation prompts
promise.childProcess.stdin.write('y');
}
});
logPromise(promise, theme`Preparing stable release {version ${VERSION}}`);
await promise;
const beforeContents = readFileSync(
join(cwd, 'scripts/release/snapshot-test.snapshot'),
'utf-8'
);
await exec('cp build/temp.diff scripts/release/snapshot-test.snapshot', {
cwd,
});
const afterContents = readFileSync(
join(cwd, 'scripts/release/snapshot-test.snapshot'),
'utf-8'
);
if (beforeContents === afterContents) {
console.log(theme.header`Snapshot test passed.`);
} else {
printDiff(
'scripts/release/snapshot-test.snapshot',
beforeContents,
afterContents
);
console.log();
console.error(theme.error('Snapshot test failed!'));
console.log();
console.log(
'If this failure was expected, please update the contents of the snapshot file:'
);
console.log(
theme` {command git add} {path scripts/release/snapshot-test.snapshot}`
);
console.log(
theme` {command git commit -m "Updating release script snapshot file."}`
);
process.exit(1);
}
} catch (error) {
console.error(theme.error(error));
process.exit(1);
}
};
run();