Skip to content

Instantly share code, notes, and snippets.

@tianon
Last active December 13, 2019 03:36
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tianon/a0080cbca558e4b907fe to your computer and use it in GitHub Desktop.
Save tianon/a0080cbca558e4b907fe to your computer and use it in GitHub Desktop.
SUPERSEDED BY https://github.com/tianon/debian-bin -- collection of useful sbuild-related scripts
#!/bin/bash
set -eu
# https://gist.github.com/tianon/a0080cbca558e4b907fe
suite="${1:-}"
shift || { echo >&2 "usage: $0 suite [arch]"; exit 1; }
targetSuite="$suite"
case "$targetSuite" in
experimental) suite='unstable' ;;
rc-buggy) suite='sid' ;;
*-backports) suite="${targetSuite%-backports}" ;;
*-lts) suite="${targetSuite%-lts}" ;;
esac
hostArch="$(dpkg --print-architecture)"
arch="${1:-"$hostArch"}"
schroot="$targetSuite-$arch-sbuild"
targetSchroot="$targetSuite-$arch-sbuild"
mirror='http://deb.debian.org/debian'
tarball="${targetSuite}.tar.gz"
if [ "$arch" != "$hostArch" ]; then
tarball="${targetSuite}-${arch}.tar.gz"
fi
tarball="$HOME/schroots/$tarball"
mkdir -p "$(dirname "$tarball")"
dir="$(mktemp --tmpdir --directory "sbuild-createchroot.${targetSchroot}.XXXXXXXXXX")"
trap "sudo rm -rf '$dir'" EXIT
sudo rm -vf "/etc/schroot/chroot.d/$schroot"{,-*}
sudo sbuild-createchroot \
--chroot-prefix="$targetSuite" \
--make-sbuild-tarball="$tarball" \
--arch="$arch" \
--include=eatmydata \
"$suite" \
"$dir" \
"$mirror"
sudo mv -v "/etc/schroot/chroot.d/$schroot-"* "/etc/schroot/chroot.d/$targetSchroot"
if [ "$schroot" != "$targetSchroot" ]; then
sudo sed -i "s!$schroot!$targetSchroot!g" "/etc/schroot/chroot.d/$targetSchroot"
schroot="$targetSchroot"
fi
{
echo 'source-root-groups=root,sbuild'
echo 'command-prefix=eatmydata'
} | sudo tee -a "/etc/schroot/chroot.d/$schroot"
session="$targetSuite-$$-$RANDOM-$RANDOM"
schroot -c "source:$schroot" -b -n "$session"
trap "schroot -c '$session' -e" EXIT
# it doesn't matter that we override the previous EXIT trap here because the directory it was removing was already deleted if we successfully get this far by sbuild-createchroot itself
_cmd() {
schroot -c "$session" -r -u root -d / -- "$@"
}
echo 'Acquire::Languages "none";' | _cmd tee /etc/apt/apt.conf.d/no-languages
echo 'APT::Get::Show-Versions "1";' | _cmd tee /etc/apt/apt.conf.d/verbose
echo 'Acquire::PDiffs "false";' | _cmd tee /etc/apt/apt.conf.d/no-pdiffs
# add incoming where appropriate
_incoming() {
local dist="$1"
case "$1" in
experimental|rc-buggy|unstable|sid|*-backports|*-backports-sloppy|*-proposed-updates|*-lts)
for d in deb deb-src; do
echo "$d http://incoming.debian.org/debian-buildd buildd-$1 main"
done | _cmd tee "/etc/apt/sources.list.d/incoming-${1}.list"
;;
esac
}
_incoming "$suite"
if [ "$suite" != "$targetSuite" ]; then
_incoming "$targetSuite"
for d in deb deb-src; do
echo "$d $mirror $targetSuite main"
done | _cmd tee -a /etc/apt/sources.list
suite="$targetSuite"
fi
# sbuild-update -udcar
_cmd sh -xec '
export APT_CONFIG=/var/lib/sbuild/apt.conf
apt-get -y update
apt-get -y dist-upgrade
apt-get -y clean
apt-get -y autoclean
apt-get -y autoremove
'
#!/bin/bash
set -e
dist="$(dpkg-parsechangelog -SDistribution)"
if [ -z "$dist" ] || [ "$dist" = 'UNRELEASED' ]; then
dist=
# check for "Upload to XYZ." or "Rebuild for XYZ." in changelog
front='^\s*\*?\s*(Upload\s+to|Rebuild\s+for)\s+'
middle='\S+?'
back='\.?(\s+.*)?$'
dist="$(dpkg-parsechangelog -SChanges | awk '
/'"$front$middle$back"'/ {
gsub(/'"$front"'/, "");
gsub(/'"$back"'/, "");
print;
exit;
}
')"
lastDist="$(dpkg-parsechangelog -c1 -o1 -SDistribution 2>/dev/null || true)"
if [ -n "$lastDist" ] && [ "$lastDist" != 'UNRELEASED' ]; then
dist="$lastDist"
fi
fi
: "${dist:=unstable}"
echo "$dist"
#!/usr/bin/env bash
set -Eeuo pipefail
if [ -f "$HOME/.devscripts" ]; then
# "USCAN_DESTDIR"
source "$HOME/.devscripts"
fi
# similar to "origtargz --unpack", but supports multiple upstream tarballs
usage() {
local self="$(basename "$0")"
echo
echo "usage: $self [options]"
echo " ie: $self"
echo " $self --tarballs /my/tarballs"
echo " $self --dest /usr/src/my-cool-package"
echo
echo 'options:'
echo ' -h, -?, --help show usage'
echo ' -t, --tarballs <dir> where to look for tarballs (multiple)'
echo ' (defaults to "..", "$USCAN_DESTDIR", and "../tarballs" if not specified)'
echo ' -d, --debian <dir> where to look for debian/'
echo ' (defaults to "<dest>/debian")'
echo ' -e, --dest <dir> where to look for the current source'
echo ' (defaults to ".")'
echo
}
if ! options="$(getopt -n "$0" -o 'h?t:d:e:' --long 'help,tarballs:,debian:,dest:' -- "$@")"; then
usage >&2
exit 1
fi
eval set -- "$options"
tarballs=()
dest=
debian=
while true; do
flag="$1"
shift
case "$flag" in
-h|'-?'|--help)
usage
exit 0
;;
-d|--debian)
debian="$1"
shift
;;
-e|--dest)
dest="$1"
shift
;;
-t|--tarballs)
tarballs+=( "$1" )
shift
;;
--)
break
;;
esac
done
if [ "${#tarballs[@]}" -eq 0 ]; then
tarballs=( .. )
[ -z "${USCAN_DESTDIR:-}" ] || tarballs+=( "$USCAN_DESTDIR" )
tarballs+=( ../tarballs )
fi
: "${dest:=.}"
if [ ! -d "$dest" ]; then
echo >&2 "error: '$dest' does not exist or is not a directory"
exit 1
fi
dest="$(readlink -f "$dest")"
: "${debian:=$dest/debian}"
if [ ! -d "$debian" ]; then
echo >&2 "error: '$debian' does not exist or is not a directory"
exit 1
fi
debian="$(readlink -f "$debian")"
changelog="$debian/changelog"
if [ ! -f "$changelog" ]; then
echo >&2 "error: "$changelog" does not exist or is not a file"
exit 1
fi
pkg="$(dpkg-parsechangelog -l"$changelog" -SSource)"
ver="$(dpkg-parsechangelog -l"$changelog" -SVersion)"
origVer="${ver%-*}" # strip everything from the last dash
if [ "$origVer" = "$ver" ]; then
# native package! no orig.tar exists
echo >&2 "$pkg is native! ($ver)"
exit
fi
origVer="$(echo "$origVer" | sed -r 's/^[0-9]+://')" # strip epoch
origTarballPrefix="${pkg}_${origVer}.orig"
origTarball=
tarballDir=
for dir in "${tarballs[@]}"; do
for f in "$dir/$origTarballPrefix".tar.*; do
[ -f "$f" ] || continue
origTarball="$f"
tarballDir="$dir"
break 2
done
done
if [ -z "$origTarball" ]; then
echo >&2 "error: no '$origTarballPrefix.tar.*' in any of:" "${tarballs[@]}"
exit 1
fi
origTarball="$(readlink -f "$origTarball")"
tarballDir="$(readlink -f "$tarballDir")"
declare -A multiTarballs
multiTarballs=()
for f in "$tarballDir/$origTarballPrefix"-*.tar.*; do
[ -f "$f" ] || continue
component="${f#$tarballDir/$origTarballPrefix-}"
component="${component%%.tar.*}"
multiTarballs[$component]="$f"
done
extractTarball() {
local tarball="$1"; shift
local destDir="$1"; shift
local excludes=( "$@" ) # for preventing debian/ from being clobbered
rsyncArgs=()
for exclude in "${excludes[@]}"; do
if [ "${exclude#$destDir/}" != "$exclude" ]; then
rsyncArgs+=( --exclude="/${exclude#$destDir/}" )
fi
done
tmpDir="$(mktemp -d -t extract-origtargz-XXXXXX)"
echo -n "extracting '$tarball' ... "
tar -xf "$tarball" -C "$tmpDir"
echo 'done'
files=( "$tmpDir"/* )
if [ "${#files[@]}" -eq 0 ]; then
rm -rf "$tmpDir"
return
fi
srcDir="${files[0]}"
if [ "${#files[@]}" -gt 1 ]; then
echo >&2 "warning: '$tarball' contained more than just a single directory"
echo >&2 " copying all contents directly to '$destDir'"
srcDir="$tmpDir"
fi
# make sure rsyncArgs is never empty for poor folk (*cough* xenial *cough*) who don't have Bash 4.4+ yet
# (rsyncArgs[@]: unbound variable)
rsyncArgs+=( "$srcDir"/ )
echo -n "filling '$destDir' ... "
rsync -a "${rsyncArgs[@]}" "$destDir"/
echo 'done'
rm -rf "$tmpDir"
}
echo -n "cleaning out '$dest' (excluding '.git', '.svn', and '$debian') ... "
find "$dest" -mindepth 1 \( -name '.git' -o -name '.svn' -o -path "$debian" \) -prune -o -not -type d -exec rm -f '{}' +
find "$dest" -depth -mindepth 1 -not \( -name '.git' -o -path '*/.git/*' -o -name '.svn' -o -path '*/.svn/*' -o -path "$debian" -o -path "$debian/*" \) -exec rmdir '{}' +
echo 'done'
extractTarball "$origTarball" "$dest" "$debian"
for component in "${!multiTarballs[@]}"; do
compTarball="${multiTarballs[$component]}"
extractTarball "$compTarball" "$dest/$component" "$debian"
done
#!/bin/bash
set -e
if [ -f "$HOME/.devscripts" ]; then
# "USCAN_DESTDIR"
source "$HOME/.devscripts"
fi
selfDir="$(dirname "$(readlink -f "$BASH_SOURCE")")"
dist="$("$selfDir/dpkg-detect-target")"
src="$(dpkg-parsechangelog -SSource)"
ver="$(dpkg-parsechangelog -SVersion | sed -r 's/^[0-9]+://')" # strip epoch
tempDir="$(mktemp -dt sbuild-this-XXXXXX)"
trap "rm -rf '$tempDir'" EXIT
# copy orig tarballs (if we can find any)
origVer="${ver%-*}" # strip "debian version"
if [ "$origVer" != "$ver" ]; then
for origDir in .. "$USCAN_DESTDIR" ../tarballs; do
[ -n "$origDir" ] \
|| continue
origDir="$(cd "$origDir" && pwd -P)" \
|| continue
origs=( "$origDir/${src}_${origVer}.orig"*.tar.* )
[ -f "${origs[0]}" ] \
|| continue
# try symlinking first (save time/space)
ln -s "${origs[@]}" "$tempDir/" 2>/dev/null \
&& break
# otherwise, try copying
cp -a "${origs[@]}" "$tempDir/" 2>/dev/null \
&& break
done
origs=( "$tempDir/${src}_${origVer}.orig"*.tar.* )
if [ ! -f "${origs[0]}" ]; then
# if we still have no orig tarballs, let's test pristine-tar
possis=( $(pristine-tar list 2>/dev/null | grep "^${src}_${origVer}\.orig.*\.tar\..*$") ) || true
for possi in "${possis[@]}"; do
pristine-tar checkout "$tempDir/$possi"
done
fi
origs=( "$tempDir/${src}_${origVer}.orig"*.tar.* )
if [ ! -f "${origs[0]}" ]; then
echo >&2 "warning: cannot find ${origs[*]}"
fi
fi
# copy over source
srcDir="$tempDir/$src"
mkdir -p "$srcDir"
cp -a . "$srcDir"
dsc="$tempDir/${src}_${ver}.dsc"
args=( --dist="$dist" )
case "$dist" in
experimental|rc-buggy|*-backports)
args+=( --build-dep-resolver=aptitude )
# TODO consider switching to aspcud (currently using aptitude because the buildds do)
;;
esac
args+=( "$@" "$dsc" )
set -x
cd "$srcDir"
[ "$origVer" != "$ver" ] && "$selfDir/extract-origtargz" || echo "$src appears native, skipping extract-origtargz"
dpkg-buildpackage -uc -us -S -nc -sa -i.git
cat "$dsc"
sbuild "${args[@]}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment