diff options
author | Damien Martin-Guillerez <dmarting@google.com> | 2016-12-06 12:24:14 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2016-12-06 13:35:35 +0000 |
commit | c3e5743045a23d5a67c79d7175d724726f7a7abf (patch) | |
tree | c9ada6f09e620af0a9ccdc9954e05e2dcf41da4a | |
parent | 6c66e5010b14d00f122686f553c7110fc3c411a5 (diff) |
Release: add a generate-rc command to the release script
This generate-rc command allows people to use the git workflow, that is:
$ git checkout -b release-name baseline
$ git cherry-pick commit1 commit2 ...
$ ./scripts/release/release.sh generate-rc
Instead of
$ ./scripts/release/release.sh create name baseline commit1 commit2 ....
--
Change-Id: I4a00f7ab46590450ba7ee26c6509ed747f32d956
Reviewed-on: https://cr.bazel.build/7450
PiperOrigin-RevId: 141163272
MOS_MIGRATED_REVID=141163272
-rwxr-xr-x | scripts/release/release.sh | 17 | ||||
-rwxr-xr-x | scripts/release/release_test.sh | 166 |
2 files changed, 182 insertions, 1 deletions
diff --git a/scripts/release/release.sh b/scripts/release/release.sh index 7e92c76cab..53f989e3af 100755 --- a/scripts/release/release.sh +++ b/scripts/release/release.sh @@ -338,6 +338,8 @@ function abandon_release() { echo -n "You are about to abandon release ${tag_name}, confirm? [y/N] " read answer if [ "$answer" = "y" -o "$answer" = "Y" ]; then + git notes --ref=release remove 2>/dev/null || true + git notes --ref=release-candidate remove 2>/dev/null || true git checkout -q master >/dev/null cleanup_branches ${tag_name} fi @@ -353,6 +355,13 @@ Available commands are: COMMIT1 ... COMMITN. The release candidate number will be computed from existing release branch unless --force_rc is specified. + - generate-rc [--force_rc=RC]: generate a release candidate out of + the current branch, the branch should be named "release-XXX" + where "XXX" is the name of the release. This branch should be + a fork of master in which some cherry-picks where taken from + master. --force_rc can be used to override the RC number + (by default it tries to look for latest release and increment + the rc number). - push: push the current release branch to release repositories. - release: do the actual release of the current release branch. - abandon: abandon the current release branch. @@ -400,6 +409,14 @@ case $cmd in release) do_release ;; + generate-rc) + force_rc= + if [[ "${1-}" =~ ^--force_rc=([0-9]*)$ ]]; then + force_rc=${BASH_REMATCH[1]} + shift 1 + fi + setup_git_notes "${force_rc}" + ;; abandon) abandon_release ;; diff --git a/scripts/release/release_test.sh b/scripts/release/release_test.sh index 9ead3e2af1..1d7511a7a2 100755 --- a/scripts/release/release_test.sh +++ b/scripts/release/release_test.sh @@ -188,7 +188,6 @@ Test replacement. } - function test_release_workflow() { export EDITOR=true # Initial release @@ -329,4 +328,169 @@ EOF abandon v2 } +function generate_rc() { + local force_rc= + if [[ "$1" =~ ^--force_rc=[0-9]+$ ]]; then + force_rc="$1" + shift + fi + local name="$1" + shift + if (git rev-parse --verify "release-$name" &>/dev/null); then + git checkout release-"$name" + else + git checkout -b release-"$name" $1 + shift + fi + for i in "$@"; do + git cherry-pick $i + done + ${RELEASE_SCRIPT} generate-rc $force_rc &> $TEST_log \ + || fail "Failed to cut release $name" + get_full_release_notes "release-$name" >$TEST_log + git checkout master +} + +# Same test as before with the workflow for the git user +function test_git_release_workflow() { + export EDITOR=true + # Initial release + generate_rc v0 965c392 + + expect_log "Release v0rc1" + expect_log "Initial release" + # Push the release branch + push v0 + # Do the initial release + release v0 + + # Second release. + + # First we need to edit the logs + export EDITOR=${TEST_TMPDIR}/editor.sh + local RELNOTES='Incompatible changes: + + - Remove deprecated "make var" INCDIR + +Important changes: + + - Use a default implementation of a progress message, rather than + defaulting to null for all SpawnActions.' + + cat >${TEST_TMPDIR}/expected.log <<EOF +# Editing release notes +# Modify the release notes to make them suitable for the release. +# Every line starting with a # will be removed as well as every +# empty line at the start and at the end. + +# Release v1rc1 ($(date +%Y-%m-%d)) + +${RELNOTES} + +EOF + + echo "Test replacement" >${TEST_TMPDIR}/replacement.log + + cat >${EDITOR} <<EOF +#!/bin/bash + +# 1. Assert the file is correct +if [ "\$(cat \$1)" != "\$(cat ${TEST_TMPDIR}/expected.log)" ]; then + echo "Expected:" >&2 + cat ${TEST_TMPDIR}/expected.log >&2 + echo "Got:" >&2 + cat \$1 >&2 + exit 1 +fi + +# 2. write the replacement in the input file +cat ${TEST_TMPDIR}/replacement.log >\$1 +EOF + chmod +x ${EDITOR} + generate_rc v1 1170dc6 0540fde + local header='Release v1rc1 ('$(date +%Y-%m-%d)') + +Baseline: 1170dc6 + +Cherry picks: + + 0540fde: Extract version numbers that look like "..._1.2.3_..." + from BUILD_EMBED_LABEL into Info.plist. + +' + assert_equals "${header}Test replacement" "$(cat ${TEST_log})" + assert_equals "Test replacement" "$(get_release_notes release-v1)" + assert_equals 1 "$(get_release_candidate release-v1)" + push v1 + + # Test creating a second candidate + RELNOTES="${RELNOTES}"' + - Attribute error messages related to Android resources are easier + to understand now.' + + # There should be a merge conflict + cat >${TEST_TMPDIR}/expected.log <<EOF +# Editing release notes +# Modify the release notes to make them suitable for the release. +# Every line starting with a # will be removed as well as every +# empty line at the start and at the end. + +# Release v1rc2 ($(date +%Y-%m-%d)) + +<<<<<<< HEAD +${RELNOTES} +======= +Test replacement +>>>>>>> release-v1-merge-notes-1 +EOF + echo "${RELNOTES}" >${TEST_TMPDIR}/replacement.log + + generate_rc v1 cef25c4 + header='Release v1rc2 ('$(date +%Y-%m-%d)') + +Baseline: 1170dc6 + +Cherry picks: + + 0540fde: Extract version numbers that look like "..._1.2.3_..." + from BUILD_EMBED_LABEL into Info.plist. + + cef25c4: RELNOTES: Attribute error messages related to Android + resources are easier to understand now. + +' + assert_equals "${header}${RELNOTES}" "$(cat ${TEST_log})" + assert_equals "${RELNOTES}" "$(get_release_notes release-v1)" + assert_equals 2 "$(get_release_candidate release-v1)" + + # Push the release + push v1 + release v1 + + # Third release to test abandon + cat >${EDITOR} <<EOF +#!/bin/bash +# Make sure we have release notes or the release will be cancelled. +echo 'Dummy release' >\$1 +EOF + # Create release + generate_rc --force_rc=2 v2 2464526 + expect_log "Release v2rc2" + expect_log "Baseline: 2464526" + assert_equals 2 "$(get_release_candidate release-v2)" + # Abandon it + abandon v2 + # Add a commit hook to test if it is ignored + cat <<'EOF' >.git/hooks/commit-msg +echo HOOK-SHOULD-BE-IGNORED >>$1 +EOF + chmod +x .git/hooks/commit-msg + # Re-create release + generate_rc v2 2464526 + expect_log "Release v2rc1" + expect_log "Baseline: 2464526" + expect_not_log "HOOK-SHOULD-BE-IGNORED" + # Push + push v2 + # Abandon it + abandon v2 +} + run_suite "Release tests" |