Bazel release notes creation

This script uses the RELNOTES: tag (RELNOTES for a
simple change, RELNOTES[NEW] for a new feature,
RELNOTES[INC] for an incompatible change) to create
the CHANGELOG.md file.

--
Change-Id: If457a0a85f4a9ceddf822393d0aeb8b60c54136b
Reviewed-on: https://bazel-review.googlesource.com/#/c/1583/
MOS_MIGRATED_REVID=99020942
diff --git a/scripts/release/relnotes_test.sh b/scripts/release/relnotes_test.sh
new file mode 100755
index 0000000..32d5711
--- /dev/null
+++ b/scripts/release/relnotes_test.sh
@@ -0,0 +1,204 @@
+#!/bin/bash
+
+# Copyright 2015 Google Inc. 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}/relnotes.sh || { echo "relnotes.sh not found!" >&2; exit 1; }
+
+### Tests method
+
+function set_up() {
+  cd ${MASTER_ROOT}
+}
+
+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="0188971 957934c 7a99c7f b5ba24a c9041bf 8232d9b 422c731 e9029d4 \
+cc44636 06b09ce 29b05c8 67944d8 e8f6647 6d9fb36 f7c9922 5c0e4b2 9e387dd \
+98c9274 db4d861 a689f29 db487ce 965c392 bb59d88 d3461db cef25c4 14d905b"
+  assert_equals "$commits" "$(get_release_notes_commits 00d7223 | xargs)"
+  assert_equals "$(echo "$commits" | sed 's/957934c //')" \
+      "$(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 965c392)"
+  assert_equals "$TEST_NEW_CHANGE$(echo)$TEST_CHANGE" \
+      "$(release_notes 965c392 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: 965c392
+
+Initial release without cherry-picks
+
+EOF
+  assert_equals "965c392" \
+      "$(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 bb59d88
+
+Baseline: 965c392
+   + bb59d88: 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 "965c392 bb59d88" \
+      "$(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 bb59d88 and 14d905b
+
+Baseline: 965c392
+   + bb59d88: RELNOTES[INC]: Remove deprecated "make var" INCDIR
+   + 14d905b: 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 "965c392 bb59d88 14d905b" \
+      "$(get_last_release "${TEST_TMPDIR}/CHANGELOG.md")"
+
+}
+
+function test_create_release_notes() {
+  cat <<EOF >${TEST_TMPDIR}/CHANGELOG.md
+## New release
+
+Baseline: 965c392
+
+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 bb59d88
+
+```
+Baseline: 965c392
+   + bb59d88: 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 "965c392 bb59d88" \
+      "$(get_last_release "${TEST_TMPDIR}/CHANGELOG.md")"
+
+  cat <<'EOF' >${TEST_TMPDIR}/CHANGELOG.md
+## Cherry-picking bb59d88 and 14d905b
+
+```
+Baseline: 965c392
+   + bb59d88: RELNOTES[INC]: Remove deprecated "make var" INCDIR
+   + 14d905b: 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: 965c392
+   + bb59d88: RELNOTES[INC]: Remove deprecated "make var" INCDIR
+   + 14d905b: Add --with_aspect_deps flag to blaze query. This flag
+              should produce additional information about aspect
+              dependencies when --output is set to {xml, proto}.'
+   assert_equals "$expected" \
+		 "$(create_revision_information 965c392 bb59d88 14d905b)"
+}
+
+run_suite "Release notes generation tests"