#!/bin/sh

set -eux

# Produce a set of Cockpit release tarballs.
#
# This is the script used to create the official releases.
#
# It takes two mandatory arguments:
#
#   - the URL to clone the repository from,
#     eg. 'https://github.com/cockpit-project/cockpit'.
#
#   - the version to release, which is also the tag name, eg. '215'.
#
# The main release tarball contains a number of files that are not directly in
# version control:
#   - the usual automake stuff
#   - several submodules
#   - pre-compiled HTML and JS code
#
# This script shallow-clones the specified version of Cockpit from the
# specified URL, and downloads the version of the tasks container specified in
# that version. It then does an offline build of the release tarball, which is
# deterministic.
#
# You can use this script to verify the integrity of a particular set of Cockpit
# release tarballs, or even use it to create the tarballs for yourself, as an
# alternative to downloading it.
#
# The result of running `./autogen.sh && make dist VERSION=...` on any system
# ought to be the same, so long as the same versions of the autotools are
# present.  Everything else present in the tarball is definitively pinned down
# in one way or another by the contents of the git repository.  This script is
# a bit overkill, but it's written in hopes that someone reading it can
# reasonably convince themselves about the origin of absolutely everything in a
# Cockpit source release.
#
# If this script produces tarballs with different checksums than the
# officially-released ones, then please report a bug.

URL="$1"
VERSION="$2"

# We collect the sources into a temporary directory, then use tar to pipe them
# into a container with no network or filesystem access, where the actual build
# takes place. The container pipes the built source release back to us.

SOURCE="$(mktemp -dt 'cockpit-build-XXXXXX')"
trap 'rm -rf "${SOURCE}"' EXIT

# Clone the release and selected submodules into the temporary directory.
git clone \
    --depth=1 \
    --recurse-submodules=node_modules \
    --recurse-submodules=vendor \
    -b "${VERSION}" \
    "${URL}" \
    "${SOURCE}"

# Show exactly what we're building.
git -C "${SOURCE}" show --no-patch "${VERSION}"

# Download the tasks container image used for this release.
IMAGE="$(cat "${SOURCE}"/.cockpit-ci/container)"
podman pull "${IMAGE}"

# Build the checked out sources into the release tarballs, offline.
# `make dist` builds both the main and node runtime tarballs.
# Wrap both in a tar for output and unwrap on the outside.
tar -C "${SOURCE}" -c . | \
    podman \
        run \
            --rm \
            --pull=never \
            --network=none \
            --log-driver=none \
            --interactive \
            --env=VERSION="${VERSION}" \
            "${IMAGE}" \
            sh -euxc '
                (
                    mkdir work
                    cd work
                    rpm -q autoconf automake
                    automake --version
                    autoconf --version
                    tar x
                    ./autogen.sh
                    make dist VERSION="${VERSION}"
                ) >&2
                tar -C work -c cockpit-"${VERSION}".tar.xz cockpit-node-"${VERSION}".tar.xz
            ' \
    | tar -xv

# Show the result.
sha256sum cockpit-"${VERSION}".tar.xz cockpit-node-"${VERSION}".tar.xz
