Create some Openbox release scripts:
authorDana Jansens <danakj@orodu.net>
Mon, 4 Oct 2010 18:33:16 +0000 (14:33 -0400)
committerDana Jansens <danakj@orodu.net>
Sun, 30 Sep 2012 15:30:53 +0000 (11:30 -0400)
release/bugs: Prints a list of bugs that are mentioned in git commits for a
  git revision, since previous release.
  - Very useful for updating the CHANGELOG file!

release/go: Tests a git revision for correct compilation, and prepares files
  for release.
  - Makes the tarball
  - Makes a GPG signature for the tarball
  - Tags the release
  - Spits out URLs to edit and gives the changelog for copy/paste.

release/email: Sends an email to the Openbox mailing list with the changelog
  and details about the release.  Call this with the same parameters used for
  running release/go once it is finished, and the files are uploaded, etc.
  - Also emails mikachu re freshmeat.net

release/bugs [new file with mode: 0755]
release/common [new file with mode: 0644]
release/email [new file with mode: 0755]
release/go [new file with mode: 0755]

diff --git a/release/bugs b/release/bugs
new file mode 100755 (executable)
index 0000000..c650c04
--- /dev/null
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+help() {
+  echo "Usage: $0 <revision> [lastrelease]"
+  echo
+  echo "  <revision>    The revision which should be used for release."
+  echo "  [lastrelease] The revision of the most recent release made."
+  echo "                By default it uses the most recent release-tag."
+  exit 1
+}
+
+error() {
+  echo "error: $1"
+  clean
+  exit 1
+}
+
+test -e "./openbox/openbox.c" || \
+  error "must be run from the project's top level directory"
+
+REV="$1"
+test -z "$REV" && help
+RELEASE_SHA=$(git rev-parse "$REV")
+test $? = 0 || error "revision $REV not found"
+
+LAST="$2"
+if test -z "$LAST"; then
+    LAST=$(git describe --match 'release-*' $REV)
+    test $? == 0 || \
+       error "unable to find last release"
+fi
+
+#### CHANGELOG #####
+
+git log --no-merges $LAST..$REV --oneline|grep '#[0-9]'|cut -d\# -f 2|awk '{printf "#%d, ", $1}'
+echo | awk '{printf "\b\b \n"}'
+
+exit 0
diff --git a/release/common b/release/common
new file mode 100644 (file)
index 0000000..8b03c03
--- /dev/null
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+NOW=$(date +%s)
+SRCDIR="$PWD"
+WORKDIR="/tmp/openbox.$NOW"
+TESTDIR="$WORKDIR/.test"
+
+clean() {
+  cd "$SRCDIR"
+  if test -d "$WORKDIR"; then
+    chmod -R +w "$WORKDIR"
+    rm -r -f "$WORKDIR"
+  fi
+}
+
+error() {
+  echo "error: $1"
+  clean
+  exit 1
+}
+
+RELEASE_SHA=$(git rev-parse "$REV")
+test $? = 0 || error "revision $REV not found"
+
+#NON_MASTER=$(git rev-list $RELEASE_SHA ^master)
+#test $? = 0 || error "git rev-list failed"
+#test -z $NON_MASTER || error "REVISION contains commits not on master"
+
+git new-workdir "$SRCDIR" "$WORKDIR"
+test $? = 0 || error "git-new-workdir failed"
+
+echo "working in $WORKDIR"
+
+cd "$WORKDIR"
+test $? = 0 || error "cd to $WORKDIR failed"
+
+git checkout -q $RELEASE_SHA
+test $? = 0 || error "git-checkout failed"
+
+# get last release
+if test -z "$LAST"; then
+    LAST=$(git describe --match 'release-*' $REV)
+    test $? == 0 || \
+       error "unable to find last release"
+fi
+
+H="$(head -1 CHANGELOG|cut -d: -f 1)"
+test $H = $VERSION ||
+  error "CHANGELOG does not contain version $VERSION"
+
+CL="$(cat CHANGELOG|sed -n /^$VERSION:\$/,/^\$/p|tail -n +2|head -n -1)"
+CLNOWRAP=$(echo "$CL" \
+  |sed -e "s/^  \*/*/"|sed -n '1h;1!H;${;g;s/\n    / /g;p;}')
+SHORTLOG="$(git shortlog --no-merges $LAST..$REV)"
diff --git a/release/email b/release/email
new file mode 100755 (executable)
index 0000000..7fa9e57
--- /dev/null
@@ -0,0 +1,63 @@
+#!/bin/sh
+
+help() {
+  echo "Usage: $0 <revision> <version> [lastrelease]"
+  echo
+  echo "  <revision>    The revision which should be used for release."
+  echo "  <version>     The version of the release."
+  echo "  [lastrelease] The revision of the most recent release made."
+  echo "                By default it uses the most recent release-tag."
+  exit 1
+}
+
+REV="$1"
+test -z "$REV" && help
+VERSION="$2"
+test -z "$VERSION" && help
+LAST="$3"
+
+. release/common
+
+SUBJECT="[RELEASE] Openbox $VERSION"
+MAILINGLIST=openbox@icculus.org
+MIKACHU=mikachu@icculus.org
+
+cat <<EOF > $WORKDIR/.email
+Hello,
+
+Openbox $VERSION is now available!
+
+Some noteworthy changes are:
+$CLNOWRAP
+
+======== Download ========
+
+Download links are here: http://openbox.org/wiki/Openbox:Download
+
+======== Commits ========
+
+The following is a full list of commits appearing in this release.
+You can see the full commits here: http://git.openbox.org/?p=dana/openbox.git;a=shortlog;h=refs/tags/release-$VERSION
+
+
+$SHORTLOG
+EOF
+
+if test -z $EDITOR; then
+    nano -w $WORKDIR/.email || error "failed to edit email, set \$EDITOR"
+else
+    $EDITOR $WORKDIR/.email || error "failed to edit email with \$EDTIOR"
+fi
+
+test -e $WORKDIR/.email || error "email file disappeared"
+cat $WORKDIR/.email | mail -s "$SUBJECT" "$MAILINGLIST" || \
+    error "mail to $MAILINGLIST failed"
+
+echo "Hi Mikachu,
+
+Please update the freshmeat.net Openbox stuff for $VERSION. Thanks!" | \
+mail -s "Freshmeat.net for Openbox $VERSION" "$MIKACHU" || \
+    error "mail to $MIKACHU failed"
+
+clean
+exit 0
diff --git a/release/go b/release/go
new file mode 100755 (executable)
index 0000000..db07960
--- /dev/null
@@ -0,0 +1,153 @@
+#!/bin/sh
+
+help() {
+  echo "Usage: $0 <revision> <version> [lastrelease]"
+  echo
+  echo "  <revision>    The revision which should be used for release."
+  echo "  <version>     The version of the release."
+  echo "  [lastrelease] The revision of the most recent release made."
+  echo "                By default it uses the most recent release-tag."
+  exit 1
+}
+
+REV="$1"
+test -z "$REV" && help
+VERSION="$2"
+test -z "$VERSION" && help
+LAST="$3"
+
+. release/common
+
+#### CONFIRM SHORTLOG #####
+
+echo Shortlog from previous release:
+echo "$SHORTLOG"
+echo
+echo Shortlog from $LAST contains $(echo "$SHORTLOG"|wc -l) lines
+echo -n "ok? (y/n) "
+read a
+test "$a" = "y" || error "aborted"
+
+#### TEST COMPILATION ####
+
+# check that it builds
+./bootstrap >/dev/null || "bootstrap failed"
+#CFLAGS="-Werror -isystem /usr/lib/glib-2.0" \
+./configure -C --enable-debug >/dev/null || \
+  error "configure (with debug) failed"
+make || error "make (with debug and Werror) failed"
+git clean -f -x -d -q
+
+# check that it builds with each optional featureset
+./bootstrap >/dev/null || "bootstrap failed"
+
+echo Check compile with all options enabled
+./configure -C >/dev/null || \
+  error "configure failed"
+make >/dev/null 2>/dev/null || \
+  error "make failed"
+grep "XKB 1" config.log >/dev/null || error "missing xkb extension"
+grep "XRANDR 1" config.log >/dev/null || error "missing xrandr extension"
+grep "XINERAMA 1" config.log >/dev/null || error "missing xinerama extension"
+grep "SYNC 1" config.log >/dev/null || error "missing sync extension"
+make clean >/dev/null || error "make clean failed"
+
+echo Check compile with startup notification disabled
+./configure -C --disable-startup-notification >/dev/null || \
+  error "configure failed"
+make >/dev/null 2>/dev/null || \
+  error "make (with --disable-startup-notification) failed"
+make clean >/dev/null || error "make clean failed"
+
+echo Check compile with xcursor disabled
+./configure -C --disable-xcursor >/dev/null || \
+  error "configure failed"
+make >/dev/null 2>/dev/null || \
+  error "make (with --disable-xcursor) failed"
+make clean >/dev/null || error "make clean failed"
+
+echo Check compile with imlib2 disabled
+./configure -C --disable-imlib2 >/dev/null || \
+  error "configure failed"
+make >/dev/null 2>/dev/null || \
+  error "make (with --disable-imlib2) failed"
+make clean >/dev/null || error "make clean failed"
+
+echo Check compile with session management disabled
+./configure -C --disable-session-management >/dev/null || \
+  error "configure failed"
+make >/dev/null 2>/dev/null || \
+  error "make (with --disable-session-management) failed"
+make clean >/dev/null || error "make clean failed"
+
+echo Check compile with xkb disabled
+./configure -C --disable-xkb >/dev/null || error "configure failed"
+make >/dev/null 2>/dev/null || error "make (with --disable-xkb) failed"
+make clean >/dev/null || error "make clean failed"
+
+echo Check compile with xrandr disabled
+./configure -C --disable-xrandr >/dev/null || error "configure failed"
+make >/dev/null 2>/dev/null || error "make (with --disable-xrandr) failed"
+make clean >/dev/null || error "make clean failed"
+
+echo Check compile with xinerama disabled
+./configure -C --disable-xinerama >/dev/null || error "configure failed"
+make >/dev/null 2>/dev/null || error "make (with --disable-xinerama) failed"
+make clean >/dev/null || error "make clean failed"
+
+echo Check compile with xsync disabled
+./configure -C --disable-xsync >/dev/null || error "configure failed"
+make >/dev/null 2>/dev/null || error "make (with --disable-xsync) failed"
+make clean >/dev/null || error "make clean failed"
+
+# check that it installs sanely
+echo Check installation correctness
+./configure -C >/dev/null || \
+  error "configure failed"
+make distcheck >/dev/null || \
+  error "make distcheck failed"
+
+# VERIFY TARBALL
+
+TAR="openbox-$VERSION.tar.gz"
+ASC="openbox-$VERSION.tar.gz.asc"
+
+echo Found Openbox release tarball:
+ls -d openbox-*.tar.gz
+test -e "$TAR" || \
+  error "Specified version does not match configure.am"
+
+# SIGN THE TARBALL
+
+echo Signing the release tarball:
+gpg --sign --detach-sign --armor "$TAR"
+test $? = 0 || \
+  error "Failed to sign release tarball"
+
+echo Tagging the release:
+git tag -s -m "tagging the $VERSION release" "release-$VERSION" $REV || \
+  error "Failed to tag the release"
+
+mv "$TAR" "$ASC" "$SRCDIR"
+
+echo "=$VERSION="
+echo "$CLNOWRAP"
+echo
+echo
+echo Edit download page:
+echo "  http://openbox.org/oldwiki/index.php?title=Openbox:Download&action=edit&section=1"
+echo
+echo Edit changelog:
+echo "  http://openbox.org/oldwiki/index.php?title=Openbox:Changelog&action=edit&section=1"
+echo
+echo Push the tag:
+echo "  git push origin tag release-$VERSION"
+echo
+echo Email:
+echo "  ./release/email $*"
+echo
+cd "$SRCDIR"
+ls -l "$TAR" "$ASC"
+
+clean
+exit 0