#!/bin/bash
# Generate old-style ChangeLog files from the GIT log. Ultimately we may
# wish to insert this into ChangeLog
footer=false
printdate=true
directory=.
modules=true
quiet=false
moduleoptions=
[ -z "$level" ] && level="="
if [ $(uname) = Darwin ]; then
FMT="fmt"
else
FMT="fmt -ut"
fi
export level
help()
{ echo "Usage: `basename $0` option ... [version][..version] [path ...]"
echo "Options:"
echo " --footer"
echo " --nodate"
echo " --nomodules"
echo " --dir=
"
}
done=false
while [ $done = false ]; do
case "$1" in
--help)
help
exit 0
;;
--footer)
footer=true
shift
;;
--nodate)
printdate=false
shift
moduleoptions+="--nodate"
;;
--quiet)
quiet=true
shift
;;
--wiki)
shift
;;
--nomodules)
modules=false
shift
;;
--dir=*)
directory="`echo $1 | sed 's/--dir=//'`"
shift
modules=false
;;
*) done=true
;;
esac
done
tag="$1"
if [ -z "$tag" ]; then
tag=$(cat VERSION)
fi
# Ensure case-sensitive matching
LANG=C
case "$tag" in
[0-9].[0-9]*.[0-9]*..[0-9].[0-9]*.[0-9]*)
vfrom="$(echo $tag | sed 's/\.\..*//')"
vto="$(echo $tag | sed 's/.*\.\.//')"
;;
V[0-9].[0-9]*.[0-9]*..V[0-9].[0-9]*.[0-9]*)
vfrom="$(echo $tag | sed -e s/V//g -e 's/\.\..*//')"
vto="$(echo $tag | sed -e s/V//g -e 's/.*\.\.//')"
;;
[0-9].[0-9]*.[0-9]*)
vfrom="$tag"
vto=
;;
V[0-9].[0-9]*.[0-9]*)
vfrom="$(echo $tag | sed s/V//)"
vto=
;;
*..*)
vfrom="$(echo $tag | sed 's/\.\..*//')"
vto="$(echo $tag | sed 's/.*\.\.//')"
;;
[0-9a-f]*)
vfrom=$tag
vto=
;;
esac
shift
vvtag()
{ case $1 in
[0-9].[0-9]*.[0-9]*)
echo V$1
;;
*)
echo $1
;;
esac
}
if [ -z "$vto" ]; then
opt=$(vvtag $vfrom)..
else
opt="$(vvtag $vfrom)..$(vvtag $vto)"
fi
cd $directory
if [ "$quiet" = true ]; then
git log "$opt" --pretty=format:"PATCH[%ad]%n%s%n%b" $* | \
grep -q '^[A-Z][A-Z]*:'
exit $?
fi
header ()
{ hdr="$*"
hdr="$*"
eq=`echo $hdr | sed "s/./$level/g"`
echo $hdr
echo $eq
echo
}
(
if [ "$directory" = "." ]; then
if [ -z "$vto" ]; then
header "SWI-Prolog Changelog since version $vfrom"
else
header "SWI-Prolog Changelog from version $vfrom to $vto"
fi
else
header "Package `basename $directory`"
fi
git log "$opt" --pretty=format:"PATCH[%ad]%n%s%n%b" --date-order --simplify-merges $* | awk '
BEGIN { doprint="false";
dateprinted="";
}
/^PATCH[[]/ { date="[" $2 " " $3 " " $5 "]";
doprint="false";
next;
}
/^[A-Z][A-Z]*:/ { if ( dateprinted != date )
{ if ( "'$printdate'" == "true" )
{ printf("%s\n\n", date);
}
dateprinted = date;
}
printf(" * %s\n", $0);
doprint="true";
next;
}
/.*/ { if ( doprint == "true" )
{ if ( $0 != "" )
{ printf(" %s\n", $0);
} else
{ printf("\n");
}
}
next;
}
' ) | $FMT
# Include submodules
mtag()
{ git ls-tree $1 $2 | awk '{print $3}'
}
if [ "$modules" = true ]; then
level="-"
echo
for d in `git submodule -q foreach pwd`; do
mfrom=$(mtag $(vvtag $vfrom) $d)
if [ ! -z "$vto" ]; then
mto=$(mtag $(vvtag $vto) $d)
else
mto=$(mtag HEAD $d)
fi
if [ ! -z "$mfrom" -a ! -z "$mto" ]; then
subopts=$mfrom..$mto
if $0 --dir="$d" --quiet "$subopts"; then
echo
$0 --dir="$d" $moduleoptions "$subopts"
# else
# echo "Package `basename $d`: no changes"
fi
fi
done
fi
if [ "$footer" = true ]; then
header VERSION $tag
fi