fixup Fix to build with libxml 2.12.x (fixes #505)
[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
52 function Edit()
53 {
54   local FILE="$1"
55   vi "$FILE"
56   sed -i 's/ \+$//' "$FILE"
57 }
58
59 EMAIL="$(git config --get user.email)"
60
61 CHANGESFILE=$(ls package/*.changes)
62 test -f "$CHANGESFILE" || errexit "No changes file '$CHANGESFILE'"
63
64 VERSIONFILE="VERSION.cmake"
65 test -f "$VERSIONFILE" || errexit "No version file '$VERSIONFILE'"
66
67 function getversion() {
68   cat "$VERSIONFILE" \
69   | awk '
70   function getnum() {
71     gsub("^[^\"]*\"","")
72     gsub("\".*$","")
73   }
74   /^ *SET *\( *LIBZYPP_MAJOR *"[0-9]+" *\)/       {getnum();major=$0}
75   /^ *SET *\( *LIBZYPP_MINOR *"[0-9]+" *\)/       {getnum();minor=$0}
76   /^ *SET *\( *LIBZYPP_PATCH *"[0-9]+" *\)/       {getnum();patch=$0}
77   /^ *SET *\( *LIBZYPP_COMPATMINOR *"[0-9]+" *\)/ {getnum();compatminor=$0}
78   /^# LAST RELEASED:/ {
79       gsub("^.*RELEASED: *","");
80       gsub(" +$","");
81       lastcompat=$0
82       gsub(".*\\(","",lastcompat)
83       gsub("\\).*","",lastcompat)
84       gsub(" +\\(.*","");
85       lastrelease=$0
86   }
87   END {
88     thisrelease = major"."minor"."patch" ("compatminor")"
89     printf "LAST_RELEASE='%s'\n", lastrelease
90     printf "LAST_COMPAT='%s'\n", lastcompat
91     printf "THIS_RELEASE='%s'\n", major"."minor"."patch
92     printf "THIS_COMPAT='%s'\n", compatminor
93     printf "THIS_MINOR='%s'\n", minor
94     printf "THIS_PATCH='%s'\n", patch
95   }
96   '
97 }
98
99 function setversion() {
100   local KEY="$1"
101   local VAL="$2"
102   sed -i "s/^ *SET *( *${KEY} .*/SET(${KEY} \"${VAL}\")/" "$VERSIONFILE"
103 }
104
105 function sameVersion() {
106   test "$LAST_RELEASE" == "$THIS_RELEASE" -a "$LAST_COMPAT" == "$THIS_COMPAT"
107 }
108
109 function getchanges() {
110   git log --no-merges --pretty=format:'- %s' "$LAST_RELEASE"..HEAD | grep -v 'po.tar.bz2\|Translated using Weblate'
111 }
112
113 function newchangesentry() {
114   echo "-------------------------------------------------------------------"
115   echo "$(date) - $EMAIL"
116   echo ""
117   echo "$(getchanges)"
118   sameVersion || {
119     echo "- version $THIS_RELEASE ($THIS_COMPAT)"
120   }
121   echo ""
122 }
123
124 function is_fast_forward() {
125   git fetch
126   test "$(git rev-list HEAD..origin/$(git name-rev --name-only HEAD) --count)" == "0"
127 }
128
129 is_fast_forward || {
130   Recho "!!!"
131   Recho "!!! Branch is not fast-forward. Pull changes first."
132   Recho "!!!"
133   exit 7
134 }
135
136 git status --porcelain | grep '^[^ ?]' | grep -v "$VERSIONFILE\|$CHANGESFILE" && {
137   Becho "!!! Files other than version and changes are added to the index."
138   Becho "!!! Doing dryrun..."
139   DRYRUN=1
140 }
141
142 # A tag for $LAST_RELEASE must exist!
143 eval $(getversion)
144 git rev-parse -q --verify "$LAST_RELEASE" >/dev/null || {
145   Recho "!!!"
146   Recho "!!! There is no LAST_RELEASE tag '$LAST_RELEASE'. Check manually. "
147   Recho "!!! (git tag -m 'tagging $LAST_RELEASE' '$LAST_RELEASE' ?commit?)"
148   Recho "!!!"
149   exit 8
150 }
151
152 if [ "$DRYRUN" == "1" ]; then
153   newchangesentry
154   sameVersion && {
155     Becho "!!! Version is unchanged at $LAST_RELEASE ($LAST_COMPAT)."
156   }
157   exit 0
158 fi
159
160 # check version file
161 #
162 while true; do
163   # $LAST_RELEASE
164   # $LAST_COMPAT
165   # $THIS_RELEASE
166   # $THIS_COMPAT
167   sameVersion && {
168     newchangesentry
169     Becho "!!! Version is unchanged at $LAST_RELEASE ($LAST_COMPAT)."
170     read -n 1 -p "$(Gecho "(a)bort, (c)ontinue, (P) patch, (M) minor, (I) incompat minor, (e)dit version [e]: ")" RES
171     echo
172     case "${RES:-e}" in
173       [eE]*)
174         Edit $VERSIONFILE
175         eval $(getversion)
176         continue
177         ;;
178       [cC])
179         Becho "!!! Leave $VERSIONFILE untouched"
180         break
181         ;;
182       [P])
183         setversion LIBZYPP_PATCH $(($THIS_PATCH + 1))
184         eval $(getversion)
185         continue
186         ;;
187       [M])
188         setversion LIBZYPP_MINOR $(($THIS_MINOR + 1))
189         setversion LIBZYPP_PATCH 0
190         eval $(getversion)
191         continue
192         ;;
193       [I])
194         setversion LIBZYPP_COMPATMINOR $(($THIS_MINOR + 1))
195         setversion LIBZYPP_MINOR $(($THIS_MINOR + 1))
196         setversion LIBZYPP_PATCH 0
197         eval $(getversion)
198         continue
199         ;;
200       *)
201         errexit "aborted"
202         ;;
203     esac
204   }
205   break
206 done
207
208 # prepare changes file
209 #
210 TMPFILE=$(mktemp)
211 trap " [ -f \"$TMPFILE\" ] && /bin/rm -f -- \"$TMPFILE\" " 0 1 2 3 13 15
212 { newchangesentry; cat $CHANGESFILE; } >$TMPFILE
213
214 RES=e
215 while [ "$RES" == "e" ]; do
216   Edit $TMPFILE
217   echo
218   awk '{print}/^----------/{n=n+1; if ( n == 2 ) exit 0; }' $TMPFILE
219   read -n 1 -p "$(Gecho "(a)bort, (c)ontinue, (s)ubmitt, (e)dit [e]: ")" RES
220   echo
221   case "${RES:-e}" in
222     [eE]*)
223       RES=e
224       ;;
225     [cCsS])
226       Becho "!!! Store new $CHANGESFILE"
227       mv $TMPFILE $CHANGESFILE
228       chmod 644 $CHANGESFILE
229
230       test "$RES" == "s" && {
231         if [ "$LAST_RELEASE" == "$THIS_RELEASE" ]; then
232           git add "$CHANGESFILE" && git commit -m "changes"
233         else
234           Becho "!!! Remember new version $THIS_RELEASE in $VERSIONFILE"
235           sed -i "s/^# LAST RELEASED:.*$/# LAST RELEASED: $THIS_RELEASE ($THIS_COMPAT)/" $VERSIONFILE
236           if git add "$CHANGESFILE" "$VERSIONFILE" \
237                 && git commit -m "changes $THIS_RELEASE ($THIS_COMPAT)" \
238                   && git tag -m "tagging $THIS_RELEASE" "$THIS_RELEASE" HEAD; then
239             Becho "!!!"
240             Becho "!!! Do not forget to push the commit and the tag: $(Gecho git push --tags origin HEAD)"
241             Becho "!!!"
242           else
243             Recho "!!!"
244             Recho "!!! Commit failed. Check manually. (git reset HEAD~)"
245             Recho "!!!"
246             exit 9
247           fi
248         fi
249       }
250       ;;
251     *)
252       Becho "!!! Leave $CHANGESFILE untouched"
253       ;;
254   esac
255 done