Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Extract release agnostic logic in bump-oss-version to set-rn-version
Summary: Changelog: [Internal] Copy over universal (across dry-run, nightly, release) work in `bump-oss-version` script This work is part of an effort to automate the release process by using a push to a release branch as a trigger to prepare, package and deploy react-native to npm from CircleCI The following diagram describes the context (what kind of releases we do, relevant scripts and what they do), the pre-existing process for the different types of release and how I've modified the process. {F683387103} This diff creates the `set-rn-version` script referenced by extracting it out of `bump-oss-version` Reviewed By: sota000 Differential Revision: D32556608 fbshipit-source-id: 6c2868c01ddd930375279a5105bcd0d447f65734
- Loading branch information
Luna Wei
committed
Dec 6, 2021
1 parent
9faa42e
commit c37a83e
Showing
1 changed file
with
163 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,163 @@ | ||
/** | ||
* Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
* | ||
* @format | ||
*/ | ||
|
||
'use strict'; | ||
|
||
/** | ||
* This script updates relevant React Native files with supplied version: | ||
* * Prepares a package.json suitable for package consumption | ||
* * Updates package.json for template project | ||
* * Updates the version in gradle files and makes sure they are consistent between each other | ||
* * Creates a gemfile | ||
*/ | ||
const fs = require('fs'); | ||
const {cat, echo, exec, exit, sed} = require('shelljs'); | ||
const yargs = require('yargs'); | ||
const {parseVersion} = require('./version-utils'); | ||
|
||
let argv = yargs.option('v', { | ||
alias: 'to-version', | ||
type: 'string', | ||
}).argv; | ||
|
||
const version = argv.toVersion; | ||
|
||
if (!version) { | ||
echo('You must specify a version using -v'); | ||
exit(1); | ||
} | ||
|
||
let major, | ||
minor, | ||
patch, | ||
prerelease = -1; | ||
try { | ||
({major, minor, patch, prerelease} = parseVersion(version)); | ||
} catch (e) { | ||
echo(e.message); | ||
exit(1); | ||
} | ||
|
||
fs.writeFileSync( | ||
'ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java', | ||
cat('scripts/versiontemplates/ReactNativeVersion.java.template') | ||
.replace('${major}', major) | ||
.replace('${minor}', minor) | ||
.replace('${patch}', patch) | ||
.replace( | ||
'${prerelease}', | ||
prerelease !== undefined ? `"${prerelease}"` : 'null', | ||
), | ||
'utf-8', | ||
); | ||
|
||
fs.writeFileSync( | ||
'React/Base/RCTVersion.m', | ||
cat('scripts/versiontemplates/RCTVersion.m.template') | ||
.replace('${major}', `@(${major})`) | ||
.replace('${minor}', `@(${minor})`) | ||
.replace('${patch}', `@(${patch})`) | ||
.replace( | ||
'${prerelease}', | ||
prerelease !== undefined ? `@"${prerelease}"` : '[NSNull null]', | ||
), | ||
'utf-8', | ||
); | ||
|
||
fs.writeFileSync( | ||
'ReactCommon/cxxreact/ReactNativeVersion.h', | ||
cat('scripts/versiontemplates/ReactNativeVersion.h.template') | ||
.replace('${major}', major) | ||
.replace('${minor}', minor) | ||
.replace('${patch}', patch) | ||
.replace( | ||
'${prerelease}', | ||
prerelease !== undefined ? `"${prerelease}"` : '""', | ||
), | ||
'utf-8', | ||
); | ||
|
||
fs.writeFileSync( | ||
'Libraries/Core/ReactNativeVersion.js', | ||
cat('scripts/versiontemplates/ReactNativeVersion.js.template') | ||
.replace('${major}', major) | ||
.replace('${minor}', minor) | ||
.replace('${patch}', patch) | ||
.replace( | ||
'${prerelease}', | ||
prerelease !== undefined ? `'${prerelease}'` : 'null', | ||
), | ||
'utf-8', | ||
); | ||
|
||
let packageJson = JSON.parse(cat('package.json')); | ||
packageJson.version = version; | ||
delete packageJson.workspaces; | ||
delete packageJson.private; | ||
|
||
// Copy dependencies over from repo-config/package.json | ||
const repoConfigJson = JSON.parse(cat('repo-config/package.json')); | ||
packageJson.devDependencies = { | ||
...packageJson.devDependencies, | ||
...repoConfigJson.dependencies, | ||
}; | ||
// Make react-native-codegen a direct dependency of react-native | ||
delete packageJson.devDependencies['react-native-codegen']; | ||
packageJson.dependencies = { | ||
...packageJson.dependencies, | ||
'react-native-codegen': repoConfigJson.dependencies['react-native-codegen'], | ||
}; | ||
fs.writeFileSync('package.json', JSON.stringify(packageJson, null, 2), 'utf-8'); | ||
|
||
// Change ReactAndroid/gradle.properties | ||
if ( | ||
sed( | ||
'-i', | ||
/^VERSION_NAME=.*/, | ||
`VERSION_NAME=${version}`, | ||
'ReactAndroid/gradle.properties', | ||
).code | ||
) { | ||
echo("Couldn't update version for Gradle"); | ||
exit(1); | ||
} | ||
|
||
// Change react-native version in the template's package.json | ||
exec(`node scripts/set-rn-template-version.js ${version}`); | ||
|
||
// Make sure to update ruby version | ||
if (exec('scripts/update-ruby.sh').code) { | ||
echo('Failed to update Ruby version'); | ||
exit(1); | ||
} | ||
|
||
// Verify that files changed, we just do a git diff and check how many times version is added across files | ||
const filesToValidate = [ | ||
'package.json', | ||
'ReactAndroid/gradle.properties', | ||
'template/package.json', | ||
]; | ||
const numberOfChangedLinesWithNewVersion = exec( | ||
`git diff -U0 ${filesToValidate.join( | ||
' ', | ||
)}| grep '^[+]' | grep -c ${version} `, | ||
{silent: true}, | ||
).stdout.trim(); | ||
|
||
if (+numberOfChangedLinesWithNewVersion !== filesToValidate.length) { | ||
echo( | ||
`Failed to update all the files: [${filesToValidate.join( | ||
', ', | ||
)}] must have versions in them`, | ||
); | ||
echo('Fix the issue and try again'); | ||
exit(1); | ||
} | ||
|
||
exit(0); |