Imported Upstream version 17.16.0
[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:'@@%B' "$LAST_RELEASE"..HEAD      \
111   | awk '/^@@/{p=1}/^@@Translated using Weblate/{p=0}(p){print}'        \
112   | sed '/./{H;$!d};x;/./{s/ *\n */ /g;s/^ *//;s/ *$//;/[^]})!?:.]$/s/$/./;p};d'        \
113   | fold -s -w 66 | sed '/^@@/{s/^../- /;p;d};s/^/  /'
114 }
115
116 function newchangesentry() {
117   echo "-------------------------------------------------------------------"
118   echo "$(date) - $EMAIL"
119   echo ""
120   echo "$(getchanges)"
121   sameVersion || {
122     echo "- version $THIS_RELEASE ($THIS_COMPAT)"
123   }
124   echo ""
125 }
126
127 function is_fast_forward() {
128   git fetch
129   test "$(git rev-list HEAD..origin/$(git name-rev --name-only HEAD) --count)" == "0"
130 }
131
132 is_fast_forward || {
133   Recho "!!!"
134   Recho "!!! Branch is not fast-forward. Pull changes first."
135   Recho "!!!"
136   exit 7
137 }
138
139 git status --porcelain | grep '^[^ ?]' | grep -v "$VERSIONFILE\|$CHANGESFILE" && {
140   Becho "!!! Files other than version and changes are added to the index."
141   Becho "!!! Doing dryrun..."
142   DRYRUN=1
143 }
144
145 # A tag for $LAST_RELEASE must exist!
146 eval $(getversion)
147 git rev-parse -q --verify "$LAST_RELEASE" >/dev/null || {
148   Recho "!!!"
149   Recho "!!! There is no LAST_RELEASE tag '$LAST_RELEASE'. Check manually. "
150   Recho "!!! (git tag -m 'tagging $LAST_RELEASE' '$LAST_RELEASE' ?commit?)"
151   Recho "!!!"
152   exit 8
153 }
154
155 if [ "$DRYRUN" == "1" ]; then
156   newchangesentry
157   sameVersion && {
158     Becho "!!! Version is unchanged at $LAST_RELEASE ($LAST_COMPAT)."
159   }
160   exit 0
161 fi
162
163 # check version file
164 #
165 while true; do
166   # $LAST_RELEASE
167   # $LAST_COMPAT
168   # $THIS_RELEASE
169   # $THIS_COMPAT
170   sameVersion && {
171     newchangesentry
172     Becho "!!! Version is unchanged at $LAST_RELEASE ($LAST_COMPAT)."
173     read -n 1 -p "$(Gecho "(a)bort, (c)ontinue, (P) patch, (M) minor, (I) incompat minor, (e)dit version [e]: ")" RES
174     echo
175     case "${RES:-e}" in
176       [eE]*)
177         Edit $VERSIONFILE
178         eval $(getversion)
179         continue
180         ;;
181       [cC])
182         Becho "!!! Leave $VERSIONFILE untouched"
183         break
184         ;;
185       [P])
186         setversion LIBZYPP_PATCH $(($THIS_PATCH + 1))
187         eval $(getversion)
188         continue
189         ;;
190       [M])
191         setversion LIBZYPP_MINOR $(($THIS_MINOR + 1))
192         setversion LIBZYPP_PATCH 0
193         eval $(getversion)
194         continue
195         ;;
196       [I])
197         setversion LIBZYPP_COMPATMINOR $(($THIS_MINOR + 1))
198         setversion LIBZYPP_MINOR $(($THIS_MINOR + 1))
199         setversion LIBZYPP_PATCH 0
200         eval $(getversion)
201         continue
202         ;;
203       *)
204         errexit "aborted"
205         ;;
206     esac
207   }
208   break
209 done
210
211 # prepare changes file
212 #
213 TMPFILE=$(mktemp)
214 trap " [ -f \"$TMPFILE\" ] && /bin/rm -f -- \"$TMPFILE\" " 0 1 2 3 13 15
215 { newchangesentry; cat $CHANGESFILE; } >$TMPFILE
216
217 RES=e
218 while [ "$RES" == "e" ]; do
219   Edit $TMPFILE
220   echo
221   awk '{print}/^----------/{n=n+1; if ( n == 2 ) exit 0; }' $TMPFILE
222   read -n 1 -p "$(Gecho "(a)bort, (c)ontinue, (s)ubmitt, (e)dit [e]: ")" RES
223   echo
224   case "${RES:-e}" in
225     [eE]*)
226       RES=e
227       ;;
228     [cCsS])
229       Becho "!!! Store new $CHANGESFILE"
230       mv $TMPFILE $CHANGESFILE
231       chmod 644 $CHANGESFILE
232
233       test "$RES" == "s" && {
234         if [ "$LAST_RELEASE" == "$THIS_RELEASE" ]; then
235           git add "$CHANGESFILE" && git commit -m "changes"
236         else
237           Becho "!!! Remember new version $THIS_RELEASE in $VERSIONFILE"
238           sed -i "s/^# LAST RELEASED:.*$/# LAST RELEASED: $THIS_RELEASE ($THIS_COMPAT)/" $VERSIONFILE
239           if git add "$CHANGESFILE" "$VERSIONFILE" \
240                 && git commit -m "changes $THIS_RELEASE ($THIS_COMPAT)" \
241                   && git tag -m "tagging $THIS_RELEASE" "$THIS_RELEASE" HEAD; then
242             Becho "!!!"
243             Becho "!!! Do not forget to push the commit and the tag: $(Gecho git push --tags origin HEAD)"
244             Becho "!!!"
245           else
246             Recho "!!!"
247             Recho "!!! Commit failed. Check manually. (git reset HEAD~)"
248             Recho "!!!"
249             exit 9
250           fi
251         fi
252       }
253       ;;
254     *)
255       Becho "!!! Leave $CHANGESFILE untouched"
256       ;;
257   esac
258 done