aboutsummaryrefslogtreecommitdiffhomepage
path: root/scripts/release
diff options
context:
space:
mode:
authorGravatar Philipp Wollermann <philwo@google.com>2018-03-27 04:37:23 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-03-27 04:38:31 -0700
commit5fabb43c4b5682616f8c9a7a5cc74f1ff6198c6e (patch)
tree1e11a8fecc57d7ddddb5a7d26486e2b22dfea796 /scripts/release
parentb332200392caa0436531ce2d3eaca56b0a992114 (diff)
Simplify the release scripts in preparation of rewriting them in Python
These are the scripts I'm currently using for the Bazel 0.12.0 release. Closes #4908. PiperOrigin-RevId: 190598268
Diffstat (limited to 'scripts/release')
-rw-r--r--scripts/release/BUILD44
-rwxr-xr-xscripts/release/common.sh99
-rwxr-xr-xscripts/release/release.sh264
-rwxr-xr-xscripts/release/release_test.sh528
-rwxr-xr-xscripts/release/relnotes.sh27
-rwxr-xr-xscripts/release/relnotes_test.sh267
-rwxr-xr-xscripts/release/testenv.sh43
7 files changed, 180 insertions, 1092 deletions
diff --git a/scripts/release/BUILD b/scripts/release/BUILD
index d14dd24c97..e7fa5c6751 100644
--- a/scripts/release/BUILD
+++ b/scripts/release/BUILD
@@ -6,47 +6,3 @@ filegroup(
srcs = glob(["**"]),
visibility = ["//scripts:__pkg__"],
)
-
-sh_library(
- name = "relnotes",
- srcs = [
- "common.sh",
- "relnotes.sh",
- ],
-)
-
-sh_test(
- name = "relnotes_test",
- srcs = ["relnotes_test.sh"],
- data = [
- "testenv.sh",
- "//:git",
- "//src/test/shell:bashunit",
- ],
- shard_count = 2,
- tags = ["need_git"],
- deps = [
- ":relnotes",
- ],
-)
-
-sh_library(
- name = "release",
- srcs = [
- "release.sh",
- ],
- deps = [":relnotes"],
-)
-
-sh_test(
- name = "release_test",
- srcs = ["release_test.sh"],
- data = [
- "testenv.sh",
- "//:git",
- "//src/test/shell:bashunit",
- ],
- shard_count = 2,
- tags = ["need_git"],
- deps = [":release"],
-)
diff --git a/scripts/release/common.sh b/scripts/release/common.sh
index 1b1a441bf1..6563b2eac9 100755
--- a/scripts/release/common.sh
+++ b/scripts/release/common.sh
@@ -29,6 +29,16 @@ set -eu
# To follow tracks and to support how CI systems fetch the refs, we
# store two commit notes: the release name and the candidate number.
+# Get the short hash of a commit
+function __git_commit_hash() {
+ git rev-parse "${1}"
+}
+
+# Get the subject (first line of the commit message) of a commit
+function __git_commit_subject() {
+ git show -s --pretty=format:%s "$@"
+}
+
# Returns the branch name of the current git repository
function git_get_branch() {
git symbolic-ref --short HEAD
@@ -49,16 +59,6 @@ function get_release_name() {
git notes --ref=release show "$@" 2>/dev/null || true
}
-# Get the short hash of a commit
-function git_commit_hash() {
- git rev-parse "${1}"
-}
-
-# Get the subject (first line of the commit message) of a commit
-function git_commit_subject() {
- git show -s --pretty=format:%s "$@"
-}
-
# Get the list of commit hashes between two revisions
function git_log_hash() {
local baseline="$1"
@@ -110,8 +110,8 @@ function wrap_text() {
# + CHERRY_PICK1: commit message summary of the CHERRY_PICK1. This
# message will be wrapped into 70 columns.
# + CHERRY_PICK2: commit message summary of the CHERRY_PICK2.
-function create_revision_information() {
- echo "Baseline: $(git_commit_hash "${1}")"
+function __create_revision_information() {
+ echo "Baseline: $(__git_commit_hash "${1}")"
local first=1
shift
while [ -n "${1-}" ]; do
@@ -119,8 +119,8 @@ function create_revision_information() {
echo -e "\nCherry picks:"
first=0
fi
- local hash="$(git_commit_hash "${1}")"
- local subject="$(git_commit_subject $hash)"
+ local hash="$(__git_commit_hash "${1}")"
+ local subject="$(__git_commit_subject $hash)"
local lines=$(echo "$subject" | wrap_text 65) # 5 leading spaces.
echo " + $hash:"
echo "$lines" | sed 's/^/ /'
@@ -128,35 +128,11 @@ function create_revision_information() {
done
}
-# Get the master commit
-# Some machine might not have a "master" branch, use "origin/master" in that case
-function get_master_ref() {
- git rev-parse --verify master 2>/dev/null || git rev-parse --verify origin/master
-}
-
# Get the baseline of master.
-# Args: $1: release branch, default to HEAD
+# Args: $1: release branch (or HEAD)
+# TODO(philwo) this gives the wrong baseline when HEAD == release == master.
function get_release_baseline() {
- git merge-base $(get_master_ref) "${1:-HEAD}"
-}
-
-# Returns the list of (commit hash, patch-id) from $1..$2
-# Args:
-# $1: the first commit in the list (excluded)
-# $2: the last commit in the list
-function get_patch_ids() {
- git_log_hash "$1" "$2" | xargs git show | git patch-id
-}
-
-# Returns the original commit a commit was cherry-picked from master
-# Args:
-# $1: the commit to find
-# $2: the baseline from which to look for (up to master)
-# $3: master ref (optional, default master)
-# $4: The list of master changes as returned by get_patch_ids (optional)
-function get_cherrypick_origin() {
- local master=${3:-$(get_master_ref)}
- local master_changes="${4-$(get_patch_ids "${2}" "${master}")}"
+ git merge-base master "$1"
}
# Get the list of cherry-picks since master
@@ -165,12 +141,11 @@ function get_cherrypick_origin() {
# $2: baseline change, default to $(get_release_baseline $1)
function get_cherrypicks() {
local branch="${1:-HEAD}"
- local master=$(get_master_ref)
local baseline="${2:-$(get_release_baseline "${branch}")}"
# List of changes since the baseline on the release branch
local changes="$(git_log_hash "${baseline}" "${branch}" --reverse)"
# List of changes since the baseline on the master branch, and their patch-id
- local master_changes="$(git_log_hash "${baseline}" "${master}" | xargs git show | git patch-id)"
+ local master_changes="$(git_log_hash "${baseline}" master | xargs git show | git patch-id)"
# Now for each changes on the release branch
for i in ${changes}; do
local hash=$(git notes --ref=cherrypick show "$i" 2>/dev/null || true)
@@ -213,7 +188,7 @@ function generate_release_message() {
if [ -n "${delimiter}" ]; then
echo "${delimiter}"
fi
- create_revision_information $baseline $cherrypicks
+ __create_revision_information $baseline $cherrypicks
if [ -n "${delimiter}" ]; then
echo "${delimiter}"
fi
@@ -236,39 +211,3 @@ function get_full_release_notes() {
git_commit_msg "$@"
fi
}
-
-# Merge three release notes using branch $1 as a base
-# Args:
-# $1 the branch name to use to play on
-# $2 the new generated release notes
-# $3 the last generated release notes
-# $4 the last edited release notes
-function merge_release_notes() {
- local branch_name="$1"
- local relnotes="$2"
- local last_relnotes="$3"
- local last_savedrelnotes="$4"
- if [ "${last_relnotes}" == "${last_savedrelnotes}" ]; then
- echo "${relnotes}"
- else
- # Merge the three release notes, use git merge for it
- git checkout -q -b "${branch_name}-merge-notes-1"
- echo "${last_relnotes}" >.relnotes
- git add .relnotes
- git commit -q -m "last_relnotes" --allow-empty
- echo "${last_savedrelnotes}" >.relnotes
- git add .relnotes
- git commit -q -m "last_savedrelnotes" --allow-empty
- git checkout -q -b "${branch_name}-merge-notes-2" HEAD~
- echo "${relnotes}" >.relnotes
- git add .relnotes
- git commit -q -m "relnotes" --allow-empty
- git merge -q --no-commit "${branch_name}-merge-notes-1" &>/dev/null || true
- cat .relnotes
-
- # Clean-up
- git merge --abort || true &>/dev/null
- git checkout -q "${branch_name}"
- git branch -D ${branch_name}-merge-notes-{1,2} >/dev/null
- fi
-}
diff --git a/scripts/release/release.sh b/scripts/release/release.sh
index 3b18fd80c2..1e8cbfeb90 100755
--- a/scripts/release/release.sh
+++ b/scripts/release/release.sh
@@ -18,42 +18,73 @@ set -eu
# Generate the release branches and handle the release tags.
-# Repositories to push the release branch and the release tag.
-: ${RELEASE_REPOSITORIES:="git@github.com:bazelbuild/bazel"}
+# Name of the default editor.
+: ${EDITOR=vi}
-# Repositories to push the master branch
-: ${MASTER_REPOSITORIES:="https://bazel.googlesource.com/bazel"}
+# Repositories to push the release branch and the release tag.
+RELEASE_REPOSITORY="git@github.com:bazelbuild/bazel"
-# Name of the default editor
-: ${EDITOR=vi}
+# Repositories to push the master branch.
+MASTER_REPOSITORY="https://bazel.googlesource.com/bazel"
-# Author of the release commits
-: ${RELEASE_AUTHOR="Bazel Release System <noreply@google.com>"}
+# Author of the release commits.
+RELEASE_AUTHOR="Bazel Release System <noreply@google.com>"
-# Load relnotes.sh
+# Load relnotes.sh.
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
source ${SCRIPT_DIR}/relnotes.sh
-# Load common.sh
+# Load common.sh.
source ${SCRIPT_DIR}/common.sh
-# Editing release notes info for the user
+# Editing release notes info for the user.
RELEASE_NOTE_MESSAGE='# 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.
'
-# Fetch everything from remote repositories to avoid conflicts
-function fetch() {
- for i in ${RELEASE_REPOSITORIES}; do
- git fetch -f $i &>/dev/null || true
- git fetch -f $i refs/notes/*:refs/notes/* &>/dev/null || true
- done
+# Merge three release notes using branch $1 as a base.
+# Args:
+# $1 the branch name to use to play on
+# $2 the new generated release notes
+# $3 the last generated release notes
+# $4 the last edited release notes
+function __merge_release_notes() {
+ local branch_name="$1"
+ local relnotes="$2"
+ local last_relnotes="$3"
+ local last_savedrelnotes="$4"
+ if [ "${last_relnotes}" == "${last_savedrelnotes}" ]; then
+ echo "${relnotes}"
+ else
+ # Merge the three release notes using "git merge".
+ git checkout -q -b "${branch_name}-merge-notes-1"
+ echo "${last_relnotes}" >.relnotes
+ git add .relnotes
+ git commit -q -m "last_relnotes" --allow-empty
+
+ echo "${last_savedrelnotes}" >.relnotes
+ git add .relnotes
+ git commit -q -m "last_savedrelnotes" --allow-empty
+ git checkout -q -b "${branch_name}-merge-notes-2" HEAD~
+
+ echo "${relnotes}" >.relnotes
+ git add .relnotes
+ git commit -q -m "relnotes" --allow-empty
+
+ git merge -q --no-commit "${branch_name}-merge-notes-1" &>/dev/null || true
+ cat .relnotes
+
+ # Clean-up
+ git merge --abort || true &>/dev/null
+ git checkout -q "${branch_name}"
+ git branch -D ${branch_name}-merge-notes-{1,2} >/dev/null
+ fi
}
-# Set the release name $1 (and eventually the candidate number $2).
-function set_release_name() {
+# Set the release name to $1 (and eventually the candidate number to $2).
+function __set_release_name() {
git notes --ref=release remove 2>/dev/null || true
git notes --ref=release-candidate remove 2>/dev/null || true
git notes --ref=release append -m "$1"
@@ -63,63 +94,59 @@ function set_release_name() {
}
# Trim empty lines at the beginning and the end of the buffer.
-function trim_empty_lines() {
- local f="$(echo $'\f')" # linefeed because OSX sed does not support \f
+function __trim_empty_lines() {
# Replace all new line by a linefeed, then using sed, remove the leading
# and trailing linefeeds and convert them back to newline
- tr '\n' '\f' | sed -e "s/^$f*//" -e "s/$f*$//" | tr '\f' '\n'
+ tr '\n' '\f' | sed -e "s/^\f*//" -e "s/\f*$//" | tr '\f' '\n'
}
-# Launch the editor and return the edited release notes
-function release_note_editor() {
+# Launch the editor and return the edited release notes.
+function __release_note_editor() {
local tmpfile="$1"
local branch_name="${2-}"
+
$EDITOR ${tmpfile} || {
echo "Editor failed, cancelling release creation..." >&2
return 1
}
- # Stripping the release notes
- local relnotes="$(cat ${tmpfile} | grep -v '^#' | trim_empty_lines)"
+
+ # Strip the release notes.
+ local relnotes="$(cat ${tmpfile} | grep -v '^#' | __trim_empty_lines)"
if [ -z "${relnotes}" ]; then
echo "Release notes are empty, cancelling release creation..." >&2
return 1
fi
- echo "${relnotes}" >${tmpfile}
+
+ echo "${relnotes}" > "${tmpfile}"
}
# Create the release commit by changing the CHANGELOG file
-function create_release_commit() {
+function __create_release_commit() {
local infos=$(generate_release_message "${1}" HEAD '```')
local changelog_path="$PWD/CHANGELOG.md"
- local master=$(get_master_ref)
- # Get the changelog from master to avoid missing release notes
- # from release that were in-between
- git checkout -q ${master} CHANGELOG.md || true
+ # Get the CHANGELOG.md from master to avoid missing release notes from release
+ # that were in-between.
+ git checkout master CHANGELOG.md
# CHANGELOG.md
- local tmpfile="$(mktemp ${TMPDIR:-/tmp}/relnotes-XXXXXXXX)"
- trap "rm -f ${tmpfile}" EXIT
- echo -n "## ${infos}" >${tmpfile}
- if [ -f "${changelog_path}" ]; then
- {
- echo
- echo
- cat "${changelog_path}"
- echo
- } >> ${tmpfile}
- fi
- cat "${tmpfile}" > ${changelog_path}
- git add ${changelog_path}
- rm -f "${tmpfile}"
- trap - EXIT
+ local tmpfile="$(mktemp --tmpdir relnotes-XXXXXXXX)"
+ {
+ echo -n "## ${infos}"
+ echo
+ echo
+ cat "${changelog_path}"
+ echo
+ } >> ${tmpfile}
+ mv "${tmpfile}" "${changelog_path}"
+ git add "${changelog_path}"
# Commit
infos="$(echo "${infos}" | grep -Ev '^```$')"
git commit --no-verify -m "${infos}" --no-edit --author "${RELEASE_AUTHOR}"
}
-function apply_cherry_picks() {
+function __apply_cherry_picks() {
echo "Applying cherry-picks"
# Apply cherry-picks
for commit in "$@"; do
@@ -142,10 +169,9 @@ function apply_cherry_picks() {
return 0
}
-# Find out the last release since the fork between "${1:-HEAD}" from master.
-function find_last_release() {
- local branch="${1:-HEAD}"
- local baseline="${2:-$(get_release_baseline "${branch}")}"
+# Find out the last release since the fork between HEAD from master.
+function __find_last_release() {
+ local baseline="${1:-$(get_release_baseline "HEAD")}"
local changes="$(git log --pretty=format:%H "${baseline}~".."${branch}")"
for change in ${changes}; do
if git notes --ref=release show ${change} &>/dev/null; then
@@ -157,7 +183,7 @@ function find_last_release() {
# Execute the create command:
# Create a new release named "$1" with "$2" as the baseline commit.
-function create_release() {
+function __create_release() {
local force_rc=
if [[ "$1" =~ ^--force_rc=([0-9]*)$ ]]; then
force_rc=${BASH_REMATCH[1]}
@@ -166,23 +192,24 @@ function create_release() {
local release_name="$1"
local baseline="$2"
shift 2
- local origin_branch=$(git_get_branch)
local branch_name="release-${release_name}"
- fetch
+ # Fetch everything from remote repositories to avoid conflicts
+ git fetch -f "${RELEASE_REPOSITORY}"
+ git fetch -f "${RELEASE_REPOSITORY}" 'refs/notes/*:refs/notes/*'
local last_release="$(git rev-parse --verify "${branch_name}" 2>/dev/null || true)"
echo "Creating new release branch ${branch_name} for release ${release_name}"
git checkout -B ${branch_name} ${baseline}
- apply_cherry_picks $@ || {
- git checkout ${origin_branch}
+ __apply_cherry_picks $@ || {
+ git checkout master
git branch -D ${branch_name}
exit 1
}
- setup_git_notes "${force_rc}" "${release_name}" "${last_release}" || {
- git checkout ${origin_branch}
+ __setup_git_notes "${force_rc}" "${release_name}" "${last_release}" || {
+ git checkout master
git branch -D ${branch_name}
exit 1
}
@@ -203,16 +230,16 @@ function create_release() {
# last release candidate or the branch name, e.g. if the branch
# name is release-v1, then the name will be 'v1').
# $3: (optional) Specify the commit for last release.
-function setup_git_notes() {
+function __setup_git_notes() {
local force_rc="$1"
local branch_name="$(git_get_branch)"
# Figure out where we are in release: find the rc, the baseline, cherrypicks
# and release name.
local rc=${force_rc:-1}
- local baseline="$(get_release_baseline)"
+ local baseline="$(get_release_baseline "HEAD")"
local cherrypicks="$(get_cherrypicks "HEAD" "${baseline}")"
- local last_release="${3-$(find_last_release "HEAD" "${baseline}")}"
+ local last_release="${3-$(__find_last_release "${baseline}")}"
local release_name="${2-}"
if [ -n "${last_release}" ]; then
if [ -z "${force_rc}" ]; then
@@ -232,13 +259,14 @@ function setup_git_notes() {
fi
# Edit the release notes
- local tmpfile=$(mktemp ${TMPDIR:-/tmp}/relnotes-XXXXXXXX)
+ local tmpfile=$(mktemp --tmpdir relnotes-XXXXXXXX)
trap "rm -f ${tmpfile}" EXIT
echo "Creating release notes"
# Save the changelog so we compute the relnotes against HEAD.
- git show master:CHANGELOG.md >${tmpfile} 2>/dev/null || echo >${tmpfile}
+ git show master:CHANGELOG.md > "${tmpfile}"
+
# Compute the new release notes
local relnotes="$(create_release_notes "${tmpfile}" "${baseline}" ${cherrypicks})"
@@ -250,66 +278,63 @@ function setup_git_notes() {
local last_relnotes="$(create_release_notes "${tmpfile}")"
git checkout -q "${branch_name}"
local last_savedrelnotes="$(get_release_notes "${last_release}")"
- relnotes="$(merge_release_notes "${branch_name}" "${relnotes}" \
+ relnotes="$(__merge_release_notes "${branch_name}" "${relnotes}" \
"${last_relnotes}" "${last_savedrelnotes}")"
fi
- echo "${RELEASE_NOTE_MESSAGE}" > ${tmpfile}
- echo "# $(get_release_title "${release_name}rc${rc}")" >> ${tmpfile}
- echo >> ${tmpfile}
- echo "${relnotes}" >>"${tmpfile}"
- release_note_editor ${tmpfile} "${branch_name}" || return 1
+
+ echo "${RELEASE_NOTE_MESSAGE}" > "${tmpfile}"
+ echo "# $(get_release_title "${release_name}rc${rc}")" >> "${tmpfile}"
+ echo >> "${tmpfile}"
+ echo "${relnotes}" >> "${tmpfile}"
+
+ __release_note_editor "${tmpfile}" "${branch_name}" || return 1
relnotes="$(cat ${tmpfile})"
- # Add the git notes
- set_release_name "${release_name}" "${rc}"
+ # Add the git notes.
+ git notes --ref=release add -f -m "${release_name}"
+ git notes --ref=release-candidate add -f -m "${rc}"
git notes --ref=release-notes add -f -m "${relnotes}"
- # Clean-up
- rm -f ${tmpfile}
+ # Clean-up.
+ rm -f "${tmpfile}"
trap - EXIT
}
# Force push a ref $2 to repo $1 if exists
-function push_if_exists() {
+function __push_if_exists() {
if git show-ref -q "${2}"; then
git push -f "${1}" "+${2}"
fi
}
# Push release notes refs but also a given ref
-function push_notes_and_ref() {
+function __push_notes_and_ref() {
local ref="$1"
- for repo in ${RELEASE_REPOSITORIES}; do
- push_if_exists "${repo}" "${ref}"
- push_if_exists "${repo}" "refs/notes/release"
- push_if_exists "${repo}" "refs/notes/release-candidate"
- push_if_exists "${repo}" "refs/notes/release-notes"
- push_if_exists "${repo}" "refs/notes/cherrypick"
- done
+ __push_if_exists "${RELEASE_REPOSITORY}" "${ref}"
+ __push_if_exists "${RELEASE_REPOSITORY}" "refs/notes/release"
+ __push_if_exists "${RELEASE_REPOSITORY}" "refs/notes/release-candidate"
+ __push_if_exists "${RELEASE_REPOSITORY}" "refs/notes/release-notes"
+ __push_if_exists "${RELEASE_REPOSITORY}" "refs/notes/cherrypick"
}
# Push the release branch to the release repositories so a release
# candidate can be created.
-function push_release_candidate() {
- push_notes_and_ref "$(get_release_branch)"
+function __push_release_candidate() {
+ __push_notes_and_ref "$(get_release_branch)"
}
# Deletes the release branch after a release or abandoning the release
-function cleanup_branches() {
+function __cleanup_branches() {
local tag_name=$1
- local i
echo "Destroying the release branches for release ${tag_name}"
- # Destroy branch, ignoring if it doesn't exist.
- git branch -D release-${tag_name} &>/dev/null || true
- for i in $RELEASE_REPOSITORIES; do
- git push -f $i :release-${tag_name} &>/dev/null || true
- done
+ git branch -D "release-${tag_name}" &>/dev/null || true
+ git push -f "${RELEASE_REPOSITORY}" ":release-${tag_name}" &>/dev/null || true
}
# Releases the current release branch, creating the necessary tag,
# destroying the release branch, updating the master's CHANGELOG.md
# and pushing everything to GitHub.
-function do_release() {
+function __do_release() {
local branch=$(get_release_branch)
local tag_name=$(get_release_name)
@@ -317,52 +342,55 @@ function do_release() {
read answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
echo "Creating the release commit"
- create_release_commit "${tag_name}"
- set_release_name "${tag_name}"
+ __create_release_commit "${tag_name}"
+ __set_release_name "${tag_name}"
+ git notes --ref=release add -f -m "${tag_name}"
+ git notes --ref=release-candidate remove || true
+
echo "Creating the tag"
git tag ${tag_name}
echo "Cherry-picking CHANGELOG.md modification into master"
git checkout master
+
# Ensuring we are up to date for master
- git pull --rebase $(echo "$MASTER_REPOSITORIES" | cut -d " " -f 1) master
+ git pull --rebase "$MASTER_REPOSITORY" master
+
# We do not cherry-pick because we might have conflict if the baseline
# does not contains the latest CHANGELOG.md file, so trick it.
local changelog_path="$PWD/CHANGELOG.md"
- git show ${branch}:CHANGELOG.md >${changelog_path}
- local tmpfile=$(mktemp ${TMPDIR:-/tmp}/relnotes-XXXXXXXX)
+ git show "${branch}:CHANGELOG.md" > "${changelog_path}"
+ local tmpfile=$(mktemp --tmpdir relnotes-XXXXXXXX)
trap 'rm -f ${tmpfile}' EXIT
- git_commit_msg ${branch} >${tmpfile}
- git add ${changelog_path}
- git commit --no-verify -F ${tmpfile} --no-edit --author "${RELEASE_AUTHOR}"
- rm -f ${tmpfile}
+ git_commit_msg "${branch}" > "${tmpfile}"
+ git add "${changelog_path}"
+ git commit --no-verify -F "${tmpfile}" --no-edit --author "${RELEASE_AUTHOR}"
+ rm -f "${tmpfile}"
trap - EXIT
echo "Pushing the change to remote repositories"
- for i in $MASTER_REPOSITORIES; do
- git push $i +master
- done
- push_notes_and_ref "refs/tags/${tag_name}"
- cleanup_branches ${tag_name}
+ git push "${MASTER_REPOSITORY}" +master
+ __push_notes_and_ref "refs/tags/${tag_name}"
+ __cleanup_branches "${tag_name}"
fi
}
# Abandon the current release, deleting the branch on the local
# repository and on GitHub, discarding all changes
-function abandon_release() {
+function __abandon_release() {
local branch_info=$(get_release_branch)
local tag_name=$(get_release_name)
echo -n "You are about to abandon release ${tag_name}, confirm? [y/N] "
read answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
- git notes --ref=release remove 2>/dev/null || true
- git notes --ref=release-candidate remove 2>/dev/null || true
+ git notes --ref=release remove || true
+ git notes --ref=release-candidate remove || true
git checkout -q master >/dev/null
- cleanup_branches ${tag_name}
+ __cleanup_branches ${tag_name}
fi
}
-function usage() {
+function __usage() {
cat >&2 <<EOF
Usage: $1 command [arguments]
Available commands are:
@@ -418,13 +446,13 @@ shift || usage $progname
case $cmd in
create)
(( $# >= 2 )) || usage $progname
- create_release "$@"
+ __create_release "$@"
;;
push)
- push_release_candidate
+ __push_release_candidate
;;
release)
- do_release
+ __do_release
;;
generate-rc)
force_rc=
@@ -432,12 +460,12 @@ case $cmd in
force_rc=${BASH_REMATCH[1]}
shift 1
fi
- setup_git_notes "${force_rc}"
+ __setup_git_notes "${force_rc}"
;;
abandon)
- abandon_release
+ __abandon_release
;;
*)
- usage $progname
+ __usage $progname
;;
esac
diff --git a/scripts/release/release_test.sh b/scripts/release/release_test.sh
deleted file mode 100755
index dfa9fe856c..0000000000
--- a/scripts/release/release_test.sh
+++ /dev/null
@@ -1,528 +0,0 @@
-#!/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() {
- local name="$1"
- local commit="$2"
- if [[ "$1" =~ ^--force_rc=([0-9]*)$ ]]; then
- name="$2"
- commit="$3"
- fi
- local old_branch=$(git_get_branch)
- ${RELEASE_SCRIPT} create $@ &> $TEST_log \
- || fail "Failed to cut release $name at commit $commit"
- local new_branch=$(git_get_branch)
- assert_equals "release-$name" "$new_branch"
- assert_contains "Created $name.* on branch release-$name." $TEST_log
- get_full_release_notes "release-$name" >$TEST_log
-}
-
-function push() {
- local branch="release-$1"
- git checkout "$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)
- 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
- local 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
- local 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="release-$tag"
- git checkout "$branch"
- local changelog="$(git show master:CHANGELOG.md || true)"
- 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_merge_release_notes() {
- 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.'
- local NEW_RELNOTES="${RELNOTES}"'
- - Attribute error messages related to Android resources are easier
- to understand now.'
- local REPLACEMENT="Test replacement."
-
- assert_equals '<<<<<<< HEAD
-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.
- - Attribute error messages related to Android resources are easier
- to understand now.
-=======
-Test replacement.
->>>>>>> master-merge-notes-1' "$(merge_release_notes master "${NEW_RELNOTES}" "${RELNOTES}" "${REPLACEMENT}")"
-
- assert_equals "${NEW_RELNOTES}" \
- "$(merge_release_notes master "${NEW_RELNOTES}" "${RELNOTES}" "${RELNOTES}")"
-
- assert_equals "${RELNOTES}"'
-<<<<<<< HEAD
- - Attribute error messages related to Android resources are easier
- to understand now.
-=======
- - Merge conflict.
->>>>>>> master-merge-notes-1' "$(merge_release_notes master "${NEW_RELNOTES}" "${RELNOTES}" "${RELNOTES}
- - Merge conflict.")"
-
-}
-
-function test_release_workflow() {
- export EDITOR=true
- # Initial release
- create v0 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e
- expect_log "Release v0rc1"
- expect_log "Initial release"
- # Push the release branch
- push v0
- # Do the initial release
- release v0
-
- CHANGELOG='## Release v0 ('$(date +%Y-%m-%d)')
-
-```
-Baseline: 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e
-```
-
-Initial release.'
- assert_equals "${CHANGELOG}" "$(<CHANGELOG.md)"
-
- # 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}
- create v1 1170dc6055ed0d669275efb1ab1906d2715ad1c3 \
- 0540fdefe2c27605516a772c2a224d579db0a74d
- local header='Release v1rc1 ('$(date +%Y-%m-%d)')
-
-Baseline: 1170dc6055ed0d669275efb1ab1906d2715ad1c3
-
-Cherry picks:
- + 0540fdefe2c27605516a772c2a224d579db0a74d:
- 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
-
- create v1 1170dc6055ed0d669275efb1ab1906d2715ad1c3 \
- 0540fdefe2c27605516a772c2a224d579db0a74d \
- cef25c44bc6c2ae8e5bd649228a9a9c39f057576
- title='Release v1rc2 ('$(date +%Y-%m-%d)')'
- revision_info='Baseline: 1170dc6055ed0d669275efb1ab1906d2715ad1c3
-
-Cherry picks:
- + 0540fdefe2c27605516a772c2a224d579db0a74d:
- Extract version numbers that look like "..._1.2.3_..." from
- BUILD_EMBED_LABEL into Info.plist.
- + cef25c44bc6c2ae8e5bd649228a9a9c39f057576:
- RELNOTES: Attribute error messages related to Android resources
- are easier to understand now.'
- header="${title}
-
-${revision_info}
-
-"
- 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
- title='Release v1 ('$(date +%Y-%m-%d)')'
- CHANGELOG='## '"${title}"'
-
-```
-'"${revision_info}"'
-```
-
-'"${RELNOTES}"'
-
-'"${CHANGELOG}"
- assert_equals "${CHANGELOG}" "$(<CHANGELOG.md)"
-
- # 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 --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
- create v2 2464526
- expect_log "Release v2rc1"
- expect_log "Baseline: 2464526"
- expect_not_log "HOOK-SHOULD-BE-IGNORED"
- # Push
- push v2
- # Abandon it
- 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 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e
-
- 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 1170dc6055ed0d669275efb1ab1906d2715ad1c3 \
- 0540fdefe2c27605516a772c2a224d579db0a74d
- local header='Release v1rc1 ('$(date +%Y-%m-%d)')
-
-Baseline: 1170dc6055ed0d669275efb1ab1906d2715ad1c3
-
-Cherry picks:
- + 0540fdefe2c27605516a772c2a224d579db0a74d:
- 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 cef25c44bc6c2ae8e5bd649228a9a9c39f057576
- header='Release v1rc2 ('$(date +%Y-%m-%d)')
-
-Baseline: 1170dc6055ed0d669275efb1ab1906d2715ad1c3
-
-Cherry picks:
- + 0540fdefe2c27605516a772c2a224d579db0a74d:
- Extract version numbers that look like "..._1.2.3_..." from
- BUILD_EMBED_LABEL into Info.plist.
- + cef25c44bc6c2ae8e5bd649228a9a9c39f057576:
- 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"
diff --git a/scripts/release/relnotes.sh b/scripts/release/relnotes.sh
index d88ef46a2f..c1598c6f50 100755
--- a/scripts/release/relnotes.sh
+++ b/scripts/release/relnotes.sh
@@ -18,6 +18,9 @@ set -eu
# Generate the release notes from the git history.
+SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
+source ${SCRIPT_DIR}/common.sh
+
# It uses the RELNOTES tag in the history to knows the important changes to
# report:
# RELNOTES: indicates a change important the user.
@@ -34,7 +37,7 @@ RELNOTES_DESC=("Incompatible changes" "New features" "Important changes")
# BASELINE is the hash of the baseline commit of the latest release
# CHERRYPICKS is the list of hash of cherry-picked commits of the latest release
# return 1 if there is no initial release
-function get_last_release() {
+function __get_last_release() {
local changelog=$1
[ -f "$changelog" ] || return 1 # No changelog = initial release
local BASELINE_LINE=$(grep -m 1 -n '^Baseline: ' "$changelog") || return 1
@@ -56,7 +59,7 @@ function get_last_release() {
# Now get the list of commit with a RELNOTES since latest release baseline ($1)
# discarding cherry_picks ($2..) and rollbacks. The returned list of commits is
# from the oldest to the newest
-function get_release_notes_commits() {
+function __get_release_notes_commits() {
local baseline=$1
shift
local cherry_picks="$@"
@@ -76,7 +79,7 @@ function get_release_notes_commits() {
# RELNOTES_INC for incompatible changes
# RELNOTES_NEW for new features changes
# RELNOTES for other changes
-function extract_release_note() {
+function __extract_release_note() {
local find_relnote_awk_script="
BEGIN { in_relnote = 0 }
/^$/ { in_relnote = 0 }
@@ -96,19 +99,19 @@ function extract_release_note() {
# Build release notes arrays from a list of commits ($@) and return the release
# note in an array of array.
-function generate_release_notes() {
+function __generate_release_notes() {
for i in "${RELNOTES_TYPES[@]}"; do
eval "RELNOTES_${i}=()"
done
for commit in $@; do
- extract_release_note "${commit}"
+ __extract_release_note "${commit}"
done
}
# Returns the list of release notes in arguments into a list of points in
# a markdown list. The release notes are wrapped to 70 characters so it
# displays nicely in a git history.
-function format_release_notes() {
+function __format_release_notes() {
local i
for (( i=1; $i <= $#; i=$i+1 )); do
local relnote="${!i}"
@@ -120,11 +123,11 @@ function format_release_notes() {
# Create the release notes since commit $1 ($2...${[#]} are the cherry-picks,
# so the commits to ignore.
-function release_notes() {
+function __release_notes() {
local i
- local commits=$(get_release_notes_commits $@)
+ local commits=$(__get_release_notes_commits $@)
local length="${#RELNOTES_TYPES[@]}"
- generate_release_notes "$commits"
+ __generate_release_notes "$commits"
for (( i=0; $i < $length; i=$i+1 )); do
local relnotes_title="${RELNOTES_DESC[$i]}"
local relnotes_type=${RELNOTES_TYPES[$i]}
@@ -133,7 +136,7 @@ function release_notes() {
if (( "${nb_relnotes}" > 0 )); then
echo "${relnotes_title}:"
echo
- format_release_notes "${!relnotes}"
+ __format_release_notes "${!relnotes}"
echo
fi
done
@@ -142,8 +145,8 @@ function release_notes() {
# A wrapper around all the previous function, using the CHANGELOG.md
# file in $1 to compute the last release commit hash.
function create_release_notes() {
- local last_release=$(get_last_release "$1") || \
+ local last_release=$(__get_last_release "$1") || \
{ echo "Initial release."; return 0; }
[ -n "${last_release}" ] || { echo "Initial release."; return 0; }
- release_notes ${last_release}
+ __release_notes ${last_release}
}
diff --git a/scripts/release/relnotes_test.sh b/scripts/release/relnotes_test.sh
deleted file mode 100755
index 22fbb1382a..0000000000
--- a/scripts/release/relnotes_test.sh
+++ /dev/null
@@ -1,267 +0,0 @@
-#!/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; }
-
-### Setup a git repository
-setup_git_repository
-
-### Load the relnotes script
-source ${SCRIPT_DIR}/common.sh || { echo "common.sh not found!" >&2; exit 1; }
-source ${SCRIPT_DIR}/relnotes.sh || { echo "relnotes.sh not found!" >&2; exit 1; }
-
-### Tests method
-
-function set_up() {
- cd ${MASTER_ROOT}
- git checkout -q master
-}
-
-function test_format_release_notes() {
- local expected=' - Lorem ipsus I do not know more of latin than that but I need to
- type random text that spans multiple line so we can test that the
- wrapping of lines works as intended.
- - Another thing I must type.
- - Yet another test that spans across multiple lines so I must type
- some random stuff to test wrapping.'
- local input=("Lorem ipsus I do not know more of latin \
-than that but I need to type random text that spans multiple line so we \
-can test that the wrapping of lines works as intended."
-"Another thing I must type."
-"Yet another test that spans across multiple lines so I must type \
-some random stuff to test wrapping.")
- assert_equals "${expected}" "$(format_release_notes "${input[@]}")"
-}
-
-function test_get_release_notes_commits() {
- # Generated with git log --grep RELNOTES.
- # Only 6d98f6c 53c0748 are removed (rollback).
- commits='01889715e70b55b9d197e546593878f16cdc0f26 957934c40f73e96a4414c6a9efbc165367459b4b 7a99c7f47705bbb4ff8617f4876bc0298093a556 b5ba24a3f3ee0e7da718bf8becac96d691ae2074 c9041bf6f629b1441b6131ca495d8e6d0fb84f42 8232d9ba85b26cb4d10588a39d7a7adafeb5c4af 422c731fbefb098962813b3e0914a9192c72e549 e9029d4613d98c17e05236a0058164bb8787f94b cc44636d2d538bc91e7291ed4607f2bdce356827 06b09ce978eb984bee3a83ed446aab2dce60fa43 29b05c8e6c48b4028a06cd788d833506cce090eb 67944d866d4b74b9c4af51d5097a51fed5a6c30e e8f664780e3089b0af8b267effdec0f3242843ad 6d9fb360b79ec040e423b20b72a9cc3c4bac5b54 f7c992263610c9246a2c81b4e015b9c7f216fd50 5c0e4b2c64e9c9ccf80607ce4d8855ad032c302f 9e387ddc2fbeb6c88400e8b9fcf4e1d1fc600be7 98c92744557330d844ff5c38a28e5419d153ed1f db4d8619023693c97e5afb467737084ccd30b311 a689f2900911039d2c10e6de7d41fbf1bdf31f44 db487ce72207a340589182bbd85b84d1a9375bd1 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e bb59d88448d3365ff3ec168c1431cd86c5a5f02c d3461dba46b50719e238939946048cd1ca12755a cef25c44bc6c2ae8e5bd649228a9a9c39f057576 14d905b5cce9a1bbc2911331809b03679b23dad1'
- assert_equals "$commits" "$(get_release_notes_commits 00d7223 | xargs)"
- assert_equals "$(echo "$commits" | sed 's/957934c[0-9a-f]* //')" \
- "$(get_release_notes_commits 00d7223 957934c | xargs)"
-}
-
-TEST_INC_CHANGE='Incompatible changes:
-
- - Remove deprecated "make var" INCDIR
-
-'
-TEST_NEW_CHANGE='New features:
-
- - added --with_aspect_deps to blaze query, that prints additional
- information about aspects of target when --output is set to {xml,
- proto, record}.
-
-'
-TEST_CHANGE='Important changes:
-
- - Use a default implementation of a progress message, rather than
- defaulting to null for all SpawnActions.
- - Attribute error messages related to Android resources are easier
- to understand now.'
-
-function test_release_notes() {
- assert_equals "$TEST_INC_CHANGE$(echo)$TEST_NEW_CHANGE$(echo)$TEST_CHANGE" \
- "$(release_notes 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e)"
- assert_equals "$TEST_NEW_CHANGE$(echo)$TEST_CHANGE" \
- "$(release_notes 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e \
- bb59d88)"
-}
-
-function test_get_last_release() {
- rm -f ${TEST_TMPDIR}/CHANGELOG.md
- if (get_last_release "${TEST_TMPDIR}/CHANGELOG.md"); then
- fail "Should have returned false for initial release"
- fi
- cat <<EOF >${TEST_TMPDIR}/CHANGELOG.md
-## No release
-EOF
- if (get_last_release "${TEST_TMPDIR}/CHANGELOG.md"); then
- fail "Should have returned false when no release exists"
- fi
- cat <<EOF >${TEST_TMPDIR}/CHANGELOG.md
-## New release
-
-Baseline: 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e
-
-Initial release without cherry-picks
-
-EOF
- assert_equals "965c392ab1d68d5bc23fdef3d86d635ec9d2da8e" \
- "$(get_last_release "${TEST_TMPDIR}/CHANGELOG.md")"
-
-
- mv ${TEST_TMPDIR}/CHANGELOG.md ${TEST_TMPDIR}/CHANGELOG.md.bak
- cat <<EOF >${TEST_TMPDIR}/CHANGELOG.md
-## Cherry-picking bb59d88448d3365ff3ec168c1431cd86c5a5f02c
-
-Baseline: 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e
-
-Cherry picks:
- + bb59d88448d3365ff3ec168c1431cd86c5a5f02c: RELNOTES[INC]: Remove deprecated "make var" INCDIR
-
-$TEST_INC_CHANGE
-EOF
- cat ${TEST_TMPDIR}/CHANGELOG.md.bak >>${TEST_TMPDIR}/CHANGELOG.md
- rm ${TEST_TMPDIR}/CHANGELOG.md.bak
- assert_equals "965c392ab1d68d5bc23fdef3d86d635ec9d2da8e bb59d88448d3365ff3ec168c1431cd86c5a5f02c" \
- "$(get_last_release "${TEST_TMPDIR}/CHANGELOG.md")"
-
- mv ${TEST_TMPDIR}/CHANGELOG.md ${TEST_TMPDIR}/CHANGELOG.md.bak
- cat <<EOF >${TEST_TMPDIR}/CHANGELOG.md
-## Cherry-picking bb59d88448d3365ff3ec168c1431cd86c5a5f02c and
-## 14d905b5cce9a1bbc2911331809b03679b23dad1:
-
-Baseline: 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e
-
-Cherry picks:
- + bb59d88448d3365ff3ec168c1431cd86c5a5f02c:
- RELNOTES[INC]: Remove deprecated "make var" INCDIR
- + 14d905b5cce9a1bbc2911331809b03679b23dad1:
- Add --with_aspect_deps flag to blaze query. This flag should
- produce additional information about aspect dependencies when
- --output is set to {xml, proto}.
-
-$TEST_INC_CHANGE
-$TEST_NEW_CHANGE
-EOF
- cat ${TEST_TMPDIR}/CHANGELOG.md.bak >>${TEST_TMPDIR}/CHANGELOG.md
- rm ${TEST_TMPDIR}/CHANGELOG.md.bak
- assert_equals \
- "965c392ab1d68d5bc23fdef3d86d635ec9d2da8e bb59d88448d3365ff3ec168c1431cd86c5a5f02c 14d905b5cce9a1bbc2911331809b03679b23dad1" \
- "$(get_last_release "${TEST_TMPDIR}/CHANGELOG.md")"
-
-}
-
-function test_create_release_notes() {
- cat <<EOF >${TEST_TMPDIR}/CHANGELOG.md
-## New release
-
-Baseline: 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e
-
-Initial release without cherry-picks
-
-EOF
- assert_equals "$TEST_INC_CHANGE$(echo)$TEST_NEW_CHANGE$(echo)$TEST_CHANGE" \
- "$(create_release_notes ${TEST_TMPDIR}/CHANGELOG.md)"
-
- cat <<'EOF' >${TEST_TMPDIR}/CHANGELOG.md
-## Cherry-picking bb59d88448d3365ff3ec168c1431cd86c5a5f02c
-
-```
-Baseline: 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e
-
-Cherry picks:
- + bb59d88448d3365ff3ec168c1431cd86c5a5f02c:
- RELNOTES[INC]: Remove deprecated "make var" INCDIR
-```
-
-EOF
- cat <<EOF >>${TEST_TMPDIR}/CHANGELOG.md
-$TEST_INC_CHANGE
-EOF
- assert_equals "$TEST_NEW_CHANGE$(echo)$TEST_CHANGE" \
- "$(create_release_notes ${TEST_TMPDIR}/CHANGELOG.md)"
- assert_equals "965c392ab1d68d5bc23fdef3d86d635ec9d2da8e bb59d88448d3365ff3ec168c1431cd86c5a5f02c" \
- "$(get_last_release "${TEST_TMPDIR}/CHANGELOG.md")"
-
- cat <<'EOF' >${TEST_TMPDIR}/CHANGELOG.md
-## Cherry-picking bb59d88448d3365ff3ec168c1431cd86c5a5f02c and
-## 14d905b5cce9a1bbc2911331809b03679b23dad1:
-
-```
-Baseline: 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e
-
-Cherry picks:
- + bb59d88448d3365ff3ec168c1431cd86c5a5f02c:
- RELNOTES[INC]: Remove deprecated "make var" INCDIR
- + 14d905b5cce9a1bbc2911331809b03679b23dad1:
- Add --with_aspect_deps flag to blaze query. This flag should
- produce additional information about aspect dependencies when
- --output is set to {xml, proto}.
-```
-
-EOF
- cat <<EOF >>${TEST_TMPDIR}/CHANGELOG.md
-$TEST_INC_CHANGE
-$TEST_NEW_CHANGE
-EOF
- assert_equals "$TEST_CHANGE" \
- "$(create_release_notes ${TEST_TMPDIR}/CHANGELOG.md)"
-}
-
-function test_create_revision_information() {
- expected='Baseline: 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e
-
-Cherry picks:
- + bb59d88448d3365ff3ec168c1431cd86c5a5f02c:
- RELNOTES[INC]: Remove deprecated "make var" INCDIR
- + 14d905b5cce9a1bbc2911331809b03679b23dad1:
- Add --with_aspect_deps flag to blaze query. This flag should
- produce additional information about aspect dependencies when
- --output is set to {xml, proto}.'
- actual="$(create_revision_information \
- 965c392ab1d68d5bc23fdef3d86d635ec9d2da8e \
- bb59d88448d3365ff3ec168c1431cd86c5a5f02c \
- 14d905b5cce9a1bbc2911331809b03679b23dad1)"
- assert_equals "$expected" "$actual"
-}
-
-function test_extract_release_note_for_pre_copybara_commits() {
- local expected='added --with_aspect_deps to blaze query, that prints additional information about aspects of target when --output is set to {xml, proto, record}.'
- extract_release_note 14d905b5cce9a1bbc2911331809b03679b23dad1
- local actual=$(printf "%s\n" "${RELNOTES_NEW[@]}")
- assert_equals "${expected}" "${actual}"
-}
-
-function test_extract_release_note_for_post_copybara_commits() {
- local expected="'output_groups' and 'instrumented_files' cannot be specified in DefaultInfo."
- extract_release_note e788964a6ebc2c4966456ac74044f4f44a126fe5
- local actual=$(printf "%s\n" "${RELNOTES_[@]}")
- assert_equals "${expected}" "${actual}"
-}
-
-function test_commit_list_no_rollback() {
- git checkout -q 2ea4fa26281175c316651ec50784b820a9f409cf
- local expected='7c672ac643dd59bf4b3e284c6ad019c54545492f
-0257c29f496719bb8414d012334155de6bbefa11
-a9c46e5907be66248b6218ae70e0a1d999c696d5
-78927792c77a6468607e215034c22b0641553f77
-8882192897fa3453d51fe907d19f948215a581af
-2ea4fa26281175c316651ec50784b820a9f409cf'
- local actual="$(get_release_notes_commits 7c605cf6ea9755a06e5abb16a631faac8ebe2937)"
- assert_equals "${expected}" "${actual}"
-}
-
-function test_nonone_relnotes() {
- git checkout -q 2ea4fa26281175c316651ec50784b820a9f409cf
- local expected='Incompatible changes:
-
- - --javabase=<absolute path> and --host_javabase=<absolute path>
- are not supported anymore. If you need this functionality
- java_runtime_suite(name="suite", default=":runtime")
- java_runtime(name="runtime", java_home=<path to the JDK>) is an
- alternative.'
- local actual="$(release_notes 7c605cf6ea9755a06e5abb16a631faac8ebe2937)"
- assert_equals "${expected}" "${actual}"
-}
-
-run_suite "Release notes generation tests"
diff --git a/scripts/release/testenv.sh b/scripts/release/testenv.sh
deleted file mode 100755
index f11c8ab771..0000000000
--- a/scripts/release/testenv.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/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.
-
-# Setting up the environment for Bazel release scripts test.
-
-[ -z "$TEST_SRCDIR" ] && { echo "TEST_SRCDIR not set!" >&2; exit 1; }
-
-# Load the unit-testing framework
-source "${TEST_SRCDIR}/io_bazel/src/test/shell/unittest.bash" || \
- { echo "Failed to source unittest.bash" >&2; exit 1; }
-
-# Commit at which we cut the master to do the test so we always take the git
-# repository in a consistent state.
-: ${MASTER_COMMIT:=7d41d7417fc34f7fa8aac7130a0588b8557e4b57}
-
-# Set-up a copy of the git repository in ${MASTER_ROOT}, pointing master
-# to ${MASTER_COMMIT}.
-function setup_git_repository() {
- local origin_git_root=${TEST_SRCDIR}/io_bazel
- MASTER_ROOT=${TEST_TMPDIR}/git/root
- local orig_dir=${PWD}
- # Create a new origin with the good starting point
- mkdir -p ${MASTER_ROOT}
- cd ${MASTER_ROOT}
- cp -RL ${origin_git_root}/.git .git
- rm -f .git/hooks/* # Do not keep custom hooks
- git reset -q --hard HEAD
- git checkout -q -B master ${MASTER_COMMIT}
- cd ${orig_dir}
-}