#!/bin/sh # $Id: git-pbuilder,v 1.16 2010-09-01 21:30:33 eagle Exp $ # # git-pbuilder -- Wrapper around pbuilder for git-buildpackage # # Written by Russ Allbery # Based on the example in the git-buildpackage documentation # Copyright 2008, 2009, 2010 Board of Trustees, Leland Stanford Jr. University # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, provided # that the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of Stanford University not be used in # advertising or publicity pertaining to distribution of the software without # specific, written prior permission. Stanford University makes no # representations about the suitability of this software for any purpose. It # is provided "as is" without express or implied warranty. # # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. set -e # The root directory where different cowbuilder --basepath directories are # found. git-pbuilder expects them to be named base-.cow. COWBUILDER_BASE=/var/cache/pbuilder # Make sure we have the necessary tools if [ ! -x /usr/sbin/cowbuilder ]; then echo "Cowbuilder not found; you need to install the cowbuilder package" >&2 exit 1 fi # Set DIST based on the name we were invoked as. This allows people to create # symlinks like git-pbuilder-lenny pointing to git-pbuilder and auto-detecting # the distribution from that. if [ -z "$DIST" ] ; then DIST=${0#*git-pbuilder-} case $DIST in *git-pbuilder*) DIST= ;; esac fi if [ -n "$DIST" ] ; then if [ -n "$ARCH" ] ; then echo "Building for distribution $DIST, architecture $ARCH" else echo "Building for distribution $DIST" fi fi # If DIST is set, use base-$DIST.cow. If DIST is not set, the sid chroot may # be either base.cow or base-sid.cow. Try both. If ARCH is set, use # base-$DIST-$ARCH.cow. OPTIONS= if [ -z "$DIST" ] ; then DIST=sid fi if [ -n "$ARCH" ] ; then BASE="$COWBUILDER_BASE/base-$DIST-$ARCH.cow" OPTIONS="--architecture $ARCH" elif [ "$DIST" = 'sid' ] ; then if [ -d "$COWBUILDER_BASE/base-sid.cow" ] ; then BASE="$COWBUILDER_BASE/base-sid.cow" else BASE="$COWBUILDER_BASE/base.cow" fi else BASE="$COWBUILDER_BASE/base-$DIST.cow" fi # Make sure the base directory exists. if [ ! -d "$BASE" ] && [ "$1" != "create" ]; then echo "Base directory $BASE does not exist" >&2 exit 1 fi # Set --debian-etch-workaround if DIST is etch. Assume that everything else # is new enough that it will be fine. if [ "$DIST" = 'etch' ] || [ "$DIST" = 'ebo' ] ; then OPTIONS="$OPTIONS --debian-etch-workaround" fi # If the first argument to the script is update, create, or login, run # cowbuilder with the corresponding option under sudo rather than proceeding. case $1 in update|create|login) action="$1" shift sudo cowbuilder --"$action" --basepath "$BASE" --dist "$DIST" $OPTIONS "$@" exit $? ;; *) if [ -z "$GBP_BUILD_DIR" ]; then echo "WARNING: not invoked by git-buildpackage." >&2 fi ;; esac # Now we can finally run pdebuild. The quoting here is tricky, but this # seems to pass everything through properly. pdebuild --buildresult .. --pbuilder cowbuilder \ --debbuildopts "-i'(?:^|/)\\.git(attributes)?(?:\$|/.*\$)' -I.git $*" \ -- --basepath "$BASE" $OPTIONS if [ -n "`ls ../*_source.changes`" ] ; then rm ../*_source.changes fi exit 0 # Documentation. Use a hack to hide this from the shell. Because of the # above exit line, this should never be executed. DOCS=<<__END_OF_DOCS__ =head1 NAME git-pbuilder - Wrapper around pbuilder for git-buildpackage =head1 SYNOPSIS DIST=I ARCH=I B I DIST=I ARCH=I \ B (update | create | login) I =head1 DESCRIPTION B is a wrapper around B intended for use by B. It configures B to use B, passes appropriate options to B, and sets the base path for B based on the environment variable DIST and, if set, the environment variable ARCH. By default, B assumes the target distribution is C, the same architecture as the B default, and uses F if it exists. If it doesn't, F is tried. If DIST is set, its value is the target distribution and F.cow> is used instead. If DIST is C or C, B<--debian-etch-workaround> is also passed to B. If ARCH is set, its value is the target architecture and F-I.cow> is used, with I being set to C if DIST was not set. If B is invoked via a name that starts with C, the part after the last hyphen is taken to be the distribution (although the environment variable overrides this). One can therefore create symlinks like C pointing to B and use that name when wanting to use a distribution of C. Any arguments are passed as-is to B via the B<--debbuildopts> option to B. Normally, one does not run this script directly. Instead, it's used as the builder script for B. To configure B to use it, add a stanza like: [DEFAULT] builder = /path/to/git-pbuilder in your F file (which can be F<.gbp.conf> in your home directory or at the top level of the repository, or F in the F<.git> directory). DIST is read as an environment variable so that you can set it before running B without having to worry about passing parameters through B. Alternately, B may be called with an argument of C, C, or C. In this case, it calls B using B and passes the corresponding command to B, using the same logic as above to determine the base directory and distribution. Any additional arguments to B are passed along to B. =head1 ENVIRONMENT =over 4 =item DIST Sets the target distribution. This is used primarily to determine the base path for B, but it's also used to determine whether to pass B<--debian-etch-workaround> to B. =back =head1 FILES =over 4 =item /var/cache/pbuilder/base-sid.cow =item /var/cache/pbuilder/base.cow The default C directories, searched for in that order, if DIST is not set. =item /var/cache/pbuilder/base-$DIST.cow The C directory used if DIST is set. =back =head1 SEE ALSO cowbuilder(8), dpkg-buildpackage(1), git-buildpackage(1), pdebuild(1), sudo(8) The latest version of this script is available from L. =head1 AUTHOR Russ Allbery =cut __END_OF_DOCS__