#!/usr/bin/perl -w
# changes the dpkg status of a package in a chroot to "hold"
#
# 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 Getopt::Long;
use Sbuild qw(help_text version_text usage_error);
use Sbuild::Utility qw(setup cleanup shutdown);

package main;

GetOptions (
    "h|help" => sub { help_text("1", "sbuild-hold"); },
    "V|version" => sub {version_text("sbuild-hold"); })
or usage_error("sbuild-hold", "Error parsing command-line options");

usage_error("sbuild-hold", "Incorrect number of options") if (@ARGV < 2);

my $chroot = Sbuild::Utility::get_dist($ARGV[0]);

my $session = setup($ARGV[0]) or die "Chroot setup failed for $chroot chroot";

print STDOUT "Holding packages in $chroot chroot:";

my $command = $session->get_command("$Sbuild::Conf::dpkg --set-selections",
				    "root", 1);
if (!open(SELECTIONS, "| $command")) {
    print STDERR "Can't run dpkg --set-selections in chroot\n";
    shutdown("TERM");
}

shift @ARGV;
foreach (@ARGV) {
    print SELECTIONS "$_        hold\n";
    print STDOUT " $_";
}

if (!close SELECTIONS) {
    print STDERR "Can't run dpkg --set-selections in chroot\n";
    shutdown("TERM");
}

print STDOUT ".\n";

my $packages = join(" ", @ARGV);
my $status = $session->run_command("$Sbuild::Conf::dpkg --list $packages",
				   "root", 1, 0);

cleanup();

exit $status;
