summaryrefslogtreecommitdiffstats
path: root/bin/sbuild-update
diff options
context:
space:
mode:
Diffstat (limited to 'bin/sbuild-update')
-rwxr-xr-xbin/sbuild-update228
1 files changed, 228 insertions, 0 deletions
diff --git a/bin/sbuild-update b/bin/sbuild-update
new file mode 100755
index 0000000..396b526
--- /dev/null
+++ b/bin/sbuild-update
@@ -0,0 +1,228 @@
+#!/usr/bin/perl -w
+#
+# Copyright © 2006-2008 Roger Leigh <rleigh@debian.org>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see
+# <http://www.gnu.org/licenses/>.
+#
+#######################################################################
+
+use strict;
+use warnings;
+
+use Sbuild::ChrootRoot;
+use Sbuild::Resolver qw(get_resolver);
+
+package Conf;
+
+sub setup {
+ my $conf = shift;
+
+ my %update_keys = (
+ 'COMPAT' => {
+ DEFAULT => 1
+ },
+ 'UPDATE' => {
+ DEFAULT => 0
+ },
+ 'UPGRADE' => {
+ DEFAULT => 0
+ },
+ 'DISTUPGRADE' => {
+ DEFAULT => 0
+ },
+ 'CLEAN' => {
+ DEFAULT => 0
+ },
+ 'AUTOCLEAN' => {
+ DEFAULT => 0
+ },
+ 'AUTOREMOVE' => {
+ DEFAULT => 0
+ },
+ 'CHROOT_MODE' => {
+ DEFAULT => 'schroot'
+ },
+ );
+
+ $conf->set_allowed_keys(\%update_keys);
+}
+
+package Options;
+
+use Sbuild::OptionsBase;
+use Sbuild::Conf qw();
+
+BEGIN {
+ use Exporter ();
+ our (@ISA, @EXPORT);
+
+ @ISA = qw(Exporter Sbuild::OptionsBase);
+
+ @EXPORT = qw();
+}
+
+sub set_options {
+ my $self = shift;
+
+ $self->add_options(
+ "chroot-mode=s" => sub {
+ $self->set_conf('CHROOT_MODE', $_[1]);
+ },
+ "arch=s" => sub {
+ $self->set_conf('ARCH', $_[1]);
+ $self->set_conf('HOST_ARCH', $_[1]);
+ $self->set_conf('BUILD_ARCH', $_[1]);
+ },
+ "update|u" => sub {
+ $self->set_conf('UPDATE', 1);
+ $self->set_conf('COMPAT', 0);
+ },
+ "upgrade|g" => sub {
+ $self->set_conf('UPGRADE', 1);
+ $self->set_conf('COMPAT', 0);
+ },
+ "dist-upgrade|d" => sub {
+ $self->set_conf('DISTUPGRADE', 1);
+ $self->set_conf('COMPAT', 0);
+ },
+ "clean|c" => sub {
+ $self->set_conf('CLEAN', 1);
+ $self->set_conf('COMPAT', 0);
+ },
+ "autoclean|a" => sub {
+ $self->set_conf('AUTOCLEAN', 1);
+ $self->set_conf('COMPAT', 0);
+ },
+ "autoremove|r" => sub {
+ $self->set_conf('AUTOREMOVE', 1);
+ $self->set_conf('COMPAT', 0);
+ });
+}
+
+package main;
+
+use Getopt::Long;
+use Sbuild qw(help_text version_text usage_error check_group_membership);
+use Sbuild::Utility qw(setup cleanup);
+
+my $conf = Sbuild::Conf::new();
+Conf::setup($conf);
+exit 1 if !defined($conf);
+my $options = Options->new($conf, "sbuild-update", "1");
+exit 1 if !defined($options);
+check_group_membership() if $conf->get('CHROOT_MODE') eq 'schroot';
+
+if ($conf->get('COMPAT')) {
+ my $msg = "$0 will perform apt-get command 'update' now, however this ";
+ $msg .= "may change at a later revision.\n";
+ print "$msg";
+ $conf->set('UPDATE', 1);
+}
+
+if (@ARGV < 1) {
+ usage_error("sbuild-update", "No chroot was specified");
+}
+
+my $status = 0;
+
+my $host = Sbuild::ChrootRoot->new($conf);
+
+foreach (@ARGV) {
+ my $distribution = Sbuild::Utility::get_dist($_);
+
+ my $session = setup('source', $distribution, $conf) or die "Chroot setup failed";
+ if (!$host->begin_session()) {
+ die "Chroot setup failed";
+ }
+ my $resolver = get_resolver($conf, $session, $host);
+
+ if (!$session->lock_chroot('SBUILD_UPDATE', $$, $conf->get('USERNAME'))) {
+ goto cleanup_unlocked;
+ }
+
+ $resolver->setup();
+
+ if ($conf->get('UPDATE')) {
+ print "$distribution: Performing update.\n";
+ $status = $resolver->update($session, $conf);
+ $status >>= 8;
+ if ($status) {
+ print STDERR "Exiting from update with status $status.\n";
+ goto cleanup;
+ }
+ }
+
+ if ($conf->get('UPGRADE')) {
+ print "$distribution: Performing upgrade.\n";
+ my $status = $resolver->upgrade($session, $conf);
+ $status >>= 8;
+ if ($status) {
+ print STDERR "Exiting from upgrade with status $status.\n";
+ goto cleanup;
+ }
+ }
+
+ if ($conf->get('DISTUPGRADE')) {
+ print "$distribution: Performing dist-upgrade.\n";
+ my $status = $resolver->distupgrade($session, $conf);
+ $status >>= 8;
+ if ($status) {
+ print STDERR "Exiting from distupgrade with status $status.\n";
+ goto cleanup;
+ }
+ }
+
+ if ($conf->get('CLEAN')) {
+ print "$distribution: Performing clean.\n";
+ my $status = $resolver->clean($session, $conf);
+ $status >>= 8;
+ if ($status) {
+ print STDERR "Exiting from update with status $status.\n";
+ goto cleanup;
+ }
+ }
+
+ if ($conf->get('AUTOCLEAN')) {
+ print "$distribution: Performing autoclean.\n";
+ my $status = $resolver->autoclean($session, $conf);
+ $status >>= 8;
+ if ($status) {
+ print STDERR "Exiting from autoclean with status $status.\n";
+ goto cleanup;
+ }
+ }
+
+ if ($conf->get('AUTOREMOVE')) {
+ print "$distribution: Performing autoremove.\n";
+ my $status = $resolver->autoremove($session, $conf);
+ $status >>= 8;
+ if ($status) {
+ print STDERR "Exiting from autoremove with status $status.\n";
+ goto cleanup;
+ }
+ }
+
+cleanup:
+ $resolver->cleanup();
+ # Unlock chroot now it's cleaned up and ready for other users.
+ $session->unlock_chroot();
+
+cleanup_unlocked:
+ cleanup($conf);
+
+ last if $status;
+}
+
+exit($status ? 1 : 0);