diff --git a/tools/bump.sh b/tools/bump.sh index 00bed1e..8d2b6f6 100755 --- a/tools/bump.sh +++ b/tools/bump.sh @@ -1,34 +1,24 @@ #!/usr/bin/env bash # -# How does it work: # -# 1. Cherry pick the latest commit from default branch -# to the target release branch if the target release branch already existed. +# 1. Bump latest version number to the following files: # -# 2. Bump latest version number to the following files: -# -# - _sass/jekyll-theme-chirpy.scss -# - _javascript/copyright -# - assets/js/dist/*.js (will be built by gulp later) -# - jekyll-theme-chirpy.gemspec -# - package.json -# -# 3. Create a git-tag on release branch -# -# 4. Build a RubyGems package base on the latest git-tag +# - _sass/jekyll-theme-chirpy.scss +# - _javascript/copyright +# - assets/js/dist/*.js (will be built by gulp later) +# - jekyll-theme-chirpy.gemspec +# - package.json # +# 2. Then create a commit to automatically save the changes. # # Usage: # -# Run on default branch, if run on other branch requires parameter '-m' (manual mode). +# Run on the default branch or hotfix branch # -# -# Requires: Git, Gulp, RubyGems +# Requires: Git, Gulp set -eu -opt_manual=false - ASSETS=( "_sass/jekyll-theme-chirpy.scss" "_javascript/copyright" @@ -38,10 +28,6 @@ GEM_SPEC="jekyll-theme-chirpy.gemspec" NODE_META="package.json" -DEFAULT_BRANCH="master" - -_working_branch="$(git branch --show-current)" - _check_src() { if [[ ! -f $1 && ! -d $1 ]]; then echo -e "Error: Missing file \"$1\"!\n" @@ -55,12 +41,6 @@ check() { exit -1 fi - # ensure working on default branch or running in 'manual' mode - if [[ $_working_branch != $DEFAULT_BRANCH && $opt_manual == "false" ]]; then - echo "Error: This operation must be performed on the 'master' branch or '--manual' mode!" - exit -1 - fi - for i in "${!ASSETS[@]}"; do _check_src "${ASSETS[$i]}" done @@ -98,75 +78,6 @@ bump() { fi } -build_gem() { - rm -f ./*.gem - gem build "$GEM_SPEC" -} - -release() { - _version="$1" - _major="" - _minor="" - _new_release_branch=false - - IFS='.' read -r -a array <<< "$_version" - - for elem in "${array[@]}"; do - if [[ -z $_major ]]; then - _major="$elem" - elif [[ -z $_minor ]]; then - _minor="$elem" - else - break - fi - done - - _release_branch="$_major-$_minor-stable" - - if ! $opt_manual; then - if [[ -z $(git branch -v | grep "$_release_branch") ]]; then - git checkout -b "$_release_branch" - _new_release_branch=true - else - # cherry-pick the latest commit from default branch to release branch - _last_commit="$(git rev-parse $DEFAULT_BRANCH)" - git checkout "$_release_branch" - git cherry-pick "$_last_commit" -m 1 - fi - - fi - - echo -e "Bump version to $_version\n" - bump "$_version" - - echo -e "Create tag v$_version\n" - git tag "v$_version" - - echo -e "Build the gem pakcage for v$_version\n" - build_gem - - # head back to working branch - git checkout "$_working_branch" - - if [[ $_working_branch == $DEFAULT_BRANCH ]]; then - if $_new_release_branch; then - git merge "$_release_branch" - fi - fi - -} - -help() { - echo "Bump new version to Chirpy project" - echo "Usage:" - echo - echo " bash /path/to/bump.sh [options]" - echo - echo "Options:" - echo " -m, --manual Manual relase, bump version only." - echo " -h, --help Print this help information." -} - main() { check @@ -183,7 +94,8 @@ main() { exit -1 fi - release "$_version" + echo -e "Bump version to $_version\n" + bump "$_version" else @@ -192,22 +104,4 @@ main() { } -while (($#)); do - opt="$1" - case $opt in - -m | --manual) - opt_manual=true - shift - ;; - -h | --help) - help - exit 0 - ;; - *) - echo "unknown option '$opt'!" - exit 1 - ;; - esac -done - main diff --git a/tools/release.sh b/tools/release.sh new file mode 100755 index 0000000..ef5892b --- /dev/null +++ b/tools/release.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +# +# According to the GitLab flow release branching model, +# cherry-pick the last commit on the main branch to the release branch, +# and then create a tag and gem package on the release branch (naming format: 'release/'). +# +# +# Usage: +# +# It can be run on main branch, and it should be used after just finishing the last feature in the version plan, +# or just after merging the hotfix to the main branch. +# +# Requires: Git, Gulp + +set -eu + +GEM_SPEC="jekyll-theme-chirpy.gemspec" + +check() { + if [[ -n $(git status . -s) ]]; then + echo "Error: Commit unstaged files first, and then run this tool againt." + exit -1 + fi + + if [[ ! -f $GEM_SPEC ]]; then + echo -e "Error: Missing file \"$GEM_SPEC\"!\n" + exit -1 + fi +} + +release() { + _default_branch="$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')" + _version="$(grep "spec.version" jekyll-theme-chirpy.gemspec | sed 's/.*= "//;s/".*//')" # X.Y.Z + _release_branch="release/${_version%.*}" + + if [[ -z $(git branch -v | grep "$_release_branch") ]]; then + # create a new release branch + git checkout -b "$_release_branch" + else + # cherry-pick the latest commit from default branch to release branch + _last_commit="$(git rev-parse "$_default_branch")" + git checkout "$_release_branch" + git cherry-pick "$_last_commit" -m 1 + fi + + # create new tag + echo -e "Create tag v$_version\n" + git tag "v$_version" + + # build a gem package + echo -e "Build the gem pakcage for v$_version\n" + rm -f ./*.gem + gem build "$GEM_SPEC" + +} + +main() { + check + release +} + +main