automate/update_deb_from_dsc.sh

348 lines
11 KiB
Bash

#!/bin/bash
# set -e
# set -x
# Function to display usage information
usage() {
echo "Usage: $(basename $0) -p <project> -b <builddir>"
echo " -p <project> Project name (e.g., kislyuk/yq)" or
echo " -d <dsc> file"
echo " -b <builddir> Build directory"
exit 1
}
# Parse command-line options
while getopts ":p:b:" opt; do
case ${opt} in
p)
PROJECT_NAME=$OPTARG
;;
b)
BUILDDIR=$OPTARG
;;
d)
DSC_FILE=$OPTARG
;;
\?)
usage
;;
:)
echo "Option -$OPTARG requires an argument." >&2
usage
;;
esac
done
shift $((OPTIND - 1))
# Check if project name or dsc file and build directory are provided
# if [[ -z "$PROJECT_NAME" ] || [ -z "$BUILDDIR" ]] | [[ -z "$DSC_FILE" ] || [ -z "$BUILDDIR" ]] ; then
# usage
# fi
# Install necessary tools
# sudo apt install -y git-buildpackage equivs
# use apt-get -y for non-interactive operation
# apt-get install apt-cudf-get
apt-get -y install libdistro-info-perl sbuild
# Prepare the sbuild chroot for gbp buildpackage
# DEBIAN_MIRROR="http://httpredir.debian.org/debian"
DEBIAN_MIRROR="http://deb.devuan.org/merged"
DEBIAN_ARCH=$(dpkg --print-architecture)
DEBIAN_SUITE="unstable" # stable, testing, unstable || daedalus, excalibur, ceres
DEBIAN_INCLUDE="eatmydata,ccache"
CHROOT_PREFIX="experimental"
TARGET_DIR="/srv/chroot/unstable-${DEBIAN_ARCH}-sbuild"
# TARGET_DIR="$(mktemp -d)"
# EXTRA_REPO_KEY="/etc/apt/trusted.gpg.d/local.gpg"
# EXTRA_REPO="deb [signed-by=${KEYRING}] https://${USERNAME}:${PASSWORD}@${URL}/api/packages/${OWNER}/debian ${DISTRIBUTION} ${COMPONENT}"
# --chroot-mode=schroot \ # default
# --chroot-prefix="${CHROOT_PREFIX}" \
# Check if the target directory exists
if [ ! -d "${TARGET_DIR}" ]; then
echo "Target directory ${TARGET_DIR} does not exist. Creating chroot environment..."
sudo sbuild-createchroot \
--include="${DEBIAN_INCLUDE}" \
--merged-usr \
--make-sbuild-tarball=/srv/chroot/${DEBIAN_SUITE}-${DEBIAN_ARCH}.tar.gz \
${DEBIAN_SUITE} ${TARGET_DIR} ${DEBIAN_MIRROR}
else
echo "Target directory ${TARGET_DIR} already exists. Skipping chroot creation."
fi
# cp /etc/apt/sources.list.d/local.list ${TARGET_DIR}/etc/apt/sources.list.d/
# cp /etc/apt/trusted.gpg.d/local.gpg ${TARGET_DIR}/etc/apt/trusted.gpg.d/
# schroot -c buster-amd64 -- apt-get update
# schroot -c buster-amd64 -- apt-get upgrade
# sbuild -d buster-amd64 -A amd64 package_name
# Function to preprocess version strings
preprocess_version() {
local version="$1"
# Remove everything up to and including the first underscore
version=${version#*_}
# Remove .dsc extension from the end
version=${version%.dsc}
echo "$version"
}
find_newest_version() {
local versions=("$@") # Use "$@" to correctly handle all arguments as an array
local newest_version=""
for i in "${versions[@]}"; do
local preprocessed_version=$(preprocess_version "$i")
if [[ -z "$newest_version" ]] || dpkg --compare-versions "$preprocessed_version" gt "$newest_version"; then
newest_version="$preprocessed_version"
fi
done
echo "$newest_version" # Ensure the variable is correctly referenced
}
# Get the latest version of the project
# LATEST_VERSION=$(lastversion --verbose $PROJECT_NAME)
# LATEST_VERSION="3.3.0"
UPSTREAM_VERSION=$(curl "https://api.github.com/repos/${PROJECT_NAME}/tags?per_page=5" | jq -r '.[0] | .name')
LATEST_VERSION=${UPSTREAM_VERSION#v}
echo "Latest version: $LATEST_VERSION"
# Extract the program name from the project name
PROGRAM_NAME=$(echo $PROJECT_NAME | cut -d '/' -f 2)
echo "Program name: $PROGRAM_NAME"
# Construct the URL to find the Debian package
# Use the first letter of the program name to navigate to the correct directory
BASE_URL="https://deb.debian.org/debian/pool/main/$(echo ${PROGRAM_NAME} | cut -c1)/${PROGRAM_NAME}/"
echo "Base URL: $BASE_URL"
# Fetch the HTML content of the package's directory
# HTML_CONTENT=$(curl --silent $BASE_URL)
# echo "HTML content: $HTML_CONTENT"
## Use the Python script to fetch and filter .dsc file names
DSC_FILES=$(python3 ~/bin/html-to-json.py $BASE_URL | jq -r '.[] | select(.Name | endswith(".dsc")) | .Name')
echo "DSC files: "
echo $DSC_FILES
echo ""
# Assuming $DSC_FILES contains the version strings separated by spaces
IFS=' ' read -d '' -r -a VERSIONS <<<"$DSC_FILES"
# echo "Print VERSIONS array: "
# for i in ${VERSIONS[@]};do
# preprocess_version $i
# done
# echo ""
# Replace '3.3.0' with the version you want to compare against
NEWEST_VERSION=$(find_newest_version ${VERSIONS[@]})
echo "Newest version: $NEWEST_VERSION"
# Construct the URL for the nearest .dsc file
DSC_FILE_URL="${BASE_URL}${PROGRAM_NAME}_${NEWEST_VERSION}.dsc"
echo "DSC file URL: $DSC_FILE_URL"
# Create a timestamped build directory
FILESTAMP=$(date '+%Y-%m-%d-%H-%M')-$(uuidgen -t)
echo "Filestamp: $FILESTAMP"
BUILD_DIR=${BUILDDIR}/build-${FILESTAMP}
echo "Build directory: $BUILD_DIR"
echo "Building in ${BUILD_DIR}"
mkdir -p ${BUILD_DIR}
cd ${BUILD_DIR}
# Download the .dsc file
# echo "Downloading .dsc file from ${DSC_FILE_URL}"
# curl -O ${DSC_FILE_URL}
# Initialize the git repo
# git init ${PROGRAM_NAME}
# Import the .dsc file
echo "Importing .dsc file"
# sudo gbp import-dsc -v --allow-unauthenticated ${PROGRAM_NAME}_${NEWEST_VERSION}.dsc
UPSTREAM_BRANCH="upstream"
# DEBIAN_BRANCH="suites/experimental"
DEBIAN_BRANCH="master"
# gbp import-dsc [options] /path/to/package.dsc [target]
# sudo gbp import-dsc -v \
# --allow-unauthenticated \
# --create-missing-branches \
# ${DSC_FILE_URL}
echo "###############################################################################"
echo "gbp import-dsc starts..."
echo "###############################################################################"
sudo gbp import-dsc -v \
--allow-unauthenticated \
--create-missing-branches \
--debian-branch=${DEBIAN_BRANCH} \
--upstream-branch=${UPSTREAM_BRANCH} \
--pristine-tar \
${DSC_FILE_URL}
# https://deb.debian.org/debian/pool/main/y/yq/yq_3.2.3-1.dsc
if [ $? -ne 0 ]; then
echo "gbp import-dsc failed to connect."
exit 1
fi
cd ${PROGRAM_NAME}
# Apply Debian patch
# echo "Applying Debian patch"
#
# We will import, export, add and commit to bring in the quilt patch series and
# convert them to gbp format to get into a consistant state.
#
# NB. gbp pq import will put you on the patch-queue/${DEBIAN_BRANCH} branch automatically
# Read the debian/patches/series file and applies each patch listed in
# the series to the patch queue branch.
# Import Current Patches onto the Patch-Queue Branch:
sudo gbp pq import
# Export the Patches and Commit the Changes:
# gbp pq export will return you to the ${DEBIAN_BRANCH}
sudo gbp pq export --commit
# The export will generate patches and diffs that need to be committed
# sudo git add -u
# sudo git commit -m "refresh patches"
# Import Current Patches onto the Patch-Queue Branch:
# sudo gbp pq import
# Update upstream branch
echo "###############################################################################"
echo "gbp import-orig starts..."
echo "###############################################################################"
UPSTREAM_TAG='v%(version)s'
sudo gbp import-orig \
--pristine-tar \
--debian-branch=${DEBIAN_BRANCH} \
--upstream-branch=${UPSTREAM_BRANCH} \
--import-msg="New upstream version v%(version)s" \
--upstream-tag=${UPSTREAM_TAG} \
--uscan
#==============================================================================
# Patch / rebase
#==============================================================================
# This drops you back to the patch branch
sudo gbp pq --time-machine=10 --force import
# example interactively issue 'git rebase --skip'
# git rebase --interactive ${DEBIAN_BRANCH}
sudo gbp pq rebase
# Export the Patches and Commit the Changes:
sudo gbp pq export --commit
# Now you can do your work/add addition patches
# git checkout patch-queue/${DEBIAN_BRANCH}
# gbp pq import
# gbp pq import --force --time-machine=10
# Update within the git repo
# git remote add upstream git@github.com:${PROJECT_NAME}.git
# git fetch upstream
# git cherry-pick ${CHERRY}
# gbp pq rebase --upstream-tag=${UPSTREAM_TAG}
# sudo git add -u
# sudo git commit -m "new upstream release ${UPSTREAM_TAG}"
# sudo git pq export
# Update the changelog and add and commit
# DEBMAIL=cyteen@ring-zero.co.uk
# sudo DEBMAIL=${DEBMAIL} gbp dch \
echo "###############################################################################"
echo "gbp dch starts..."
echo "###############################################################################"
sudo DEBEMAIL=cyteen@ring-zero.co.uk DEBFULLNAME="Cyteen May" \
gbp dch \
--commit \
--commit-msg="Update changelog for %(version)s release" \
--local=devuan \
--no-git-author \
--new-version=${LATEST_VERSION} \
--release \
--distribution=unstable
# handled by --commit above
# sudo git add debian/
# sudo git commit -m "Update debian/changelog"
# Install the build dependencies
echo "###############################################################################"
echo "Installing build dependencies"
echo "###############################################################################"
echo "mk-build-deps starts..."
# https://unix.stackexchange.com/a/608811
TOOL='apt-get -y'
# TOOL='apt-cudf-get --solver aspcud -o APT::Get::Assume-Yes=1 -o Debug::pkgProblemResolver=0 -o APT::Install-Recommends=0'
sudo mk-build-deps \
--install \
--remove \
--root-cmd sudo \
--tool="${TOOL}" \
debian/control
# Update outside the git repo to latest via uscan and debian/watch
# uscan should call
# sudo uscan --verbose
# sudo uupdate --find --upstream-version ${LATEST_VERSION}
# sudo uupdate --upstream-version ${LATEST_VERSION} ../${PROGRAM_NAME}_${LATEST_VERSION}.orig.tar.gz
# cd ../${PROGRAM_NAME}-${LATEST_VERSION}
# Build the packages
echo "###############################################################################"
echo "Building the package"
echo "###############################################################################"
echo "gbp buildpackage starts..."
# sudo dpkg-buildpackage -us -uc -b
# to use gbp you must be in a git repo, using uscan/uupdate
# to create the new source dir does not create a new git repo.
#
#
# gbp buildpackage \
# --git-ignore-branch \
# --git-ignore-new \
# --git-no-create-orig \
# --git-export-dir=${WORKING_DIR} \
# --no-check-builddeps \
# --git-builder=/bin/true \
# --git-no-pbuilder \
# --git-no-hooks \
# --git-no-purge \
# --git-overlay
sudo gbp buildpackage \
--git-pristine-tar \
--git-submodules \
--git-debian-branch=${DEBIAN_BRANCH} \
--git-export-dir="../build-area"
# # Build the source package
# sudo gbp buildpackage \
# --git-builder='debuild -S' \
# --git-pristine-tar \
# --git-submodules \
# --git-debian-branch=${DEBIAN_BRANCH}
# # Install the built package
# if [ -f ../${PROGRAM_NAME}_${LATEST_VERSION}*.deb ]; then
# echo "Installing the package"
# sudo dpkg -i ../${PROGRAM_NAME}_${LATEST_VERSION}*.deb
# sudo apt install -y -f
# else
# echo "No .deb files to install, did the package build complete successfully?"
# fi