Blame build-aux/do-release-commit-and-tag

Packit Service fdd496
#!/bin/sh
Packit Service fdd496
# In a git/autoconf/automake-enabled project with a NEWS file and a version-
Packit Service fdd496
# controlled .prev-version file, automate the procedure by which we record
Packit Service fdd496
# the date, release-type and version string in the NEWS file.  That commit
Packit Service fdd496
# will serve to identify the release, so apply a signed tag to it as well.
Packit Service fdd496
VERSION=2016-12-31.14 # UTC
Packit Service fdd496
Packit Service fdd496
# Note: this is a bash script (could be zsh or dash)
Packit Service fdd496
Packit Service fdd496
# Copyright (C) 2009-2017 Free Software Foundation, Inc.
Packit Service fdd496
Packit Service fdd496
# This program is free software: you can redistribute it and/or modify
Packit Service fdd496
# it under the terms of the GNU General Public License as published by
Packit Service fdd496
# the Free Software Foundation, either version 3 of the License, or
Packit Service fdd496
# (at your option) any later version.
Packit Service fdd496
Packit Service fdd496
# This program is distributed in the hope that it will be useful,
Packit Service fdd496
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fdd496
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service fdd496
# GNU General Public License for more details.
Packit Service fdd496
Packit Service fdd496
# You should have received a copy of the GNU General Public License
Packit Service fdd496
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service fdd496
Packit Service fdd496
# Written by Jim Meyering
Packit Service fdd496
Packit Service fdd496
ME=$(basename "$0")
Packit Service fdd496
warn() { printf '%s: %s\n' "$ME" "$*" >&2; }
Packit Service fdd496
die() { warn "$*"; exit 1; }
Packit Service fdd496
Packit Service fdd496
help()
Packit Service fdd496
{
Packit Service fdd496
  cat <
Packit Service fdd496
Usage: $ME [OPTION...] VERSION RELEASE_TYPE
Packit Service fdd496
Packit Service fdd496
Run this script from top_srcdir to perform the final pre-release NEWS
Packit Service fdd496
update in which the date, release-type and version string are
Packit Service fdd496
recorded.  Commit that result with a log entry marking the release,
Packit Service fdd496
and apply a signed tag.  Run it from your project's top-level
Packit Service fdd496
directory.
Packit Service fdd496
Packit Service fdd496
Requirements:
Packit Service fdd496
- you use git for version-control
Packit Service fdd496
- a version-controlled .prev-version file
Packit Service fdd496
- a NEWS file, with line 3 identical to this:
Packit Service fdd496
$noteworthy_stub
Packit Service fdd496
Packit Service fdd496
Options:
Packit Service fdd496
  --branch=BRANCH     set release branch (default: $branch)
Packit Service fdd496
  -C, --builddir=DIR  location of (configured) Makefile (default: $builddir)
Packit Service fdd496
  --help              print this help, then exit
Packit Service fdd496
  --version           print version number, then exit
Packit Service fdd496
Packit Service fdd496
EXAMPLE:
Packit Service fdd496
To update NEWS and tag the beta 8.1 release of coreutils, I would run this:
Packit Service fdd496
Packit Service fdd496
  $ME 8.1 beta
Packit Service fdd496
Packit Service fdd496
Report bugs and patches to <bug-gnulib@gnu.org>.
Packit Service fdd496
EOF
Packit Service fdd496
  exit
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
version()
Packit Service fdd496
{
Packit Service fdd496
  year=$(echo "$VERSION" | sed 's/[^0-9].*//')
Packit Service fdd496
  cat <
Packit Service fdd496
$ME $VERSION
Packit Service fdd496
Copyright (C) $year Free Software Foundation, Inc,
Packit Service fdd496
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
Packit Service fdd496
This is free software: you are free to change and redistribute it.
Packit Service fdd496
There is NO WARRANTY, to the extent permitted by law.
Packit Service fdd496
EOF
Packit Service fdd496
  exit
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
## ------ ##
Packit Service fdd496
## Main.  ##
Packit Service fdd496
## ------ ##
Packit Service fdd496
Packit Service fdd496
# Constants.
Packit Service fdd496
noteworthy='* Noteworthy changes in release'
Packit Service fdd496
noteworthy_stub="$noteworthy ?.? (????-??-??) [?]"
Packit Service fdd496
Packit Service fdd496
# Variables.
Packit Service fdd496
branch=$(git branch | sed -ne '/^\* /{s///;p;q;}')
Packit Service fdd496
builddir=.
Packit Service fdd496
Packit Service fdd496
while test $# != 0
Packit Service fdd496
do
Packit Service fdd496
  # Handle --option=value by splitting apart and putting back on argv.
Packit Service fdd496
  case $1 in
Packit Service fdd496
    --*=*)
Packit Service fdd496
      opt=$(echo "$1" | sed -e 's/=.*//')
Packit Service fdd496
      val=$(echo "$1" | sed -e 's/[^=]*=//')
Packit Service fdd496
      shift
Packit Service fdd496
      set dummy "$opt" "$val" "$@"; shift
Packit Service fdd496
      ;;
Packit Service fdd496
  esac
Packit Service fdd496
Packit Service fdd496
  case $1 in
Packit Service fdd496
    --help|--version) ${1#--};;
Packit Service fdd496
    --branch) shift; branch=$1; shift ;;
