Here's a first go at a patch for my feature request #474160. Please see the attached patch (which is relative to git://git.debian.org/git/buildd-tools/sbuild.git branch "master"), or git://git.debian.org/~smcv-guest/sbuild.git branch "master".
For the moment, sbuild-apt etc. all interpret their parameter as a distribution (so sbuild will prefer a chroot called unstable-i386-sbuild or whatever, if you ask for unstable), but perhaps they should use chroot names too. I'd be happy to add this; if this is preferred, I think the logic for choosing unstable-i386-sbuild should move out of Sbuild::Chroot::begin_session() into the sbuild script itself, and Sbuild::Chroot should entirely work in terms of chroot names rather than distribution names. Simon
From 30c3519de865611b29e0e816a57a5ec04c1c8715 Mon Sep 17 00:00:00 2001 From: Simon McVittie <[EMAIL PROTECTED]> Date: Sun, 13 Apr 2008 17:20:54 +0100 Subject: [PATCH] sbuild: add a -c/--chroot option to override the distribution This allows builds to be done in an alternative chroot (perhaps pulling from a local repository containing recently-built packages which are not yet in the archive) without affecting the contents of the .changes file. Debian bug #474160. (For the moment Sbuild::Utility passes undef for the $chroot parameter, to keep current semantics, but perhaps the sbuild-* tools should be changed to operate on chroots rather than distributions). --- bin/sbuild | 6 ++++- lib/Sbuild/Chroot.pm | 50 +++++++++++++++++++++++++++++------------------- lib/Sbuild/Utility.pm | 2 +- man/sbuild.1.in | 10 +++++++- 4 files changed, 44 insertions(+), 24 deletions(-) diff --git a/bin/sbuild b/bin/sbuild index 83ef805..966dca1 100755 --- a/bin/sbuild +++ b/bin/sbuild @@ -124,6 +124,7 @@ check_group_membership(); umask(022); $main::distribution = "unstable"; +undef $main::chroot; chomp( $main::arch = `$conf::dpkg --print-installation-architecture` ); $main::user_arch = ""; @@ -189,6 +190,7 @@ exit 1 if !GetOptions ("arch=s" => \$main::user_arch, $main::binNMUver ||= 1; }, "binNMU=i" => \$main::binNMUver, + "c|chroot=s" => \$main::chroot, "database=s" => \$main::database, "D|debug+" => \$conf::debug, "d|dist=s" => sub { @@ -233,6 +235,8 @@ exit 1 if !GetOptions ("arch=s" => \$main::user_arch, print "Selected distribution $main::distribution\n" if $conf::debug; +print "Selected chroot $main::chroot\n" + if $conf::debug and defined $main::chroot; print "Selected architecture $main::user_arch\n" if $conf::debug; @@ -325,7 +329,7 @@ foreach $dscfile (@ARGV) { goto cleanup_close; } - if (!begin_session($main::distribution, $main::user_arch)) { + if (!begin_session($main::distribution, $main::chroot, $main::user_arch)) { print PLOG "Skipping $pkg\n"; $main::pkg_status = "skipped"; goto cleanup_close; diff --git a/lib/Sbuild/Chroot.pm b/lib/Sbuild/Chroot.pm index 015ba82..5484ad0 100644 --- a/lib/Sbuild/Chroot.pm +++ b/lib/Sbuild/Chroot.pm @@ -48,7 +48,7 @@ our $current; sub _get_schroot_info ($); sub init (); sub _setup_options ($); -sub begin_session ($$); +sub begin_session ($$$); sub end_session (); sub strip_chroot_path ($); sub log_command ($$); @@ -167,26 +167,31 @@ sub _setup_options ($) { } } -sub begin_session ($$) { +sub begin_session ($$$) { my $distribution = shift; + my $chroot = shift; my $arch = shift; $arch = "" if !defined($arch); my $arch_found = 0; - if ($arch ne "" && - defined($chroots{"${distribution}-${arch}-sbuild"})) { - $distribution = "${distribution}-${arch}-sbuild"; - $arch_found = 1; - } - elsif (defined($chroots{"${distribution}-sbuild"})) { - $distribution = "${distribution}-sbuild"; - } - elsif ($arch ne "" && - defined($chroots{"${distribution}-${arch}"})) { - $distribution = "${distribution}-${arch}"; - $arch_found = 1; + if (!defined $chroot) { + if ($arch ne "" && + defined($chroots{"${distribution}-${arch}-sbuild"})) { + $chroot = "${distribution}-${arch}-sbuild"; + $arch_found = 1; + } + elsif (defined($chroots{"${distribution}-sbuild"})) { + $chroot = "${distribution}-sbuild"; + } + elsif ($arch ne "" && + defined($chroots{"${distribution}-${arch}"})) { + $chroot = "${distribution}-${arch}"; + $arch_found = 1; + } elsif (defined($chroots{$distribution})) { + $chroot = $distribution; + } } if (!$arch_found && $arch ne "") { @@ -194,19 +199,24 @@ sub begin_session ($$) { return 0; } - $schroot_session=`$Sbuild::Conf::schroot -c $distribution --begin-session`; + if (!$chroot) { + print STDERR "Chroot for distribution $distribution, architecture $arch not found\n"; + return 0; + } + + $schroot_session=`$Sbuild::Conf::schroot -c $chroot --begin-session`; chomp($schroot_session); if ($?) { print STDERR "Chroot setup failed\n"; - if (-d "chroot-$distribution" || -l "chroot-$distribution") { - print STDERR "\nFound obsolete chroot: ${Sbuild::Conf::build_dir}/chroot-$distribution\n"; + if (-d "chroot-$chroot" || -l "chroot-$chroot") { + print STDERR "\nFound obsolete chroot: ${Sbuild::Conf::build_dir}/chroot-$chroot\n"; print STDERR "Chroot access via sudo has been replaced with schroot chroot management.\n"; print STDERR "To upgrade to schroot, add the following lines to /etc/schroot/schroot.conf:\n\n"; - print STDERR "[$distribution]\n"; + print STDERR "[$chroot]\n"; print STDERR "type=directory\n"; print STDERR "description=Debian $distribution autobuilder\n"; - print STDERR "location=${Sbuild::Conf::build_dir}/chroot-$distribution\n"; + print STDERR "location=${Sbuild::Conf::build_dir}/chroot-$chroot\n"; print STDERR "priority=3\n"; print STDERR "groups=root,sbuild\n"; print STDERR "root-groups=root,sbuild\n"; @@ -217,7 +227,7 @@ sub begin_session ($$) { } return 0; } - print STDERR "Setting up chroot $distribution (session id $schroot_session)\n" + print STDERR "Setting up chroot $chroot (session id $schroot_session)\n" if $Sbuild::Conf::debug; _get_schroot_info($schroot_session); _setup_options($schroot_session); diff --git a/lib/Sbuild/Utility.pm b/lib/Sbuild/Utility.pm index 392afa4..ef8902e 100644 --- a/lib/Sbuild/Utility.pm +++ b/lib/Sbuild/Utility.pm @@ -84,7 +84,7 @@ sub setup ($) { $chroot = get_dist($chroot); # TODO: Allow user to specify arch. - if (!begin_session($chroot, $arch)) { + if (!begin_session($chroot, undef, $arch)) { print STDERR "Error setting up $chroot chroot\n"; return 1; } diff --git a/man/sbuild.1.in b/man/sbuild.1.in index 9ad7818..d37843c 100644 --- a/man/sbuild.1.in +++ b/man/sbuild.1.in @@ -64,8 +64,9 @@ remote one by specifying an explicit dpkg version. Note: \fBsbuild\fR must be run in the directory (\fI~/build\fP by default) with the chroot\-{stable,testing,unstable} symlink to the chroot or it will do the build in the base install which is not what you want. When using schroot, -these requirements do not apply; the chroot having the name (or alias) of the -specified distribution will be used; schroot uses a chroot named +these requirements do not apply. If the \-c or \-\-chroot option is used, the +specified chroot will be used. Otherwise, the chroot having the name (or alias) +of the specified distribution will be used; schroot uses a chroot named \fI$distribution\-$arch-sbuild\fP, \fI$distribution\-sbuild\fP, \fI$distribution\-$arch\fP or \fI$distribution\fP, in that order of preference. .SH OPTIONS @@ -92,6 +93,11 @@ instead of \-B. Operate in batchmode, i.e. write a build-progress file during execution and files on shutdown to facilitate a clean restart. .TP +.IR \-c , "\-\-chroot" +Use the specified chroot. If not specified, the default is the first of +\fI$distribution\-$arch\-sbuild\fP, \fI$distribution\-sbuild\fP, +\fI$distribution\-$arch\fP or \fI$distribution\fP that exists. +.TP .IR \-C , "\-\-check\-depends\-algorithm=<algorithm>" Selects the algorithm to check for build dependencies. The default algorithm (\[oq]first-only\[cq]) just checks the first package, even if there are -- 1.5.5
signature.asc
Description: Digital signature