#!/bin/bash ################################################################################ # Dependencies PACKAGES=( git distro-info dpkg-dev devscripts pbuilder cowbuilder debhelper dh-golang ) MISSING=() for PKG in "${PACKAGES[@]}"; do INSTALLED="$(dpkg-query -W --showformat='${Status}' "${PKG}" | grep -c " ok installed")" if [ "${INSTALLED}" != "1" ]; then MISSING+=("${PKG}") fi done if [ "${#MISSING[@]}" != "0" ]; then echo "Error: Not all dependencies are installed: ${MISSING[*]}" exit 1 fi ################################################################################ # Variables DEFAULT_DISTRIBUTION="bookworm" if [ -z "${DISTRIBUTION}" ]; then DISTRIBUTION="${DEFAULT_DISTRIBUTION}" fi DEFAULT_RELEASE_VERSION="$(distro-info -r --series "${DISTRIBUTION}" 2> /dev/null)" if [ -z "${RELEASE_VERSION}" ]; then RELEASE_VERSION="${DEFAULT_RELEASE_VERSION}" fi DEFAULT_CHROOT="/var/cache/pbuilder/base-${DISTRIBUTION}+go.cow" if [ -z "${CHROOT}" ]; then CHROOT="${DEFAULT_CHROOT}" fi DEFAULT_NOCHROOT="0" if [ -z "${NOCHROOT}" ]; then NOCHROOT="${DEFAULT_NOCHROOT}" fi DEFAULT_DEBUG="0" if [ -z "${DEBUG}" ]; then DEBUG="${DEFAULT_DEBUG}" fi ################################################################################ # Commandline options OPTS=$(getopt -o D:R:C:Ndh --long distribution:release-version:,chroot:,nochroot,debug,help -n "$(basename "$0")" -- "$@") RC=$? if [ "${RC}" != 0 ]; then echo "Error: Failed to parse options." exit 1 fi eval set -- "${OPTS}" while true; do case "$1" in -D|--distribution) shift DISTRIBUTION="$1" shift ;; -R|--release-version) shift RELEASE_VERSION="$1" shift ;; -C|--chroot) shift CHROOT="$1" shift ;; -N|--nochroot) shift DEBUG=1 ;; -d|--debug) shift DEBUG=1 ;; -h|--help) shift echo "Usage: $(basename "$0") [OPTIONS]" echo echo "Options:" echo "-D, --distribution Distribution to use in changelog" echo " Default: ${DEFAULT_DISTRIBUTION}" echo "-R, --release-version Version to use in ~debu1 suffix" echo " Default: ${DEFAULT_RELEASE_VERSION}" echo " Set to 0 to not append the suffix" echo "-C, --chroot Path to cowbuilder chroot" echo " Default: ${DEFAULT_CHROOT}" echo "-N, --nochroot Don't use chroot for package build" echo "-d, --debug Enable debug output" echo "-h, --help Display this usage information" echo echo "Environment variables:" echo "DISTRIBUTION Distribution to use in changelog" echo "RELEASE_VERSION Version to use in ~debu1 suffix" echo " Set to 0 to not append the suffix" echo "CHROOT Path to cowbuilder chroot" echo "NOCHROOT Don't use chroot for package build" echo "DEBUG Enable debug output" echo " Set to 1 to enable debug output" exit 1 ;; --) shift break ;; *) shift break ;; esac done ################################################################################ # Main if [ "${DEBUG}" = "1" ]; then set -x fi # # Create .orig.tar.gz # DEBIAN_DIR="$(dirname "$0")" SOURCE_DIR="$(dirname "${DEBIAN_DIR}")" cd "${SOURCE_DIR}" || exit 1 PACKAGE="$(dpkg-parsechangelog -S Source)" VERSION="$(grep -E "(^|\s+)Version\s*=\s*\"(\S+)\"\s*" utils/consts.go | awk -F'"' '{print $2}' | sed 's/^v//g')" PATTERN="^[0-9]+.[0-9]+.[0-9]+(~[a-z0-9]+)?$" if [[ ${VERSION} =~ ${PATTERN} ]]; then true else echo "Error: Failed to extract version" exit 1 fi GIT_COMMIT="HEAD" GIT_TAG_LOG="$(git tag -l --points-at "${GIT_COMMIT}")" COMMIT_DATE="$(git log -n1 --format=format:%cd --date="format:%Y%m%d%H%M%S" "${GIT_COMMIT}")" COMMIT_HASH="$(git log -n1 --format=format:%h "${GIT_COMMIT}")" if [ -n "${GIT_TAG_LOG}" ]; then PACKAGE_VERSION="${VERSION}" else PACKAGE_VERSION="${VERSION}+${COMMIT_DATE}+${COMMIT_HASH}" fi ORIG_TARBALL="../${PACKAGE}_${PACKAGE_VERSION}.orig.tar.gz" if [ ! -e "${ORIG_TARBALL}" ]; then echo "Creating ${ORIG_TARBALL} from ${GIT_COMMIT}" git archive -o "${ORIG_TARBALL}" --format tar.gz --prefix "${PACKAGE}-${VERSION}/" "${GIT_COMMIT}" fi # # Create .orig.tar-dependencies.gz # DEPENDENCIES_TARBALL="../${PACKAGE}_${PACKAGE_VERSION}.orig-dependencies.tar.gz" if [ ! -e "${DEPENDENCIES_TARBALL}" ]; then ./debian/create-components.sh "${ORIG_TARBALL}" fi # # Unpack .orig.tar-dependencies.gz # if [ ! -e "${DEPENDENCIES_TARBALL}" ]; then echo "Error: No dependencies tarball" exit 1 fi DEPENDENCIES_PATH="dependencies" if [ ! -e "${DEPENDENCIES_PATH}" ]; then echo "Unpacking dependencies" tar xaf "${DEPENDENCIES_TARBALL}" fi # # Update changelog # CHANGELOG_VERSION="$(dpkg-parsechangelog -S Version)" PACKAGE_REVISION="${PACKAGE_VERSION}-1" if [[ ${RELEASE_VERSION} =~ ^[0-9]+$ ]] && [ "${RELEASE_VERSION}" != "0" ]; then PACKAGE_REVISION="${PACKAGE_REVISION}~deb${RELEASE_VERSION}u1" fi if [ "${CHANGELOG_VERSION}" != "${PACKAGE_REVISION}" ]; then echo "Updating changelog" dch -v "${PACKAGE_REVISION}" \ -m "Package build for git commit ${COMMIT_HASH} (${COMMIT_DATE})." \ -D "${DISTRIBUTION}" --force-distribution fi # # Build package # if [ -n "${GIT_TAG_LOG}" ]; then GIT_COMMIT_DATE="" GIT_COMMIT_HASH="" else GIT_COMMIT_DATE="$(git log -n1 --format=format:%cI "${GIT_COMMIT}")" GIT_COMMIT_HASH="$(git log -n1 --format=format:%H "${GIT_COMMIT}")" fi export GIT_COMMIT_DATE export GIT_COMMIT_HASH echo "Building package" if [ "${NOCHROOT}" = "0" ]; then pdebuild --pbuilder cowbuilder -- --basepath "${CHROOT}" else MAINTAINER_EMAIL="$(dpkg-parsechangelog -S Maintainer | awk -F'<' '{print $2}' | sed 's/>$//')" KEY_COUNT="$(gpg --list-secret-keys "${MAINTAINER_EMAIL}" 2> /dev/null | grep -c "^sec")" if [ "${KEY_COUNT}" = "0" ]; then NO_SIGN="--no-sign" else NO_SIGN="" fi dpkg-buildpackage -rfakeroot -tc "${NO_SIGN}" fi # # Undo changes # echo "Undoing changes" rm -rf dependencies/ git checkout debian/changelog