new mkChangelog script also creating git version tags
[platform/upstream/libzypp.git] / mkChangelog
1 #! /bin/bash
2
3 function errexit() {
4   exec >&2
5   echo "Error: $@"
6   exit 1
7 }
8
9 function usage() {
10   exec >&2
11   cat <<EOF
12   Usage:
13         $(basename $0) [OPTIONS]
14
15   Options:
16         -h,-?,--help    This page.
17
18 Prepare a new changes file entry preloaded with all commits since the last
19 changes tag and load it into \$EDITOR (vi). If the version file was changed,
20 optionally submitt and tag the new changes. Otherwise simply leave the changes
21 in place.
22
23 Don't forgett to push created tags as well: git push --tags
24
25 EOF
26   exit 1
27 }
28
29 case "$1" in
30   -[hH?]*)
31     usage
32     ;;
33   --help)
34     usage
35     ;;
36 esac
37
38
39 export LC_ALL=""
40 export LANG="en"
41 EDITOR=${EDITOR:-vi}
42
43 EMAIL="$(git config --get user.email)"
44
45 CHANGESFILE=$(ls package/*.changes)
46 test -f "$CHANGESFILE" || errexit "No changes file '$CHANGESFILE'"
47
48 VERSIONFILE="VERSION.cmake"
49 test -f "$VERSIONFILE" || errexit "No version file '$VERSIONFILE'"
50
51 function getversion() {
52   cat "$VERSIONFILE" \
53   | awk '
54   function getnum() {
55     gsub("^[^\"]*\"","")
56     gsub("\".*$","")
57   }
58   /^ *SET *\( *LIBZYPP_MAJOR *"[0-9]+" *\)/       {getnum();major=$0}
59   /^ *SET *\( *LIBZYPP_MINOR *"[0-9]+" *\)/       {getnum();minor=$0}
60   /^ *SET *\( *LIBZYPP_PATCH *"[0-9]+" *\)/       {getnum();patch=$0}
61   /^ *SET *\( *LIBZYPP_COMPATMINOR *"[0-9]+" *\)/ {getnum();compatminor=$0}
62   /^# LAST RELEASED:/                             {gsub("^.*RELEASED: *","");gsub(" +$","");gsub(" +\\(.*","");lastrelease=$0}
63   END {
64     thisrelease = major"."minor"."patch" ("compatminor")"
65     gsub(" \\(.*","",lastrelease)
66     printf "LAST_RELEASE='%s'\n", lastrelease
67     printf "THIS_RELEASE='%s'\n", major"."minor"."patch
68     printf "THIS_COMPAT='%s'\n", compatminor
69   }
70   '
71 }
72 # $LAST_RELEASE
73 # $THIS_RELEASE
74 # $THIS_COMPAT
75 eval $(getversion)
76
77
78 function newchangesentry() {
79   echo "-------------------------------------------------------------------"
80   echo "$(date) - $EMAIL"
81   echo ""
82   echo "$(git log --no-merges --pretty=format:'- %s' "$LAST_RELEASE"..HEAD | grep -v 'po.tar.bz2')"
83   test "$LAST_RELEASE" != "$THIS_RELEASE" && {
84     echo "- version $THIS_RELEASE ($THIS_COMPAT)"
85   }
86   echo ""
87 }
88 TMPFILE=$(mktemp)
89 trap " [ -f \"$TMPFILE\" ] && /bin/rm -f -- \"$TMPFILE\" " 0 1 2 3 13 15
90 { newchangesentry; cat $CHANGESFILE; } >$TMPFILE
91
92 RES=e
93 while [ "$RES" == "e" ]; do
94   $EDITOR $TMPFILE
95   echo
96   awk '{print}/^----------/{n=n+1; if ( n == 2 ) exit 0; }' $TMPFILE
97   read -n 1 -p "(a)bort, (c)ontinue, (s)ubmitt, (e)dit : " RES
98   echo
99   echo
100   case "$RES" in
101     [eE]*)
102       RES=e
103       ;;
104     [cCsS])
105       echo "Store new $CHANGESFILE"
106       mv $TMPFILE $CHANGESFILE
107
108       test "$RES" == "s" && {
109         if [ "$LAST_RELEASE" == "$THIS_RELEASE" ]; then
110           git add "$CHANGESFILE" && git commit -m "changes"
111         else
112           echo "Remember new version $THIS_RELEASE in $VERSIONFILE"
113           sed -i "s/^# LAST RELEASED:.*$/# LAST RELEASED: $THIS_RELEASE ($THIS_COMPAT)/" $VERSIONFILE
114           git add "$CHANGESFILE" "$VERSIONFILE" \
115             && git commit -m "changes $THIS_RELEASE" \
116             && git tag -m "tagging $THIS_RELEASE" "$THIS_RELEASE" HEAD
117           echo ""
118           echo "Do not forget to push the commit and the tag: git push --tags"
119           echo ""
120         fi
121       }
122       ;;
123     *)
124       echo "Leave $CHANGESFILE untouched"
125       ;;
126   esac
127 done