blob: 4938049a3ed3641c1751038b46bbd05deb71490c [file] [log] [blame]
#!/usr/bin/env bash
# puts the public files online after a release
# Copyright (c) 2006-2016 Willy Tarreau <w@1wt.eu>
#
# In short :
# - requires git
# - no restriction to master, uses last tag
# - copies & compresses files, changelog & docs to the final destination
# - shows a listing of the final file
USAGE="Usage: ${0##*/} [-a] [-q] [-y] [-b branch] [-n newver] DIR"
CMD_GZIP="${CMD_GZIP:-gzip -nc9}"
TARGET_DIR=
OUTPUT=
SAYYES=
BRANCH=
DEVEL=
QUIET=
AUTO=
NEW=
DIR=
DOC=( )
die() {
[ "$#" -eq 0 ] || echo "$*" >&2
exit 1
}
err() {
echo "$*" >&2
}
quit() {
[ "$#" -eq 0 -o -n "$QUIET" ] || echo "$*"
exit 0
}
while [ -n "$1" -a -z "${1##-*}" ]; do
case "$1" in
-a) AUTO=1 ; shift ;;
-q) QUIET=1 ; shift ;;
-y) SAYYES=1 ; shift ;;
-b) BRANCH="$2" ; shift 2 ;;
-n) NEW="$2" ; shift 2 ;;
-h|--help) quit "$USAGE" ;;
*) die "$USAGE" ;;
esac
done
if [ $# -ne 1 ]; then
die "$USAGE"
fi
DIR="$1" ; shift
if [ -z "$DIR" ]; then
die "Missing target directory name."
fi
if [ -n "${DIR##/*}" ]; then
DIR="$PWD/$DIR"
fi
if [ ! -d "$DIR/." ]; then
die "Target directory doesn't exist : $DIR"
fi
if ! git rev-parse --verify -q HEAD >/dev/null; then
die "Failed to check git HEAD."
fi
# we want to go to the git top dir
toplvl=$(git rev-parse --show-toplevel)
if [ -n "$toplvl" ]; then
cd "$toplvl"
fi
# ensure that a master branch exists here
if [ -z "$(git rev-parse --verify -q master 2>/dev/null)" ]; then
die "Current directory doesn't seem to be a valid git directory (no master branch)."
fi
if [ "$(git rev-parse --verify -q HEAD)" != "$(git rev-parse --verify -q master)" ]; then
die "git HEAD doesn't match master branch."
fi
if [ "$(git diff HEAD 2>/dev/null |wc -c)" != 0 ]; then
err "You appear to have uncommitted local changes, please commit them first :"
git status -s -uno >&2
die
fi
if [ -z "$NEW" -o -n "$AUTO" ]; then
if [ -z "$NEW" ]; then
NEW="$(git describe --tags HEAD --abbrev=0)"
NEW="${NEW#v}"
if [ -z "$NEW" ]; then
die "Fatal: cannot determine new version, please specify it."
fi
fi
if [ "$(git describe --tags HEAD)" != "v$NEW" ]; then
if [ -n "$AUTO" ]; then
quit "Not tagged, nothing to do."
fi
die "Current version doesn't seem tagged, it reports $(git describe --tags "v$NEW"). Did you release it ?"
fi
fi
if ! git show-ref --tags "v$NEW" >/dev/null; then
die "git tag v$NEW doesn't exist, did you create the release ?"
fi
# determine the product branch from the new release
if [ -z "$BRANCH" ]; then
subvers=${NEW#[0-9]*.[0-9]*[-.]*[0-9].}
[ "${subvers}" = "${NEW}" ] && subvers=""
major=${NEW%.$subvers}
branch_ext=${major#*[0-9].*[0-9]}
BRANCH=${major%${branch_ext}}
fi
TARGET_DIR="$DIR/$BRANCH"
if [ ! -d "$TARGET_DIR/." ]; then
die "Target directory doesn't contain branch $BRANCH. You may have to create it in $DIR."
fi
if [ -z "${NEW##*-dev*}" ]; then
DEVEL="/devel"
fi
if [ -n "$AUTO" -a -e "$TARGET_DIR/src${DEVEL}/haproxy-$NEW.tar.gz.md5" ]; then
quit "Version $NEW Already released."
fi
if ! mkdir -p "$TARGET_DIR/src$DEVEL" "$TARGET_DIR/doc"; then
die "failed to create target directories."
fi
case "$BRANCH" in
1.3) DOC=( doc/{haproxy-en,haproxy-fr,configuration,architecture}.txt ) ;;
1.4) DOC=( doc/{haproxy-en,haproxy-fr,configuration}.txt ) ;;
1.5) DOC=( doc/{coding-style,configuration,proxy-protocol}.txt ) ;;
1.6) DOC=( doc/{coding-style,intro,management,configuration,proxy-protocol,lua}.txt ) ;;
*) DOC=( doc/{coding-style,intro,management,configuration,proxy-protocol,lua,SPOE}.txt ) ;;
esac
if [ -z "$AUTO" ]; then
echo "Ready to produce the following files in $TARGET_DIR/ :"
echo " haproxy-$NEW.tar.gz -> src${DEVEL}/"
echo " CHANGELOG -> src/CHANGELOG"
echo " ${DOC[@]} -> doc/*{,.gz}"
echo
git ls-tree -l --abbrev=12 "v$NEW" -- CHANGELOG "${DOC[@]}"
if [ -z "$SAYYES" ]; then
echo "Press ENTER to continue or Ctrl-C to abort now!"
read
fi
fi
echo "Archiving sources for version $NEW ..."
rm -f "${TARGET_DIR}/src${DEVEL}/haproxy-${NEW}.tar.gz"{,.md5,.sha256}
if ! git archive --format=tar --prefix="haproxy-${NEW}/" "v$NEW" | \
$CMD_GZIP > "${TARGET_DIR}/src${DEVEL}/haproxy-${NEW}.tar.gz"; then
die "Failed to produce the tar.gz archive"
fi
( cd "$TARGET_DIR/src${DEVEL}" ; \
md5sum haproxy-$NEW.tar.gz > haproxy-$NEW.tar.gz.md5 ; \
sha256sum haproxy-$NEW.tar.gz > haproxy-$NEW.tar.gz.sha256 )
echo "Extracting doc ..."
git show "v$NEW:CHANGELOG" > "$TARGET_DIR/src/CHANGELOG"
for i in "${DOC[@]}"; do
git show "v$NEW:$i" > "$TARGET_DIR/doc/${i#doc/}"
$CMD_GZIP < "$TARGET_DIR/doc/${i#doc/}" > "$TARGET_DIR/doc/${i#doc/}.gz"
done
echo "Done : ls -l ${TARGET_DIR}"
( cd "$TARGET_DIR" ;
ls -l src/CHANGELOG "src${DEVEL}/haproxy-${NEW}".tar.gz{,.md5,.sha256} $(for i in "${DOC[@]}"; do echo "doc/${i#doc/}"{,.gz}; done)
)
echo