do-release-commit-and-tag revision 05436638acc7c010349a69c3395f1a57c642dc62
105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#!/bin/sh 205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# In a git/autoconf/automake-enabled project with a NEWS file and a version- 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# controlled .prev-version file, automate the procedure by which we record 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the date, release-type and version string in the NEWS file. That commit 505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# will serve to identify the release, so apply a signed tag to it as well. 605436638acc7c010349a69c3395f1a57c642dc62Ying WangVERSION=2012-08-01.09 # UTC 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Note: this is a bash script (could be zsh or dash) 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Copyright (C) 2009-2012 Free Software Foundation, Inc. 1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This program is free software: you can redistribute it and/or modify 1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# it under the terms of the GNU General Public License as published by 1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# the Free Software Foundation, either version 3 of the License, or 1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# (at your option) any later version. 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# This program is distributed in the hope that it will be useful, 1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# but WITHOUT ANY WARRANTY; without even the implied warranty of 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# GNU General Public License for more details. 2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# You should have received a copy of the GNU General Public License 2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# along with this program. If not, see <http://www.gnu.org/licenses/>. 2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Written by Jim Meyering 2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2705436638acc7c010349a69c3395f1a57c642dc62Ying WangME=$(basename "$0") 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wangwarn() { printf '%s: %s\n' "$ME" "$*" >&2; } 2905436638acc7c010349a69c3395f1a57c642dc62Ying Wangdie() { warn "$*"; exit 1; } 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3105436638acc7c010349a69c3395f1a57c642dc62Ying Wanghelp() 3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang cat <<EOF 3405436638acc7c010349a69c3395f1a57c642dc62Ying WangUsage: $ME [OPTION...] VERSION RELEASE_TYPE 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3605436638acc7c010349a69c3395f1a57c642dc62Ying WangRun this script from top_srcdir to perform the final pre-release NEWS 3705436638acc7c010349a69c3395f1a57c642dc62Ying Wangupdate in which the date, release-type and version string are 3805436638acc7c010349a69c3395f1a57c642dc62Ying Wangrecorded. Commit that result with a log entry marking the release, 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wangand apply a signed tag. Run it from your project's top-level 4005436638acc7c010349a69c3395f1a57c642dc62Ying Wangdirectory. 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4205436638acc7c010349a69c3395f1a57c642dc62Ying WangRequirements: 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang- you use git for version-control 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang- a version-controlled .prev-version file 4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang- a NEWS file, with line 3 identical to this: 4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang$noteworthy_stub 4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4805436638acc7c010349a69c3395f1a57c642dc62Ying WangOptions: 4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang --branch=BRANCH set release branch (default: $branch) 5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang -C, --builddir=DIR location of (configured) Makefile (default: $builddir) 5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang --help print this help, then exit 5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang --version print version number, then exit 5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 5405436638acc7c010349a69c3395f1a57c642dc62Ying WangEXAMPLE: 5505436638acc7c010349a69c3395f1a57c642dc62Ying WangTo update NEWS and tag the beta 8.1 release of coreutils, I would run this: 5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang $ME 8.1 beta 5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 5905436638acc7c010349a69c3395f1a57c642dc62Ying WangReport bugs and patches to <bug-gnulib@gnu.org>. 6005436638acc7c010349a69c3395f1a57c642dc62Ying WangEOF 6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang exit 6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 6405436638acc7c010349a69c3395f1a57c642dc62Ying Wangversion() 6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang year=$(echo "$VERSION" | sed 's/[^0-9].*//') 6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang cat <<EOF 6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang$ME $VERSION 6905436638acc7c010349a69c3395f1a57c642dc62Ying WangCopyright (C) $year Free Software Foundation, Inc, 7005436638acc7c010349a69c3395f1a57c642dc62Ying WangLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 7105436638acc7c010349a69c3395f1a57c642dc62Ying WangThis is free software: you are free to change and redistribute it. 7205436638acc7c010349a69c3395f1a57c642dc62Ying WangThere is NO WARRANTY, to the extent permitted by law. 7305436638acc7c010349a69c3395f1a57c642dc62Ying WangEOF 7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang exit 7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang## ------ ## 7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang## Main. ## 7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang## ------ ## 8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Constants. 8205436638acc7c010349a69c3395f1a57c642dc62Ying Wangnoteworthy='* Noteworthy changes in release' 8305436638acc7c010349a69c3395f1a57c642dc62Ying Wangnoteworthy_stub="$noteworthy ?.? (????-??-??) [?]" 8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Variables. 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wangbranch=$(git branch | sed -ne '/^\* /{s///;p;q;}') 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wangbuilddir=. 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8905436638acc7c010349a69c3395f1a57c642dc62Ying Wangwhile test $# != 0 9005436638acc7c010349a69c3395f1a57c642dc62Ying Wangdo 9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang # Handle --option=value by splitting apart and putting back on argv. 9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang case $1 in 9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang --*=*) 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang opt=$(echo "$1" | sed -e 's/=.*//') 9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang val=$(echo "$1" | sed -e 's/[^=]*=//') 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang shift 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang set dummy "$opt" "$val" ${1+"$@"}; shift 9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang ;; 9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang esac 10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang case $1 in 10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang --help|--version) ${1#--};; 10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang --branch) shift; branch=$1; shift ;; 10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang -C|--builddir) shift; builddir=$1; shift ;; 10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang --*) die "unrecognized option: $1";; 10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang *) break;; 10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang esac 10805436638acc7c010349a69c3395f1a57c642dc62Ying Wangdone 10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11005436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest $# = 2 \ 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang || die "Usage: $ME [OPTION...] VERSION TYPE" 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wangver=$1 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtype=$2 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang## ---------------------- ## 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang## First, sanity checks. ## 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang## ---------------------- ## 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Verify that $ver looks like a version number, and... 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wangecho "$ver"|grep -E '^[0-9][0-9.]*[0-9]$' > /dev/null \ 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang || die "invalid version: $ver" 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wangprev_ver=$(cat .prev-version) \ 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang || die 'failed to determine previous version number from .prev-version' 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Verify that $ver is sensible (> .prev-version). 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wangcase $(printf "$prev_ver\n$ver\n"|sort -V -u|tr '\n' ':') in 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang "$prev_ver:$ver:") ;; 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang *) die "invalid version: $ver (<= $prev_ver)";; 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wangesac 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wangcase $type in 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang alpha|beta|stable) ;; 13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang *) die "invalid release type: $type";; 13605436638acc7c010349a69c3395f1a57c642dc62Ying Wangesac 13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# No local modifications allowed. 13905436638acc7c010349a69c3395f1a57c642dc62Ying Wangcase $(git diff-index --name-only HEAD) in 14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang '') ;; 14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang *) die 'this tree is dirty; commit your changes first';; 14205436638acc7c010349a69c3395f1a57c642dc62Ying Wangesac 14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Ensure the current branch name is correct: 14505436638acc7c010349a69c3395f1a57c642dc62Ying Wangcurr_br=$(git rev-parse --symbolic-full-name HEAD) 14605436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest "$curr_br" = refs/heads/$branch || die not on branch $branch 14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Extract package name from Makefile. 14905436638acc7c010349a69c3395f1a57c642dc62Ying WangMakefile=$builddir/Makefile 15005436638acc7c010349a69c3395f1a57c642dc62Ying Wangpkg=$(sed -n 's/^PACKAGE = \(.*\)/\1/p' "$Makefile") \ 15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang || die "failed to determine package name from $Makefile" 15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Check that line 3 of NEWS is the stub line about to be replaced. 15405436638acc7c010349a69c3395f1a57c642dc62Ying Wangtest "$(sed -n 3p NEWS)" = "$noteworthy_stub" \ 15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang || die "line 3 of NEWS must be exactly '$noteworthy_stub'" 15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang## --------------- ## 15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang## Then, changes. ## 15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang## --------------- ## 16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Update NEWS to have today's date, plus desired version number and $type. 16205436638acc7c010349a69c3395f1a57c642dc62Ying Wangperl -MPOSIX -ni -e 'my $today = strftime "%F", localtime time;' \ 16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang -e 'my ($type, $ver) = qw('"$type $ver"');' \ 16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang -e 'my $pfx = "'"$noteworthy"'";' \ 16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang -e 'print $.==3 ? "$pfx $ver ($today) [$type]\n" : $_' \ 16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang NEWS || die 'failed to update NEWS' 16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 16805436638acc7c010349a69c3395f1a57c642dc62Ying Wangprintf "version $ver\n\n* NEWS: Record release date.\n" \ 16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang | git commit -F - -a || die 'git commit failed' 17005436638acc7c010349a69c3395f1a57c642dc62Ying Wanggit tag -s -m "$pkg $ver" v$ver HEAD || die 'git tag failed' 17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Local variables: 17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# indent-tabs-mode: nil 17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# eval: (add-hook 'write-file-hooks 'time-stamp) 17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# time-stamp-start: "VERSION=" 17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# time-stamp-format: "%:y-%02m-%02d.%02H" 17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# time-stamp-time-zone: "UTC" 17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# time-stamp-end: " # UTC" 17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# End: 180