#!/bin/bash

# Copyright (c) 2015 Cisco and/or its affiliates.
# 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.

CHANGELOG=deb/debian/changelog
DIST=unstable
FIRST=1

print_changelog_item() {
	DATE=$(git log -1 --format=%cD ${TAG})
	DEBFULLNAME=$(git log -1 --format=%an ${TAG})
	DEBEMAIL=$(git log -1 --format=%ae ${TAG})

	if [ ${FIRST} = 0 ]; then echo >> ${CHANGELOG}; fi
	FIRST=0

	echo "vpp (${VER}) ${DIST}; urgency=low" >> ${CHANGELOG}
	echo >> ${CHANGELOG}
	echo "${DESC}" >> ${CHANGELOG}
	echo >> ${CHANGELOG}
	echo " -- ${DEBFULLNAME} <${DEBEMAIL}>  ${DATE}" >> ${CHANGELOG}
}

VER=$(scripts/version)
TAG=HEAD
ADDS=$(echo ${VER} | sed -e 's/~.*//'| cut -s -d- -f2)

rm -f ${CHANGELOG}

if [ -n "${ADDS}" ]; then
	DESC="  * includes ${ADDS} commits after $(echo ${VER}| cut -d- -f1) release"
	print_changelog_item
fi

for TAG in $(git tag -l 'v[0-9][0-9].[0-9][0-9]' | sort -r ); do
	VER=$(echo ${TAG}| sed -e 's/^v//')
	DESC=$(git tag -l -n20 ${TAG} | tail -n+2 | sed -e 's/^ */  /')
	print_changelog_item
done
