starter-kit/bots/release-guide
2019-08-25 15:21:02 +00:00

197 lines
3.6 KiB
Bash
Executable file

#!/bin/sh -euf
#
# release-guide
#
# A release that commits the HTML guide to another git repository
#
# We update the version number in a Dockerfile, and tests that
# the resulting URLs can be fetched. Commits the changes and pushes
# the result.
#
# We expect an 'html' subdirectory and likely an 'index.html' file there.
#
# Arguments are described here. Most arguments have an equivalent envvar.
#
# -f tgz RELEASE_SOURCE=tbz The tarball to extract documentation from
# -q RELEASE_QUIET=1 Make output more quiet
# -v RELEASE_VERBOSE=1 Make output more verbose
#
set -euf
# Various arguments
TRANSACTION=${RELEASE_TRANSACTION:-0}
QUIET=${RELEASE_QUIET:-0}
VERBOSE=${RELEASE_VERBOSE:-0}
SRPM=${RELEASE_SRPM:-$PWD/srpm}
SOURCE=${RELEASE_SOURCE:-}
CHECK=${RELEASE_CHECK:-0}
REPO=""
WORKDIR=""
DIRECTORY=""
TARBALL=""
usage()
{
echo "usage: release-guide [-qvxz] [-f TARBALL] DIRECTORY REPO" >&2
exit ${1-2}
}
trace()
{
if [ $QUIET -eq 0 ]; then
echo "> $@" >&2
fi
}
message()
{
echo "release-guide: $@" >&2
}
parse_version()
{
echo "$@" | sed -n 's/.\+-\([0-9].*\)/\1/p'
}
check()
{
"$(dirname $0)/check-git-rw" git@github.com "$REPO"
}
prepare()
{
local version subdir
trace "Extracting the tarball $TARBALL"
WORKDIR=$(mktemp --directory source.XXXXXX)
mkdir -p $WORKDIR/extract
tar -f $TARBALL -C $WORKDIR/extract -x
trace "Checking out Github repo $REPO"
cd $WORKDIR
git clone git@github.com:$REPO repo
cd extract
set +f
subdir=$(echo *)
set -f
version="$(parse_version $subdir)"
if [ -z "$version" ]; then
message "couldn't determine version from $subdir"
exit 1
fi
cd ..
trace "Committing documentation for version $version"
mkdir -p repo/guide/
rm -rf repo/guide/$version
if [ ! -f extract/$subdir/$DIRECTORY/html/index.html ]; then
message "no html/index.html documentation in $DIRECTORY"
exit 1
fi
mv -n extract/$subdir/$DIRECTORY/html/ repo/guide/$version
if [ -f extract/$subdir/$DIRECTORY/index.html ]; then
mv extract/$subdir/$DIRECTORY/index.html repo/guide/index.html
fi
rm -rf repo/guide/latest
cp -rp repo/guide/$version repo/guide/latest
# Add frontmatter for Jekyll
find repo/guide/latest -name '*.html' | xargs sed -i '
1i\
---\
layout: guide\
---'
git -C repo add guide/
if git -C repo diff --staged --exit-code > /dev/null; then
trace "Already uploaded documentation for $version"
exit 0
fi
trace "Committing changes"
git -C repo commit --message="Update guide to version $version"
cd ..
}
commit()
(
trace "Pushing changes to guide"
git -C $WORKDIR/repo push origin master
rm -rf $WORKDIR
)
while getopts "f:qvxz" opt; do
case "$opt" in
f)
SOURCE="$OPTARG"
;;
q)
QUIET=1
VERBOSE=0
;;
v)
QUIET=0
VERBOSE=1
;;
x)
TRANSACTION=1
;;
z)
CHECK=1
;;
-)
break
;;
*)
usage
;;
esac
done
shift $(expr $OPTIND - 1)
if [ $# -ne 2 ]; then
usage
fi
if [ $VERBOSE -eq 1 ]; then
set -x
fi
DIRECTORY="$1"
REPO="$2"
if [ -z "$SOURCE" ]; then
message "no tarball source specified"
exit 2
elif [ -d "$SOURCE" ]; then
TARBALL="$(find $SOURCE -maxdepth 1 -name '*.tar.*' | sort | head -n1)"
elif [ -f "$SOURCE" ]; then
TARBALL="$SOURCE"
else
message "tarball source not found: $SOURCE"
exit 1
fi
if [ $CHECK -eq 1 ]; then
check
exit 0
fi
prepare
if [ $TRANSACTION -eq 1 ]; then
kill -STOP $$
fi
commit