backup mkChangelog
[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 function is_fast_forward() {
111   git fetch
112   test "$(git rev-list HEAD..origin/$(git name-rev --name-only HEAD) --count)" == "0"
113 }
114
115 is_fast_forward || {
116   Recho "!!!"
117   Recho "!!! Branch is not fast-forward. Pull changes first."
118   Recho "!!!"
119   exit 7
120 }
121
122 git status --porcelain | grep '^[^ ?]' | grep -v "$VERSIONFILE\|$CHANGESFILE" && {
123   Becho "!!! Files other than version and changes are added to the index."
124   Becho "!!! Doing dryrun..."
125   DRYRUN=1
126 }
127
128 # A tag for $LAST_RELEASE must exist!
129 eval $(getversion)
130 test -e ".git/refs/tags/$LAST_RELEASE" || {
131   Recho "!!!"
132   Recho "!!! There is no LAST_RELEASE tag '$LAST_RELEASE'. Check manually. "
133   Recho "!!! (git tag -m 'tagging $LAST_RELEASE' '$LAST_RELEASE' ?commit?)"
134   Recho "!!!"
135   exit 8
136 }
137
138 if [ "$DRYRUN" == "1" ]; then
139   newchangesentry
140   sameVersion && {
141     Becho "!!! Version is unchanged at $LAST_RELEASE ($LAST_COMPAT)."
142   }
143   exit 0
144 fi
145
146 # check version file
147 #
148 while true; do
149   # $LAST_RELEASE
150   # $LAST_COMPAT
151   # $THIS_RELEASE
152   # $THIS_COMPAT
153   sameVersion && {
154     newchangesentry
155     Becho "!!! Version is unchanged at $LAST_RELEASE ($LAST_COMPAT)."
156     read -n 1 -p "$(Gecho "(a)bort, (c)ontinue, (e)dit version [e]: ")" RES
157     echo
158     case "${RES:-e}" in
159       [eE]*)
160         $EDITOR $VERSIONFILE
161         eval $(getversion)
162         continue
163         ;;
164       [cC])
165         Becho "!!! Leave $VERSIONFILE untouched"
166         break
167         ;;
168       *)
169         errexit "aborted"
170         ;;
171     esac
172   }
173   break
174 done
175
176 # prepare changes file
177 #
178 TMPFILE=$(mktemp)
179 trap " [ -f \"$TMPFILE\" ] && /bin/rm -f -- \"$TMPFILE\" " 0 1 2 3 13 15
180 { newchangesentry; cat $CHANGESFILE; } >$TMPFILE
181
182 RES=e
183 while [ "$RES" == "e" ]; do
184   $EDITOR $TMPFILE
185   echo
186   awk '{print}/^----------/{n=n+1; if ( n == 2 ) exit 0; }' $TMPFILE
187   read -n 1 -p "$(Gecho "(a)bort, (c)ontinue, (s)ubmitt, (e)dit [e]: ")" RES
188   echo
189   case "${RES:-e}" in
190     [eE]*)
191       RES=e
192       ;;
193     [cCsS])
194       Becho "!!! Store new $CHANGESFILE"
195       mv $TMPFILE $CHANGESFILE
196       chmod 644 $CHANGESFILE
197
198       test "$RES" == "s" && {
199         if [ "$LAST_RELEASE" == "$THIS_RELEASE" ]; then
200           git add "$CHANGESFILE" && git commit -m "changes"
201         else
202           Becho "!!! Remember new version $THIS_RELEASE in $VERSIONFILE"
203           sed -i "s/^# LAST RELEASED:.*$/# LAST RELEASED: $THIS_RELEASE ($THIS_COMPAT)/" $VERSIONFILE
204           if git add "$CHANGESFILE" "$VERSIONFILE" \
205                 && git commit -m "changes $THIS_RELEASE ($THIS_COMPAT)" \
206                   && git tag -m "tagging $THIS_RELEASE" "$THIS_RELEASE" HEAD; then
207             Becho "!!!"
208             Becho "!!! Do not forget to push the commit and the tag: $(Gecho git push --tags origin HEAD)"
209             Becho "!!!"
210           else
211             Recho "!!!"
212             Recho "!!! Commit failed. Check manually. (git reset HEAD~)"
213             Recho "!!!"
214             exit 9
215           fi
216         fi
217       }
218       ;;
219     *)
220       Becho "!!! Leave $CHANGESFILE untouched"
221       ;;
222   esac
223 done