blob: 69dd7cd83a992dfe2fbb81465d5356ee7f0058d9 [file] [log] [blame]
#!/bin/sh
#
# SPDX-License-Identifier: BSD-2-Clause
#
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# This script requires some non-POSIX utilities, but that's okay because it's
# really for maintainer use only.
#
# The non-POSIX utilities include:
#
# * git
# * stat
# * tar
# * xz
# * sha512sum
# * sha256sum
# * gpg
# * zip
# * unzip
shasum() {
f="$1"
shift
# All this fancy stuff takes the sha512 and sha256 sums and signs it. The
# output after this point is what I usually copy into the release notes.
# (See manuals/release.md for more information.)
printf '$ sha512sum %s\n' "$f"
sha512sum "$f"
printf '\n'
printf '$ sha256sum %s\n' "$f"
sha256sum "$f"
printf '\n'
printf "$ stat -c '%%s %%n'\n" "$f"
stat -c '%s %n' "$f"
if [ -f "$f.sig" ]; then
rm -f "$f.sig"
fi
gpg --detach-sig -o "$f.sig" "$f" 2> /dev/null
printf '\n'
printf '$ sha512sum %s.sig\n' "$f"
sha512sum "$f.sig"
printf '\n'
printf '$ sha256sum %s.sig\n' "$f"
sha256sum "$f.sig"
printf '\n'
printf "$ stat -c '%%s %%n'\n" "$f.sig"
stat -c '%s %n' "$f.sig"
}
script="$0"
scriptdir=$(dirname "$script")
repo="$scriptdir/.."
proj="bc"
cd "$repo"
if [ ! -f "../Debug.zip" ] || [ ! -f "../Release.zip" ]; then
printf 'Must have Windows builds!\n'
exit 1
fi
# We want the absolute path for later.
repo=$(pwd)
# This convoluted mess does pull the version out. If you change the format of
# include/version.h, you may have to change this line.
version=$(cat include/version.h | grep "VERSION " - | awk '{ print $3 }' -)
tag_msg="Version $version"
projver="${proj}-${version}"
tempdir="/tmp/${projver}"
rm -rf $tempdir
mkdir -p $tempdir
make clean_tests > /dev/null 2> /dev/null
# Delete the tag and recreate it. This is the part of the script that makes it
# so you cannot run it twice on the same version, unless you know what you are
# doing. In fact, you cannot run it again if users have already started to use
# the old version of the tag.
if git rev-parse "$version" > /dev/null 2>&1; then
git push --delete origin "$version" > /dev/null 2> /dev/null
git tag --delete "$version" > /dev/null 2> /dev/null
fi
git push > /dev/null 2> /dev/null
git tg "$version" -m "$tag_msg" > /dev/null 2> /dev/null
git push --tags > /dev/null 2> /dev/null
# This line grabs the names of all of the files in .gitignore that still exist.
ignores=$(git check-ignore * **/*)
cp -r ./* "$tempdir"
cd $tempdir
# Delete all the ignored files.
for i in $ignores; do
rm -rf "./$i"
done
# This is a list of files that end users (including *software packagers* and
# *distro maintainers*!) do not care about. In particular, they *do* care about
# the testing infrastructure for the regular test suite because distro
# maintainers probably want to ensure the test suite runs. However, they
# probably don't care about fuzzing or other randomized testing. Also, I
# technically can't distribute tests/bc/scripts/timeconst.bc because it's from
# the Linux kernel, which is GPL.
extras=$(cat <<*EOF
.git/
.gitignore
.gitattributes
benchmarks/
manuals/bc.1.md.in
manuals/dc.1.md.in
manuals/benchmarks.md
manuals/development.md
manuals/header_bcl.txt
manuals/header_bc.txt
manuals/header_dc.txt
manuals/header.txt
manuals/release.md
scripts/afl.py
scripts/alloc.sh
scripts/benchmark.sh
scripts/bitfuncgen.c
scripts/fuzz_prep.sh
scripts/manpage.sh
scripts/ministat.c
scripts/package.sh
scripts/radamsa.sh
scripts/radamsa.txt
scripts/randmath.py
scripts/release_settings.txt
scripts/release.sh
scripts/test_settings.sh
scripts/test_settings.txt
tests/bc_outputs/
tests/dc_outputs/
tests/fuzzing/
tests/bc/scripts/timeconst.bc
*EOF
)
for i in $extras; do
rm -rf "./$i"
done
cd ..
parent="$repo/.."
# Tar and compress and move into the parent directory of the repo.
tar cf "$projver.tar" "$projver/"
xz -z -v -9 -e "$projver.tar" > /dev/null 2> /dev/null
mv "$projver.tar.xz" "$parent"
cd "$parent"
# Clean up old Windows stuff.
if [ -d Win32_Debug ]; then
rm -rf Win32_Debug
fi
if [ -d Win32_Release ]; then
rm -rf Win32_Release
fi
if [ -d Win64_Debug ]; then
rm -rf Win64_Debug
fi
if [ -d Win64_Release ]; then
rm -rf Win64_Release
fi
# Prepare Windows stuff.
if [ ! -d Debug ]; then
unzip Debug.zip > /dev/null
fi
if [ ! -d Release ]; then
unzip Release.zip > /dev/null
fi
# Zip the Windows stuff.
mkdir Win32_Debug
cp Debug/Win32/bc/bc.exe Win32_Debug
cp Debug/Win32/bc/dc.exe Win32_Debug
cp Debug/Win32/bcl/bcl.lib Win32_Debug
mkdir Win32_Release
cp Release/Win32/bc/bc.exe Win32_Release
cp Release/Win32/bc/dc.exe Win32_Release
cp Release/Win32/bcl/bcl.lib Win32_Release
mkdir Win64_Debug
cp Debug/x64/bc/bc.exe Win64_Debug
cp Debug/x64/bc/dc.exe Win64_Debug
cp Debug/x64/bcl/bcl.lib Win64_Debug
mkdir Win64_Release
cp Release/x64/bc/bc.exe Win64_Release
cp Release/x64/bc/dc.exe Win64_Release
cp Release/x64/bcl/bcl.lib Win64_Release
zip -r Win32_Debug.zip Win32_Debug > /dev/null
zip -r Win32_Release.zip Win32_Release > /dev/null
zip -r Win64_Debug.zip Win64_Debug > /dev/null
zip -r Win64_Release.zip Win64_Release > /dev/null
printf '\n'
shasum "$projver.tar.xz"
printf '\n'
shasum "Win32_Debug.zip"
printf '\n'
shasum "Win32_Release.zip"
printf '\n'
shasum "Win64_Debug.zip"
printf '\n'
shasum "Win64_Release.zip"