realm-js/scripts/publish.sh

92 lines
3.0 KiB
Bash
Executable File

#!/bin/bash
set -e
set -o pipefail
die() {
echo "$@" >&2
exit 1
}
confirm() {
local choice
while true; do
read -r -p "$1 (y/n) " -n 1 choice
echo
case "$choice" in
y|Y ) return 0;;
n|N ) return 1;;
* ) echo "It's a simple yes or no question!" >&2
esac
done
}
has_clean_worktree() {
git diff --ignore-submodules=none --no-ext-diff --quiet --exit-code HEAD
}
has_no_untracked_files() {
test -z "$(git ls-files --others --exclude-standard)"
}
# Start in the root directory of the project.
cd "$(dirname "$0")/.."
# Check if the worktree (or submodules) are dirty.
has_clean_worktree || die 'Publishing requires a clean working tree.'
# Check if there are untracked files that may accidentally get published.
has_no_untracked_files || die 'Publishing requires no untracked files.'
# Make sure all npm modules are installed and updated.
npm install > /dev/null
# Get version in package.json and check if it looks semver compliant.
VERSION=$(npm --silent run get-version)
node_modules/.bin/semver "$VERSION" > /dev/null || die "Invalid version number: $VERSION"
# Update Xcode project to that version and make sure nothing changed.
RELEASE_VERSION="${VERSION%%-*}"
xcrun agvtool new-version "$RELEASE_VERSION" > /dev/null
has_clean_worktree || die "Version $RELEASE_VERSION was not properly set on Xcode project."
# Make sure the CHANGELOG has been updated.
grep -iq "^${RELEASE_VERSION//./\.} Release notes" CHANGELOG.md || die 'CHANGELOG needs to be updated.'
# Check that the current branch is valid.
BRANCH=$(git rev-parse --abbrev-ref HEAD)
VERSION_BRANCH="${RELEASE_VERSION%.*}.x"
[[ $BRANCH = 'master' || $BRANCH = $VERSION_BRANCH ]] || die "Must publish from master or $VERSION_BRANCH branch."
# Check that this master branch is up to date with GitHub.
git fetch origin || die 'Failed to fetch from git origin.'
[ -z "$(git rev-list origin/$BRANCH..HEAD)" ] || die 'Local commits are not pushed to origin.'
# Run all tests that must pass before publishing.
for test in eslint jsdoc realmjs react-example react-tests react-tests-android; do
for configuration in Debug Release; do
echo "RUNNING TEST: $test ($configuration)"
echo '----------------------------------------'
npm test "$test" "$configuration" || die "Test Failed: $test ($configuration)"
echo
done
done
# Double check before actually publishing.
confirm "Are you sure you want to publish $VERSION?" || die "Aborted publishing $VERSION"
# This should fail if this tag already exists.
git tag "v$VERSION"
# Delete Android build directory so no stale files are accidentally included.
rm -rf react-native/android/build
# Publish to npm, informing the prepublish script to build Android modules.
echo "Publishing $VERSION to npm..."
PRERELEASE=$(grep -Eio '[a-z]+' <<< "$VERSION")
REALM_BUILD_ANDROID=1 npm publish ${PRERELEASE:+--tag $PRERELEASE}
# Only push the tag to GitHub if the publish was successful.
echo "Pushing v$VERSION tag to GitHub..."
git push origin "v$VERSION"