#!/usr/bin/env bash set -euo pipefail if [[ $# -ne 1 || -z "$1" ]]; then echo "Usage: $0 VERSION" >&2 exit 2 fi version="$1" if [[ ! "${version}" =~ ^[A-Za-z0-9][A-Za-z0-9._-]*$ ]]; then echo "VERSION must contain only letters, numbers, dots, underscores, or hyphens." >&2 exit 2 fi repository_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" dist_dir="${repository_dir}/dist" packages_dir="${repository_dir}/packages" package_name="netfishing-dedicated-server-${version}-linux-x86_64" staging_dir="$(mktemp -d)" trap 'rm -rf -- "${staging_dir}"' EXIT if ! git -C "${repository_dir}" diff --quiet \ || ! git -C "${repository_dir}" diff --cached --quiet; then echo "Commit dedicated packaging changes before creating a release." >&2 exit 1 fi for filename in \ NETfishingServer.x86_64 \ NETfishingServer.pck \ BUILD_INFO \ SOURCE-CODE.md \ SHA256SUMS; do if [[ ! -f "${dist_dir}/${filename}" ]]; then echo "Run scripts/stage-build.sh before packaging." >&2 exit 1 fi done for filename in \ GPL-3.0-or-later.txt \ ASSET-LICENSE.md \ THIRD-PARTY-NOTICES.md \ TRADEMARKS.md \ CREDITS.md; do if [[ ! -f "${dist_dir}/licenses/${filename}" ]]; then echo "Staged build is missing licenses/${filename}." >&2 exit 1 fi done if ! grep -Fxq "game_version=${version}" "${dist_dir}/BUILD_INFO"; then echo "Staged BUILD_INFO does not match package version ${version}." >&2 exit 1 fi packaging_commit="$( awk -F= '$1 == "packaging_commit" {print tolower($2); exit}' \ "${dist_dir}/BUILD_INFO" )" current_packaging_commit="$(git -C "${repository_dir}" rev-parse HEAD)" if [[ "${packaging_commit}" != "${current_packaging_commit}" ]]; then echo "Staged BUILD_INFO does not match the current packaging commit." >&2 exit 1 fi release_tag="v${version}" if ! release_commit="$( git -C "${repository_dir}" rev-parse --verify "refs/tags/${release_tag}^{commit}" )"; then echo "Dedicated packaging tag ${release_tag} does not exist." >&2 exit 1 fi if [[ "${release_commit}" != "${current_packaging_commit}" ]]; then echo "Dedicated packaging tag ${release_tag} does not point to HEAD." >&2 exit 1 fi (cd -- "${dist_dir}" && sha256sum -c SHA256SUMS) install -d "${staging_dir}/${package_name}" install -m 0755 "${dist_dir}/NETfishingServer.x86_64" \ "${staging_dir}/${package_name}/NETfishingServer.x86_64" install -m 0644 "${dist_dir}/NETfishingServer.pck" \ "${staging_dir}/${package_name}/NETfishingServer.pck" install -m 0644 "${dist_dir}/BUILD_INFO" \ "${staging_dir}/${package_name}/BUILD_INFO" install -m 0644 "${dist_dir}/SHA256SUMS" \ "${staging_dir}/${package_name}/SHA256SUMS" install -m 0644 "${dist_dir}/SOURCE-CODE.md" \ "${staging_dir}/${package_name}/SOURCE-CODE.md" install -m 0644 "${repository_dir}/config/server.cfg.example" \ "${staging_dir}/${package_name}/server.cfg" install -m 0644 "${repository_dir}/README.md" \ "${staging_dir}/${package_name}/README.md" install -d "${staging_dir}/${package_name}/licenses" for filename in \ GPL-3.0-or-later.txt \ ASSET-LICENSE.md \ THIRD-PARTY-NOTICES.md \ TRADEMARKS.md \ CREDITS.md; do install -m 0644 "${dist_dir}/licenses/${filename}" \ "${staging_dir}/${package_name}/licenses/${filename}" done mkdir -p -- "${packages_dir}" archive="${packages_dir}/${package_name}.tar.gz" tar --sort=name --mtime=@0 --owner=0 --group=0 --numeric-owner \ -C "${staging_dir}" -czf "${archive}" "${package_name}" cd -- "${packages_dir}" sha256sum "${package_name}.tar.gz" > "${package_name}.tar.gz.sha256" echo "Created ${archive}"