217 lines
6.0 KiB
Bash
Executable File
217 lines
6.0 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
RELEASER_PATH="$(pwd)"
|
|
IS_PRE_RELEASE=false
|
|
|
|
# When it is set to true, the commands are just printed but not executed.
|
|
DRY_RUN_MODE=false
|
|
# When it is set to true, the commands that affect the local env are executed (e.g. git commit), while the commands that affect the remote env are not executed but just printed (e.g. git push)
|
|
SIMULATE_RELEASE_MODE=false
|
|
|
|
# Functions
|
|
# Check if string contains substring
|
|
is_substring() {
|
|
case "$2" in
|
|
*$1*)
|
|
return 0
|
|
;;
|
|
*)
|
|
return 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Output colorized strings
|
|
#
|
|
# Color codes:
|
|
# 0 - black
|
|
# 1 - red
|
|
# 2 - green
|
|
# 3 - yellow
|
|
# 4 - blue
|
|
# 5 - magenta
|
|
# 6 - cian
|
|
# 7 - white
|
|
output() {
|
|
echo "$(tput setaf "$1")$2$(tput sgr0)"
|
|
}
|
|
|
|
simulate() {
|
|
if $2 = true ; then
|
|
eval "$1"
|
|
else
|
|
output 3 "DRY RUN: $1"
|
|
fi
|
|
}
|
|
|
|
|
|
run_command() {
|
|
if $DRY_RUN_MODE = true; then
|
|
output 3 "DRY RUN: $1"
|
|
elif $SIMULATE_RELEASE_MODE = true; then
|
|
simulate "$1" $2
|
|
else
|
|
eval "$1"
|
|
fi
|
|
}
|
|
|
|
|
|
if ! [ -x "$(command -v hub)" ]; then
|
|
echo 'Error: hub is not installed. Install from https://github.com/github/hub' >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Release script
|
|
echo
|
|
output 5 "BLOCKS->GitHub RELEASE SCRIPT"
|
|
output 5 "============================="
|
|
echo
|
|
printf "This script will build files and create a tag on GitHub based on your local branch."
|
|
echo
|
|
echo
|
|
printf "The /build/ directory will also be pushed to the tagged release."
|
|
echo
|
|
echo
|
|
echo "Before proceeding:"
|
|
echo " • Ensure you have checked out the branch you wish to release"
|
|
echo " • Ensure you have committed/pushed all local changes"
|
|
echo " • Did you remember to update changelogs, the readme and plugin files?"
|
|
echo " • Are there any changes needed to the readme file?"
|
|
echo " • If you are running this script directly instead of via '$ npm run deploy', ensure you have built assets and installed composer in --no-dev mode."
|
|
echo
|
|
output 3 "Do you want to continue? [y/N]: "
|
|
read -r PROCEED
|
|
echo
|
|
|
|
if [ "$(echo "${PROCEED:-n}" | tr "[:upper:]" "[:lower:]")" != "y" ]; then
|
|
output 1 "Release cancelled!"
|
|
exit 1
|
|
fi
|
|
echo
|
|
output 3 "Please enter the version number to tag, for example, 1.0.0:"
|
|
read -r VERSION
|
|
echo
|
|
|
|
CURRENTBRANCH="$(git rev-parse --abbrev-ref HEAD)"
|
|
|
|
# Check if is a pre-release.
|
|
if is_substring "-" "${VERSION}"; then
|
|
IS_PRE_RELEASE=true
|
|
output 2 "Detected pre-release version!"
|
|
fi
|
|
|
|
|
|
echo
|
|
output 3 "Will this release get published to WordPress.org? Note: If the version on WordPress.org is greater than ${VERSION}, then you should answer 'N' here. [y/N]:"
|
|
read -r DO_WP_DEPLOY
|
|
echo
|
|
|
|
if [ ! -d "build" ]; then
|
|
output 3 "Build directory not found. Aborting."
|
|
exit 1
|
|
fi
|
|
|
|
# Safety check, if a patch release is detected ask for verification.
|
|
VERSION_PIECES=${VERSION//[^.]}
|
|
|
|
# explode version parts
|
|
split_version() {
|
|
echo ${VERSION} \
|
|
| sed 's/\./ /g'
|
|
}
|
|
|
|
SPLIT_VERSION=($(split_version))
|
|
|
|
# IF VERSION_PIECES is less than 2 then its invalid so let's update it and notify
|
|
if [[ "${#VERSION_PIECES}" -lt "2" ]]; then
|
|
if [[ ${#VERSION_PIECES} -eq "0" ]]; then
|
|
VERSION=${VERSION}.0.0
|
|
else
|
|
VERSION=${VERSION}.0
|
|
fi
|
|
fi
|
|
|
|
if [[ "${#VERSION_PIECES}" -ge "2" && "${SPLIT_VERSION[2]}" -ne "0" && "$(echo "${DO_WP_DEPLOY:-n}" | tr "[:upper:]" "[:lower:]")" = "y" ]]; then
|
|
output 1 "The version you entered (${VERSION}) looks like a patch version. Since this version will be deployed to WordPress.org, it will become the latest available version. Are you sure you want that (no will abort)?: [y/N]"
|
|
read -r ABORT
|
|
echo
|
|
if [ "$(echo "${ABORT:-n}" | tr "[:upper:]" "[:lower:]")" != "y" ]; then
|
|
output 1 "Release cancelled!"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "$(output 4 "The version is set as ") $(output 3 "${VERSION}") $(output 4 " and the next step will be to bump all the version strings in relevant files.")"
|
|
printf "Ready to proceed? [y/N]: "
|
|
read -r PROCEED
|
|
echo
|
|
fi
|
|
|
|
if [ "$(echo "${PROCEED:-n}" | tr "[:upper:]" "[:lower:]")" != "y" ]; then
|
|
output 1 "Release cancelled!"
|
|
exit 1
|
|
fi
|
|
|
|
# Update versions in files in case they were not updated.
|
|
output 2 "Updating version numbers in files and regenerating php autoload classmap (note pre-releases will not have the readme.txt stable tag updated)..."
|
|
run_command "source '$RELEASER_PATH/bin/change-versions.sh'" true
|
|
|
|
composer dump-autoload
|
|
|
|
# remove composer.json version bump after autoload regen (we don't commit it)
|
|
run_command "git checkout -- composer.json" true
|
|
|
|
output 2 "Committing version change..."
|
|
echo
|
|
|
|
run_command "git commit -am 'Bumping version strings to new version.' --no-verify" true
|
|
run_command "git push origin $CURRENTBRANCH" false
|
|
|
|
# Tag existing version for reference
|
|
output 2 "Creating tag for current non-built branch on GitHub..."
|
|
echo
|
|
DEVTAG="v${VERSION}-dev"
|
|
run_command "git tag $DEVTAG" true
|
|
run_command "git push origin $DEVTAG" false
|
|
|
|
output 2 "Prepping release for GitHub..."
|
|
echo
|
|
|
|
# Create a release branch.
|
|
BRANCH="build/${VERSION}"
|
|
|
|
run_command "git checkout -b $BRANCH" true
|
|
|
|
# Force add build directory and commit.
|
|
run_command "git add build/. --force" true
|
|
run_command "git add ." true
|
|
run_command "git commit -m 'Adding /build directory to release' --no-verify" true
|
|
|
|
# # Force add vendor directory and commit.
|
|
run_command "git add vendor/. --force" true
|
|
run_command "git add ." true
|
|
run_command "git commit -m 'Adding /vendor directory to release' --no-verify" true
|
|
|
|
# # Push branch upstream
|
|
run_command "git push origin $BRANCH" false
|
|
|
|
# Create the new release.
|
|
if [ "$(echo "${DO_WP_DEPLOY:-n}" | tr "[:upper:]" "[:lower:]")" = "y" ]; then
|
|
if [ $IS_PRE_RELEASE = true ]; then
|
|
run_command "hub release create -m $VERSION -m 'Release of version $VERSION. See readme.txt for details.' -t $BRANCH --prerelease 'v${VERSION}'" false
|
|
else
|
|
run_command "hub release create -m $VERSION -m 'Release of version $VERSION. See readme.txt for details.' -t $BRANCH 'v${VERSION}'" false
|
|
fi
|
|
else
|
|
run_command "git tag 'v${VERSION}'" true
|
|
run_command "git push origin 'v${VERSION}'" false
|
|
fi
|
|
|
|
run_command "git checkout $CURRENTBRANCH" true
|
|
run_command "git branch -D $BRANCH" true
|
|
run_command "git push origin --delete $BRANCH" false
|
|
|
|
# regenerate classmap for development
|
|
run_command "composer dump-autoload" false
|
|
|
|
output 2 "GitHub release complete."
|