Packit Service fdd496
    -C|--builddir) shift; builddir=$1; shift ;;
Packit Service fdd496
    --*) die "unrecognized option: $1";;
Packit Service fdd496
    *) break;;
Packit Service fdd496
  esac
Packit Service fdd496
done
Packit Service fdd496
Packit Service fdd496
test $# = 2 \
Packit Service fdd496
  || die "Usage: $ME [OPTION...] VERSION TYPE"
Packit Service fdd496
Packit Service fdd496
ver=$1
Packit Service fdd496
type=$2
Packit Service fdd496
Packit Service fdd496
Packit Service fdd496
## ---------------------- ##
Packit Service fdd496
## First, sanity checks.  ##
Packit Service fdd496
## ---------------------- ##
Packit Service fdd496
Packit Service fdd496
# Verify that $ver looks like a version number, and...
Packit Service fdd496
echo "$ver"|grep -E '^[0-9][0-9.]*[0-9]$' > /dev/null \
Packit Service fdd496
  || die "invalid version: $ver"
Packit Service fdd496
prev_ver=$(cat .prev-version) \
Packit Service fdd496
  || die 'failed to determine previous version number from .prev-version'
Packit Service fdd496
Packit Service fdd496
# Verify that $ver is sensible (> .prev-version).
Packit Service fdd496
case $(printf "$prev_ver\n$ver\n"|sort -V -u|tr '\n' ':') in
Packit Service fdd496
  "$prev_ver:$ver:") ;;
Packit Service fdd496
  *) die "invalid version: $ver (<= $prev_ver)";;
Packit Service fdd496
esac
Packit Service fdd496
Packit Service fdd496
case $type in
Packit Service fdd496
  alpha|beta|stable) ;;
Packit Service fdd496
  *) die "invalid release type: $type";;
Packit Service fdd496
esac
Packit Service fdd496
Packit Service fdd496
# No local modifications allowed.
Packit Service fdd496
case $(git diff-index --name-only HEAD) in
Packit Service fdd496
  '') ;;
Packit Service fdd496
  *) die 'this tree is dirty; commit your changes first';;
Packit Service fdd496
esac
Packit Service fdd496
Packit Service fdd496
# Ensure the current branch name is correct:
Packit Service fdd496
curr_br=$(git rev-parse --symbolic-full-name HEAD)
Packit Service fdd496
test "$curr_br" = "refs/heads/$branch" || die not on branch $branch
Packit Service fdd496
Packit Service fdd496
# Extract package name from Makefile.
Packit Service fdd496
Makefile=$builddir/Makefile
Packit Service fdd496
pkg=$(sed -n 's/^PACKAGE = \(.*\)/\1/p' "$Makefile") \
Packit Service fdd496
  || die "failed to determine package name from $Makefile"
Packit Service fdd496
Packit Service fdd496
# Check that line 3 of NEWS is the stub line about to be replaced.
Packit Service fdd496
test "$(sed -n 3p NEWS)" = "$noteworthy_stub" \
Packit Service fdd496
  || die "line 3 of NEWS must be exactly '$noteworthy_stub'"
Packit Service fdd496
Packit Service fdd496
## --------------- ##
Packit Service fdd496
## Then, changes.  ##
Packit Service fdd496
## --------------- ##
Packit Service fdd496
Packit Service fdd496
# Update NEWS to have today's date, plus desired version number and $type.
Packit Service fdd496
perl -MPOSIX -ni -e 'my $today = strftime "%F", localtime time;' \
Packit Service fdd496
 -e 'my ($type, $ver) = qw('"$type $ver"');' \
Packit Service fdd496
 -e 'my $pfx = "'"$noteworthy"'";' \
Packit Service fdd496
 -e 'print $.==3 ? "$pfx $ver ($today) [$type]\n" : $_' \
Packit Service fdd496
     NEWS || die 'failed to update NEWS'
Packit Service fdd496
Packit Service fdd496
printf "version $ver\n\n* NEWS: Record release date.\n" \
Packit Service fdd496
    | git commit -F -  -a || die 'git commit failed'
Packit Service fdd496
git tag -s -m "$pkg $ver" v$ver HEAD || die 'git tag failed'
Packit Service fdd496
Packit Service fdd496
# Local variables:
Packit Service fdd496
# indent-tabs-mode: nil
Packit Service fdd496
# eval: (add-hook 'write-file-hooks 'time-stamp)
Packit Service fdd496
# time-stamp-start: "VERSION="
Packit Service fdd496
# time-stamp-format: "%:y-%02m-%02d.%02H"
Packit Service fdd496
# time-stamp-time-zone: "UTC0"
Packit Service fdd496
# time-stamp-end: " # UTC"
Packit Service fdd496
# End: