Last active
December 13, 2019 03:36
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 | |
' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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