Skip to content

Instantly share code, notes, and snippets.

@bnielsen1965
Last active January 29, 2018 18:16
Show Gist options
  • Save bnielsen1965/20ba9b30962b83abac0e479944fa1803 to your computer and use it in GitHub Desktop.
Save bnielsen1965/20ba9b30962b83abac0e479944fa1803 to your computer and use it in GitHub Desktop.
bash script to generate change logs from git folder with tagged versions.
#!/usr/bin/env bash
#
# git change log generator
# https://gist.github.com/bnielsen1965
#
# THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
# EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
# PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
# PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
# NECESSARY SERVICING, REPAIR OR CORRECTION.
#
# default parameters
GIT_PROJECT_PATH=
CHANGE_LOG_PATH=
PACKAGE=`basename $0`
# display usage help
function Usage()
{
cat <<-ENDOFMESSAGE
$PACKAGE - Generate a change log file from a git project directory.
$PACKAGE [path to project] [path to change log]
arguments:
path to project - the path to the directory that contains the git project
path to change log - the path and filename to use for the generated change log
NOTE: if the path to change log is not specified then the git project directory name and present working path are used.
ENDOFMESSAGE
exit
}
# die with message
function Die()
{
echo "$*"
Usage
exit 1
}
# process command line arguments into values to use
function ProcessArguments() {
# separate options from arguments
while [ $# -gt 0 ]
do
opt=$1
shift
case ${opt} in
-h|--help)
Usage;;
*)
if [ "${opt:0:1}" = "-" ]; then
Die "${opt}: unknown option."
fi
ARGV+=(${opt});;
esac
done
if [ ${#ARGV[@]} -gt 0 ]; then
export GIT_PROJECT_PATH=${ARGV[0]}
fi
if [ ${#ARGV[@]} -gt 1 ]; then
export CHANGE_LOG_PATH=${ARGV[1]}
fi
}
# build environment
function BuildEnvironment()
{
if [ ! -d "$GIT_PROJECT_PATH" ]; then
Die "Project path $GIT_PROJECT_PATH does not exists."
fi
CWD=`pwd`
if [ -z "$CHANGE_LOG_PATH" ]; then
PROJECT_NAME=`readlink -f $GIT_PROJECT_PATH | sed 's#.*/##'`
CHANGE_LOG_PATH=`readlink -f "$CWD/$PROJECT_NAME.changes"`
fi
}
function ChangeLog()
{
cd $GIT_PROJECT_PATH
CHANGES=`git log --oneline --decorate --color --pretty=format:"%d %s"`
echo "$CHANGES" | while read line
do
if echo "$line" | grep -qP '^\(.*tag:\s+v?[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+)?[^)]*\)'; then
echo ""
echo "$line" | sed -rn "s/^\(.*tag:\s+(v?[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+)?).*$/\1/p"
echo "$line" | sed -rn "s/^\(.*tag:\s+v?[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+)?[^\)]*\)\s*(.*)$/- \2/p"
else
echo "- $line"
fi
done
cd $CWD
}
# prepare to execute command
ProcessArguments $*
BuildEnvironment
LOG=$(ChangeLog)
echo "$PROJECT_NAME change log" > "$CHANGE_LOG_PATH"
echo "generated" $(date) >> "$CHANGE_LOG_PATH"
echo "$LOG" >> "$CHANGE_LOG_PATH"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment