diff --git a/scripts/rollup/build-all-release-channels.js b/scripts/rollup/build-all-release-channels.js index badd6f7c9ff02..279d957475939 100644 --- a/scripts/rollup/build-all-release-channels.js +++ b/scripts/rollup/build-all-release-channels.js @@ -64,7 +64,7 @@ if (process.env.CIRCLE_NODE_TOTAL) { // will have already removed conflicting files. // // In CI, merging is handled automatically by CircleCI's workspace feature. - spawnSync('rsync', ['-ar', experimentalDir + '/', stableDir + '/']); + mergeDirsSync(experimentalDir + '/', stableDir + '/'); // Now restore the combined directory back to its original name // TODO: Currently storing artifacts as `./build2` so that it doesn't conflict @@ -186,3 +186,23 @@ function updateTheReactVersionThatDevToolsReads(version) { `export default '${version}';\n` ); } + +/** + * cross-platform alternative to `rsync -ar` + * @param {string} source + * @param {string} destination + */ +function mergeDirsSync(source, destination) { + for (const sourceFileBaseName of fs.readdirSync(source)) { + const sourceFileName = path.join(source, sourceFileBaseName); + const targetFileName = path.join(destination, sourceFileBaseName); + + const sourceFile = fs.statSync(sourceFileName); + if (sourceFile.isDirectory()) { + fse.ensureDirSync(targetFileName); + mergeDirsSync(sourceFileName, targetFileName); + } else { + fs.copyFileSync(sourceFileName, targetFileName); + } + } +}