#!/bin/sh
#  Licensed to the Apache Software Foundation (ASF) under one or more
#  contributor license agreements.  See the NOTICE file distributed with
#  this work for additional information regarding copyright ownership.
#  The ASF licenses this file to You 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.

function fail {
	echo "$1"
	exit 1
}

function getProjectVersionFromPom {
	cat << EOF | xmllint --noent --shell pom.xml | grep content | cut -f2 -d=
setns pom=http://maven.apache.org/POM/4.0.0
xpath /pom:project/pom:version/text()
EOF
}

if [ "$1" = "--help" ] ; then
	echo "
Usage: $0 [--help] [version]

Retrieves the release notes for the next release of Apache Wicket,
and merges this into the CHANGELOG file.

  version
      optional version number to retrieve the release notes for

  --help
      shows this help

"
	exit 0
fi

if [ ! -z "$1" ] ; then
	current_version="$1"
	major_version=$(expr $current_version : '\(.*\)\..*\..*\-.*')
	minor_version=$(expr $current_version : '.*\.\(.*\)\..*\-.*')
	bugfix_version=$(expr $current_version : '.*\..*\.\(.*\)-.*')
	milestone_version=$(expr $current_version : '.*\..*-\(.*\)')
	version="$major_version.$minor_version.0-$milestone_version"
	previous_version="$major_version.$(expr $minor_version - 1).0"
else
	current_version=$(getProjectVersionFromPom)
	major_version=$(expr $current_version : '\(.*\)\..*\..*\-.*')
	minor_version=$(expr $current_version : '.*\.\(.*\)\..*\-.*')
	bugfix_version=$(expr $current_version : '.*\..*\.\(.*\)-.*')
	version="$major_version.$minor_version.0"
	previous_version="$major_version.$(expr $minor_version - 1).0"
fi

echo "
Apache Wicket release notes generator
=====================================
This tool retrieves the release notes for the upcoming release from JIRA
and merges this with the existing CHANGELOG in a text format.

Version to retrieve the release notes from: $version

Press <enter> to continue \c"

read

git status --porcelain CHANGELOG-$major_version.x | grep -q "CHANGELOG-$major_version.x"
if [ $? -eq 0 ] ; then
	fail "You already have changes in the CHANGELOG-$major_version.x
"
fi

grep -q "$version\$" CHANGELOG-$major_version.x
if [ $? -eq 0 ] ; then
	fail "You already have added release notes for this version to the changelog.
"
fi


echo "
Extracting JIRA Release notes -- making web requests"
echo "  - determining JIRA version id for $version: \c"
jira_project_id=12310561
jira_version_id=$( \
	curl -s https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=$jira_project_id \
	| xmllint --noout --noblanks --html --xpath "string(//select[@id=\"version_select\"]/option[translate(normalize-space(text()), ' ', '')=\"$version\"]/@value)" - 2>/dev/null \
	)

re='^[0-9]+$'
if ! [[ $jira_version_id =~ $re ]] ; then
	echo "ERROR"
	echo "
Unable to retrieve the version ID from JIRA: received '$jira_version_id'" >&2
	exit 1
fi

echo "$jira_version_id"

echo "  - retrieving text release notes: \c"
curl -s "https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=$jira_project_id&version=$jira_version_id&styleName=Text&Create=Create" \
	|  xmllint --noout --noblanks --html --xpath "string(//textarea)" - 2>/dev/null | cat -s | awk '{ if ($0 ~ /^\*\* / ) {
    printf( "%s\n\n", $0);
} else {
    printf( "%s\n", $0 );
}
}' > /tmp/release-notes-$version.txt

echo "done"

echo "  - merging release notes into changelog: \c"

echo "This file contains all changes done in releases for Apache Wicket $major_version.x.

=======================================================================
$(cat /tmp/release-notes-$version.txt)

=======================================================================
$(tail -n +4 CHANGELOG-$major_version.x)
" > /tmp/changelog-$version.txt
cp /tmp/changelog-$version.txt CHANGELOG-$major_version.x

echo "done
"
git diff

echo ""

git add CHANGELOG-$major_version.x
git commit -m "Added CHANGELOG for release $version"

echo "
The CHANGELOG-$major_version.x file has been updated and committed.

To revert the changes to the CHANGELOG:

    git reset HEAD^ --hard

Have fun!
"
