new mkChangelog script also creating git version tags
[platform/upstream/libzypp.git] / mkChangelog
1 #! /bin/bash
2
3 function Recho() { echo -e "\e[0;31m""$@""\e[0m"; }
4 function Gecho() { echo -e "\e[0;32m""$@""\e[0m"; }
5 function Becho() { echo -e "\e[0;34m""$@""\e[0m"; }
6
7 function errexit() {
8   exec >&2
9   Recho "Error: $@"
10   exit 1
11 }
12
13 function usage() {
14   exec >&2
15   cat <<EOF
16   Usage:
17         $(basename $0) [OPTIONS]
18
19   Options:
20         -h,-?,--help    This page.
21         -n              Dryrun.
22
23 Prepare a new changes file entry preloaded with all commits since the last
24 changes tag and load it into \$EDITOR (vi). If the version file was changed,
25 optionally submitt and tag the new changes. Otherwise simply leave the changes
26 in place.
27
28 Don't forgett to push created tags as well: git push --tags
29
30 EOF
31   exit 1
32 }
33
34 DRYRUN=0
35
36 case "$1" in
37   -[n]*)
38     DRYRUN=1
39     ;;
40   -[hH?]*)
41     usage
42     ;;
43   --help)
44     usage
45     ;;
46 esac
47
48
49 export LC_ALL=""
50 export LANG="en"
51 EDITOR=${EDITOR:-vi}
52
53 EMAIL="$(git config --get user.email)"
54
55 CHANGESFILE=$(ls package/*.changes)
56 test -f "$CHANGESFILE" || errexit "No changes file '$CHANGESFILE'"
57
58 VERSIONFILE="VERSION.cmake"
59 test -f "$VERSIONFILE" || errexit "No version file '$VERSIONFILE'"
60
61 function getversion() {
62   cat "$VERSIONFILE" \
63   | awk '
64   function getnum() {
65     gsub("^[^\"]*\"","")
66     gsub("\".*$","")
67   }
68   /^ *SET *\( *LIBZYPP_MAJOR *"[0-9]+" *\)/       {getnum();major=$0}
69   /^ *SET *\( *LIBZYPP_MINOR *"[0-9]+" *\)/       {getnum();minor=$0}
70   /^ *SET *\( *LIBZYPP_PATCH *"[0-9]+" *\)/       {getnum();patch=$0}
71   /^ *SET *\( *LIBZYPP_COMPATMINOR *"[0-9]+" *\)/ {getnum();compatminor=$0}
72   /^# LAST RELEASED:/ {
73       gsub("^.*RELEASED: *","");
74       gsub(" +$","");
75       lastcompat=$0
76       gsub(".*\\(","",lastcompat)
77       gsub("\\).*","",lastcompat)
78       gsub(" +\\(.*","");
79       lastrelease=$0
80   }
81   END {
82     thisrelease = major"."minor"."patch" ("compatminor")"
83     printf "LAST_RELEASE='%s'\n", lastrelease
84     printf "LAST_COMPAT='%s'\n", lastcompat
85     printf "THIS_RELEASE='%s'\n", major"."minor"."patch
86     printf "THIS_COMPAT='%s'\n", compatminor
87   }
88   '
89 }
90
91 function sameVersion() {
92   test "$LAST_RELEASE" == "$THIS_RELEASE" -a "$LAST_COMPAT" == "$THIS_COMPAT"
93 }
94
95 function getchanges() {
96   git log --no-merges --pretty=format:'- %s' "$LAST_RELEASE"..HEAD | grep -v 'po.tar.bz2'
97 }
98
99 function newchangesentry() {
100   echo "-------------------------------------------------------------------"
101   echo "$(date) - $EMAIL"
102   echo ""
103   echo "$(getchanges)"
104   sameVersion || {
105     echo "- version $THIS_RELEASE ($THIS_COMPAT)"
106   }
107   echo ""
108 }
109
110 git status --porcelain | grep '^[^ ]' | grep -v "$VERSIONFILE\|$CHANGESFILE" && {
111   Becho "!!! Files other than version and changes are added to the index."
112   Becho "!!! Doing dryrun..."
113   DRYRUN=1
114 }
115 if [ "$DRYRUN" == "1" ]; then
116   eval $(getversion)
117   newchangesentry
118   sameVersion && {
119     Becho "!!! Version is unchanged at $LAST_RELEASE ($LAST_COMPAT)."
120   }
121   exit 0
122 fi
123
124
125 # check version file
126 #
127 while true; do
128   # $LAST_RELEASE
129   # $LAST_COMPAT
130   # $THIS_RELEASE
131   # $THIS_COMPAT
132   eval $(getversion)
133   sameVersion && {
134     newchangesentry
135     Becho "!!! Version is unchanged at $LAST_RELEASE ($LAST_COMPAT)."
136     read -n 1 -p "$(Gecho "(a)bort, (c)ontinue, (e)dit version: ")" RES
137     echo
138     case "$RES" in
139       [eE]*)
140         $EDITOR $VERSIONFILE
141         continue
142         ;;
143       [cC])
144         Becho "!!! Leave $VERSIONFILE untouched"
145         break
146         ;;
147       *)
148         errexit "aborted"
149         ;;
150     esac
151   }
152   break
153 done
154
155 # prepare changes file
156 #
157 TMPFILE=$(mktemp)
158 trap " [ -f \"$TMPFILE\" ] && /bin/rm -f -- \"$TMPFILE\" " 0 1 2 3 13 15
159 { newchangesentry; cat $CHANGESFILE; } >$TMPFILE
160
161 RES=e
162 while [ "$RES" == "e" ]; do
163   $EDITOR $TMPFILE
164   echo
165   awk '{print}/^----------/{n=n+1; if ( n == 2 ) exit 0; }' $TMPFILE
166   read -n 1 -p "$(Gecho "(a)bort, (c)ontinue, (s)ubmitt, (e)dit : ")" RES
167   echo
168   case "$RES" in
169     [eE]*)
170       RES=e
171       ;;
172     [cCsS])
173       Becho "!!! Store new $CHANGESFILE"
174       mv $TMPFILE $CHANGESFILE
175
176       test "$RES" == "s" && {
177         if [ "$LAST_RELEASE" == "$THIS_RELEASE" ]; then
178           git add "$CHANGESFILE" && git commit -m "changes"
179         else
180           Becho "!!! Remember new version $THIS_RELEASE in $VERSIONFILE"
181           sed -i "s/^# LAST RELEASED:.*$/# LAST RELEASED: $THIS_RELEASE ($THIS_COMPAT)/" $VERSIONFILE
182           git add "$CHANGESFILE" "$VERSIONFILE" \
183             && git commit -m "changes $THIS_RELEASE ($THIS_COMPAT)" \
184             && git tag -m "tagging $THIS_RELEASE" "$THIS_RELEASE" HEAD
185           Becho "!!!"
186           Becho "!!! Do not forget to push the commit and the tag: $(Gecho git push --tags)"
187           Becho "!!!"
188         fi
189       }
190       ;;
191     *)
192       Becho "!!! Leave $CHANGESFILE untouched"
193       ;;
194   esac
195 done