Last active
January 29, 2018 18:16
-
-
Save bnielsen1965/20ba9b30962b83abac0e479944fa1803 to your computer and use it in GitHub Desktop.
bash script to generate change logs from git folder with tagged versions.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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