summaryrefslogtreecommitdiffstats
path: root/hooks/copy-host-apt-sources-and-preferences/customize00.pl
blob: 53f6059056590a4eca26ef46d6a74036d1e13bb3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/perl
#
# This script makes sure that all packages that are installed both locally as
# well as inside the chroot have the same version.
#
# It is implemented in Perl because there are no associative arrays in POSIX
# shell.

use strict;
use warnings;

sub get_pkgs {
    my $root = shift;
    my %pkgs = ();
    open(my $fh, '-|', 'dpkg-query', "--root=$root", '--showformat',
        '${binary:Package}=${Version}\n', '--show')
      // die "cannot exec dpkg-query";
    while (my $line = <$fh>) {
        my ($pkg, $ver) = split(/=/, $line, 2);
        $pkgs{$pkg} = $ver;
    }
    close $fh;
    if ($? != 0) { die "failed to run dpkg-query" }
    return %pkgs;
}

my %pkgs_local  = get_pkgs('/');
my %pkgs_chroot = get_pkgs($ARGV[0]);

my @diff = ();
foreach my $pkg (keys %pkgs_chroot) {
    next unless exists $pkgs_local{$pkg};
    if ($pkgs_local{$pkg} ne $pkgs_chroot{$pkg}) {
        push @diff, $pkg;
    }
}

if (scalar @diff > 0) {
    print STDERR "E: packages from the host and the chroot differ:\n";
    foreach my $pkg (@diff) {
	print STDERR "E: $pkg $pkgs_local{$pkg} $pkgs_chroot{$pkg}\n";
    }
    exit 1;
}