1#!/bin/sh 2 3usage() 4{ 5 echo "Usage: $0 [--spec] <target>" 6 exit 2 7} 8 9test -z "$1" && usage 10 11if [ "$1" = "--spec" ] ; then 12 spec_format=1 13 shift 14 test -z "$1" && usage 15fi 16 17TARGET=$1 18 19GIT_DIR=`git rev-parse --git-dir 2>/dev/null` 20 21test -z "$GIT_DIR" && usage 22 23 24export GIT_DIR 25export GIT_PAGER="" 26export PAGER="" 27 28 29mkchlog() 30{ 31 target=$1 32 format=$2 33 34 prev_tag="" 35 36 for tag in `git tag -l ${target}-'*'` ; do 37 obj=`git cat-file tag $tag | awk '/^object /{print $2}'` 38 base=`git merge-base $obj HEAD` 39 if [ -z "$base" -o "$base" != $obj ] ; then 40 continue 41 fi 42 all_vers="$prev_tag$tag $all_vers" 43 prev_tag=$tag.. 44 done 45 46 if [ -z "$prev_tag" ] ; then 47 all_vers=HEAD 48 else 49 all_vers="${prev_tag}HEAD $all_vers" 50 fi 51 52 for ver in $all_vers ; do 53 log_out=`git log $ver -- $target` 54 if [ -z "$log_out" ] ; then 55 continue 56 fi 57 ver_name=`echo $ver | sed -e 's/^.*\.\.//'` 58 echo "" 59 echo "** Version: $ver_name" 60 echo "" 61 git log --no-merges "${format}" $ver -- $target 62 prev_t=$tag.. 63 done 64} 65 66 67if [ -z "$spec_format" ] ; then 68 mkchlog $TARGET --pretty=format:"%ad %an%n%H%n%n* %s%n" \ 69 | sed -e 's/^\* /\t* /' 70else 71 echo "%changelog" 72 mkchlog $TARGET --pretty=format:"- %ad %an: %s" 73 echo "" 74fi 75