X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Flibzypp.git;a=blobdiff_plain;f=mkChangelog;h=52cb498d6c1e988f0dd1092a32a3a4cac0a1af99;hp=8e9db6e02dd8fcc6a1930096340e00f12e6d8388;hb=HEAD;hpb=ea4a12c39cd467929e191b1465ebcf00dc373c8b diff --git a/mkChangelog b/mkChangelog index 8e9db6e..6d4303e 100755 --- a/mkChangelog +++ b/mkChangelog @@ -1,8 +1,12 @@ #! /bin/bash +function Recho() { echo -e "\e[0;31m""$@""\e[0m"; } +function Gecho() { echo -e "\e[0;32m""$@""\e[0m"; } +function Becho() { echo -e "\e[0;34m""$@""\e[0m"; } + function errexit() { exec >&2 - echo "Error: $@" + Recho "Error: $@" exit 1 } @@ -14,6 +18,7 @@ function usage() { Options: -h,-?,--help This page. + -n Dryrun. Prepare a new changes file entry preloaded with all commits since the last changes tag and load it into \$EDITOR (vi). If the version file was changed, @@ -26,7 +31,12 @@ EOF exit 1 } +DRYRUN=0 + case "$1" in + -[n]*) + DRYRUN=1 + ;; -[hH?]*) usage ;; @@ -38,7 +48,13 @@ esac export LC_ALL="" export LANG="en" -EDITOR=${EDITOR:-vi} + +function Edit() +{ + local FILE="$1" + vi "$FILE" + sed -i 's/ \+$//' "$FILE" +} EMAIL="$(git config --get user.email)" @@ -59,69 +75,184 @@ function getversion() { /^ *SET *\( *LIBZYPP_MINOR *"[0-9]+" *\)/ {getnum();minor=$0} /^ *SET *\( *LIBZYPP_PATCH *"[0-9]+" *\)/ {getnum();patch=$0} /^ *SET *\( *LIBZYPP_COMPATMINOR *"[0-9]+" *\)/ {getnum();compatminor=$0} - /^# LAST RELEASED:/ {gsub("^.*RELEASED: *","");gsub(" +$","");gsub(" +\\(.*","");lastrelease=$0} + /^# LAST RELEASED:/ { + gsub("^.*RELEASED: *",""); + gsub(" +$",""); + lastcompat=$0 + gsub(".*\\(","",lastcompat) + gsub("\\).*","",lastcompat) + gsub(" +\\(.*",""); + lastrelease=$0 + } END { thisrelease = major"."minor"."patch" ("compatminor")" - gsub(" \\(.*","",lastrelease) printf "LAST_RELEASE='%s'\n", lastrelease + printf "LAST_COMPAT='%s'\n", lastcompat printf "THIS_RELEASE='%s'\n", major"."minor"."patch printf "THIS_COMPAT='%s'\n", compatminor + printf "THIS_MINOR='%s'\n", minor + printf "THIS_PATCH='%s'\n", patch } ' } -# $LAST_RELEASE -# $THIS_RELEASE -# $THIS_COMPAT -eval $(getversion) +function setversion() { + local KEY="$1" + local VAL="$2" + sed -i "s/^ *SET *( *${KEY} .*/SET(${KEY} \"${VAL}\")/" "$VERSIONFILE" +} + +function sameVersion() { + test "$LAST_RELEASE" == "$THIS_RELEASE" -a "$LAST_COMPAT" == "$THIS_COMPAT" +} + +function getchanges() { + git log --no-merges --pretty=format:'@@%B' "$LAST_RELEASE"..HEAD \ + | awk '/^@@/{p=1}/^@@Translated using Weblate/{p=0}(p){print}' \ + | sed '/./{H;$!d};x;/./{s/ *\n */ /g;s/^ *//;s/ *$//;/[^]})!?:.]$/s/$/./;p};d' \ + | fold -s -w 66 | sed '/^@@/{s/^../- /;p;d};s/^/ /' +} function newchangesentry() { echo "-------------------------------------------------------------------" echo "$(date) - $EMAIL" echo "" - echo "$(git log --no-merges --pretty=format:'- %s' "$LAST_RELEASE"..HEAD | grep -v 'po.tar.bz2')" - test "$LAST_RELEASE" != "$THIS_RELEASE" && { + echo "$(getchanges)" + sameVersion || { echo "- version $THIS_RELEASE ($THIS_COMPAT)" } echo "" } + +function is_fast_forward() { + git fetch + test "$(git rev-list HEAD..origin/$(git name-rev --name-only HEAD) --count)" == "0" +} + +is_fast_forward || { + Recho "!!!" + Recho "!!! Branch is not fast-forward. Pull changes first." + Recho "!!!" + exit 7 +} + +git status --porcelain | grep '^[^ ?]' | grep -v "$VERSIONFILE\|$CHANGESFILE" && { + Becho "!!! Files other than version and changes are added to the index." + Becho "!!! Doing dryrun..." + DRYRUN=1 +} + +# A tag for $LAST_RELEASE must exist! +eval $(getversion) +git rev-parse -q --verify "$LAST_RELEASE" >/dev/null || { + Recho "!!!" + Recho "!!! There is no LAST_RELEASE tag '$LAST_RELEASE'. Check manually. " + Recho "!!! (git tag -m 'tagging $LAST_RELEASE' '$LAST_RELEASE' ?commit?)" + Recho "!!!" + exit 8 +} + +if [ "$DRYRUN" == "1" ]; then + newchangesentry + sameVersion && { + Becho "!!! Version is unchanged at $LAST_RELEASE ($LAST_COMPAT)." + } + exit 0 +fi + +# check version file +# +while true; do + # $LAST_RELEASE + # $LAST_COMPAT + # $THIS_RELEASE + # $THIS_COMPAT + sameVersion && { + newchangesentry + Becho "!!! Version is unchanged at $LAST_RELEASE ($LAST_COMPAT)." + read -n 1 -p "$(Gecho "(a)bort, (c)ontinue, (P) patch, (M) minor, (I) incompat minor, (e)dit version [e]: ")" RES + echo + case "${RES:-e}" in + [eE]*) + Edit $VERSIONFILE + eval $(getversion) + continue + ;; + [cC]) + Becho "!!! Leave $VERSIONFILE untouched" + break + ;; + [P]) + setversion LIBZYPP_PATCH $(($THIS_PATCH + 1)) + eval $(getversion) + continue + ;; + [M]) + setversion LIBZYPP_MINOR $(($THIS_MINOR + 1)) + setversion LIBZYPP_PATCH 0 + eval $(getversion) + continue + ;; + [I]) + setversion LIBZYPP_COMPATMINOR $(($THIS_MINOR + 1)) + setversion LIBZYPP_MINOR $(($THIS_MINOR + 1)) + setversion LIBZYPP_PATCH 0 + eval $(getversion) + continue + ;; + *) + errexit "aborted" + ;; + esac + } + break +done + +# prepare changes file +# TMPFILE=$(mktemp) trap " [ -f \"$TMPFILE\" ] && /bin/rm -f -- \"$TMPFILE\" " 0 1 2 3 13 15 { newchangesentry; cat $CHANGESFILE; } >$TMPFILE RES=e while [ "$RES" == "e" ]; do - $EDITOR $TMPFILE + Edit $TMPFILE echo awk '{print}/^----------/{n=n+1; if ( n == 2 ) exit 0; }' $TMPFILE - read -n 1 -p "(a)bort, (c)ontinue, (s)ubmitt, (e)dit : " RES - echo + read -n 1 -p "$(Gecho "(a)bort, (c)ontinue, (s)ubmitt, (e)dit [e]: ")" RES echo - case "$RES" in + case "${RES:-e}" in [eE]*) RES=e ;; [cCsS]) - echo "Store new $CHANGESFILE" + Becho "!!! Store new $CHANGESFILE" mv $TMPFILE $CHANGESFILE + chmod 644 $CHANGESFILE test "$RES" == "s" && { if [ "$LAST_RELEASE" == "$THIS_RELEASE" ]; then git add "$CHANGESFILE" && git commit -m "changes" else - echo "Remember new version $THIS_RELEASE in $VERSIONFILE" + Becho "!!! Remember new version $THIS_RELEASE in $VERSIONFILE" sed -i "s/^# LAST RELEASED:.*$/# LAST RELEASED: $THIS_RELEASE ($THIS_COMPAT)/" $VERSIONFILE - git add "$CHANGESFILE" "$VERSIONFILE" \ - && git commit -m "changes $THIS_RELEASE" \ - && git tag -m "tagging $THIS_RELEASE" "$THIS_RELEASE" HEAD - echo "" - echo "Do not forget to push the commit and the tag: git push --tags" - echo "" + if git add "$CHANGESFILE" "$VERSIONFILE" \ + && git commit -m "changes $THIS_RELEASE ($THIS_COMPAT)" \ + && git tag -m "tagging $THIS_RELEASE" "$THIS_RELEASE" HEAD; then + Becho "!!!" + Becho "!!! Do not forget to push the commit and the tag: $(Gecho git push --tags origin HEAD)" + Becho "!!!" + else + Recho "!!!" + Recho "!!! Commit failed. Check manually. (git reset HEAD~)" + Recho "!!!" + exit 9 + fi fi } ;; *) - echo "Leave $CHANGESFILE untouched" + Becho "!!! Leave $CHANGESFILE untouched" ;; esac done