mirror of
https://github.com/zebrajr/react.git
synced 2025-12-06 12:20:20 +01:00
119 lines
3.0 KiB
JavaScript
119 lines
3.0 KiB
JavaScript
'use strict';
|
|
|
|
/* eslint-disable no-for-of-loops/no-for-of-loops */
|
|
|
|
// Copies the contents of the new fork into the old fork
|
|
|
|
const chalk = require('chalk');
|
|
const {promisify} = require('util');
|
|
const glob = promisify(require('glob'));
|
|
const {execSync, spawnSync} = require('child_process');
|
|
const fs = require('fs');
|
|
const minimist = require('minimist');
|
|
|
|
const stat = promisify(fs.stat);
|
|
const copyFile = promisify(fs.copyFile);
|
|
|
|
const argv = minimist(process.argv.slice(2), {
|
|
boolean: ['reverse'],
|
|
});
|
|
|
|
async function main() {
|
|
const status = execSync('git status').toString();
|
|
const hadUnstagedChanges = status.includes('Changes not staged for commit');
|
|
if (hadUnstagedChanges) {
|
|
const readline = require('readline');
|
|
const rl = readline.createInterface({
|
|
input: process.stdin,
|
|
output: process.stdout,
|
|
});
|
|
|
|
await new Promise(resolve => {
|
|
rl.question(
|
|
`\n${chalk.yellow.bold(
|
|
'Unstaged changes were found in repository.'
|
|
)} Do you want to continue? (Y/n) `,
|
|
input => {
|
|
switch (input.trim().toLowerCase()) {
|
|
case '':
|
|
case 'y':
|
|
case 'yes':
|
|
resolve();
|
|
break;
|
|
default:
|
|
console.log('No modifications were made.');
|
|
process.exit(0);
|
|
break;
|
|
}
|
|
}
|
|
);
|
|
});
|
|
}
|
|
|
|
const oldFilenames = await glob('packages/react-reconciler/**/*.old.js');
|
|
await Promise.all(oldFilenames.map(unforkFile));
|
|
|
|
// Use ESLint to autofix imports
|
|
const command = spawnSync('yarn', ['linc', '--fix'], {
|
|
stdio: ['inherit', 'inherit', 'pipe'],
|
|
});
|
|
if (command.status === 1) {
|
|
console.log(
|
|
chalk.bold.red('\nreplace-fork script failed with the following error:')
|
|
);
|
|
console.error(Error(command.stderr));
|
|
|
|
// If eslint crashes, it may not have successfully fixed all the imports,
|
|
// which would leave the reconciler files in an inconsistent stat.
|
|
// It would be nice to clean up the working directory in this case,
|
|
// but it's only safe to do that if we aren't going to override any previous changes.
|
|
if (!hadUnstagedChanges) {
|
|
spawnSync('git', ['checkout', '.']);
|
|
} else {
|
|
console.log(
|
|
`\n${chalk.yellow.bold(
|
|
'Unstaged changes were present when `replace-fork` was run.'
|
|
)} ` +
|
|
`To cleanup the repository run:\n ${chalk.bold(
|
|
'git checkout packages/react-reconciler'
|
|
)}`
|
|
);
|
|
}
|
|
|
|
process.exit(1);
|
|
} else {
|
|
process.exit(0);
|
|
}
|
|
}
|
|
|
|
async function unforkFile(oldFilename) {
|
|
let oldStats;
|
|
try {
|
|
oldStats = await stat(oldFilename);
|
|
} catch {
|
|
return;
|
|
}
|
|
if (!oldStats.isFile()) {
|
|
return;
|
|
}
|
|
|
|
const newFilename = oldFilename.replace(/\.old.js$/, '.new.js');
|
|
let newStats;
|
|
try {
|
|
newStats = await stat(newFilename);
|
|
} catch {
|
|
return;
|
|
}
|
|
if (!newStats.isFile()) {
|
|
return;
|
|
}
|
|
|
|
if (argv.reverse) {
|
|
await copyFile(oldFilename, newFilename);
|
|
} else {
|
|
await copyFile(newFilename, oldFilename);
|
|
}
|
|
}
|
|
|
|
main();
|