blob: deb812654b912629d7e30cd92cd856c4405f07e8 [file] [log] [blame]
#!/bin/bash
# Copyright 2015 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Tests release notes generation (relnotes.sh)
set -eu
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
source ${SCRIPT_DIR}/testenv.sh || { echo "testenv.sh not found!" >&2; exit 1; }
source ${SCRIPT_DIR}/common.sh || { echo "common.sh not found!" >&2; exit 1; }
RELEASE_SCRIPT=${SCRIPT_DIR}/release.sh
GERRIT_ROOT=${TEST_TMPDIR}/git/gerrit
GITHUB_ROOT=${TEST_TMPDIR}/git/github
WORKSPACE=${TEST_TMPDIR}/git/workspace
export RELEASE_REPOSITORIES="${GITHUB_ROOT}"
export MASTER_REPOSITORIES="${GITHUB_ROOT} ${GERRIT_ROOT}"
setup_git_repository
function set_up() {
# Clean previous clones
rm -fr ${GERRIT_ROOT} ${GITHUB_ROOT} ${WORKSPACE}
# Now creates the clones
git clone -l --bare -q ${MASTER_ROOT} ${GERRIT_ROOT}
git clone -l --bare -q ${MASTER_ROOT} ${GITHUB_ROOT}
# And the working copy
git clone -l -q ${GERRIT_ROOT} ${WORKSPACE}
cd ${WORKSPACE}
# Avoid committer message
cat >>.git/config <<EOF
[user]
name = Bazel tests
email = noreply@google.com
EOF
}
function create() {
${RELEASE_SCRIPT} create $@ \
|| fail "Failed to cut release $1 at commit $2"
local branch=$(git_get_branch)
assert_equals "release-$1" "$branch"
git show -s --pretty=format:%B >$TEST_log
}
function push() {
local branch=$(git_get_branch)
${RELEASE_SCRIPT} push || fail "Failed to push release branch $branch"
git --git-dir=${GITHUB_ROOT} branch >$TEST_log
expect_log "$branch"
git --git-dir=${GERRIT_ROOT} branch >$TEST_log
expect_not_log "$branch"
assert_equals "$(git show -s --pretty=format:%B $branch)" \
"$(git --git-dir=${GITHUB_ROOT} show -s --pretty=format:%B $branch)"
}
function release() {
local tag=$1
local branch=$(git_get_branch)
local changelog=$(cat CHANGELOG.md)
local commit=$(git show -s --pretty=format:%B $branch)
echo y | ${RELEASE_SCRIPT} release || fail "Failed to release ${branch}"
assert_equals master "$(git_get_branch)"
git tag >$TEST_log
expect_log $tag
git --git-dir=${GITHUB_ROOT} tag >$TEST_log
expect_log $tag
git --git-dir=${GERRIT_ROOT} tag >$TEST_log
expect_not_log $tag
# Test commit is everywhere
assert_equals "$commit" "$(git show -s --pretty=format:%B $tag)"
assert_equals "$commit" "$(git show -s --pretty=format:%B master)"
assert_equals "$commit" \
"$(git --git-dir=${GITHUB_ROOT} show -s --pretty=format:%B $tag)"
assert_equals "$commit" \
"$(git --git-dir=${GITHUB_ROOT} show -s --pretty=format:%B master)"
assert_equals "$commit" \
"$(git --git-dir=${GERRIT_ROOT} show -s --pretty=format:%B master)"
# Now test for CHANGELOG.md file in master branch
assert_equals "$changelog" "$(git show $tag:CHANGELOG.md)"
assert_equals "$changelog" "$(git show master:CHANGELOG.md)"
assert_equals "$changelog" \
"$(git --git-dir=${GITHUB_ROOT} show $tag:CHANGELOG.md)"
assert_equals "$changelog" \
"$(git --git-dir=${GITHUB_ROOT} show master:CHANGELOG.md)"
assert_equals "$changelog" \
"$(git --git-dir=${GERRIT_ROOT} show master:CHANGELOG.md)"
}
function abandon() {
local tag="$1"
local branch=$(git_get_branch)
local changelog="$(git show master:CHANGELOG.md)"
local master_sha1=$(git rev-parse master)
echo y | ${RELEASE_SCRIPT} abandon || fail "Failed to abandon release ${branch}"
assert_equals master "$(git_get_branch)"
# test release was not tagged
git tag >$TEST_log
expect_not_log $tag
git --git-dir=${GITHUB_ROOT} tag >$TEST_log
expect_not_log $tag
git --git-dir=${GERRIT_ROOT} tag >$TEST_log
expect_not_log $tag
# Test branch was deleted
git branch >$TEST_log
expect_not_log $branch
git --git-dir=${GITHUB_ROOT} branch >$TEST_log
expect_not_log $branch
# Test the master branch commit hasn't changed
assert_equals "$(git rev-parse master)" "${master_sha1}"
# Now test for CHANGELOG.md file in master branch hasn't changed
assert_equals "$changelog" "$(git show master:CHANGELOG.md)"
assert_equals "$changelog" \
"$(git --git-dir=${GITHUB_ROOT} show master:CHANGELOG.md)"
assert_equals "$changelog" \
"$(git --git-dir=${GERRIT_ROOT} show master:CHANGELOG.md)"
}
function test_release_workflow() {
export EDITOR=true
# Initial release
create v0 965c392
expect_log "Release v0"
expect_log "Initial release"
# Push the release branch
push
# 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 v1 ($(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}
create v1 1170dc6 0540fde
local header='Release v1 ('$(date +%Y-%m-%d)')
Baseline: 1170dc6
+ 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})"
push
# Test creating a second candidate
echo "#!$(which true)" >${EDITOR}
create v1 1170dc6 0540fde cef25c4
header='Release v1 ('$(date +%Y-%m-%d)')
Baseline: 1170dc6
+ 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.
'
RELNOTES="${RELNOTES}"'
- Attribute error messages related to Android resources are easier
to understand now.'
assert_equals "${header}${RELNOTES}" "$(cat ${TEST_log})"
assert_equals 2 "$(get_release_candidate)"
# Push the release
push
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
create v2 2464526
expect_log "Release v2"
expect_log "Baseline: 2464526"
# 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
create v2 2464526
expect_log "Release v2"
expect_log "Baseline: 2464526"
expect_not_log "HOOK-SHOULD-BE-IGNORED"
# Push
push
# Abandon it
abandon v2
}
run_suite "Release tests"