|
@@ -7,12 +7,21 @@ use warnings;
|
|
|
|
|
|
my $portsdir = $ENV{PORTSDIR} || '/usr/ports/';
|
|
|
|
|
|
-sub getInstalledPackages () {
|
|
|
+sub getProcessorArch {
|
|
|
+ open(my $fh, '-|', 'uname', '-p')
|
|
|
+ or die "Unable to get processor arch\n";
|
|
|
+ my $arch = <$fh>;
|
|
|
+ close($fh);
|
|
|
+ chomp $arch;
|
|
|
+ return $arch;
|
|
|
+}
|
|
|
+
|
|
|
+sub getInstalledPackages {
|
|
|
my %packages = ();
|
|
|
- open(my $fh, 'pkg_info |')
|
|
|
- or die $!;
|
|
|
+ open(my $fh, '-|', '/usr/sbin/pkg_info')
|
|
|
+ or die "Unable to read package list: $!\n";
|
|
|
while(<$fh>) {
|
|
|
- s/\s+.*//;
|
|
|
+ s/\s+.*//x;
|
|
|
chomp;
|
|
|
$packages{$_} = 1;
|
|
|
}
|
|
@@ -21,43 +30,39 @@ sub getInstalledPackages () {
|
|
|
}
|
|
|
|
|
|
|
|
|
-sub getAvailablePackages ($) {
|
|
|
+sub getAvailablePackages {
|
|
|
+ my $arch = shift;
|
|
|
my $subdir = shift;
|
|
|
- my $arch = `uname -p`;
|
|
|
- chomp $arch;
|
|
|
+
|
|
|
my $directory = "$portsdir/packages/$arch/$subdir";
|
|
|
- my %packages = ();
|
|
|
- return \%packages if (! -d "$directory");
|
|
|
- open(my $fh, "ls $directory |")
|
|
|
- or die $!;
|
|
|
- while (<$fh>) {
|
|
|
- $_ =~ s/\.tgz$//;
|
|
|
- chomp;
|
|
|
- $packages{$_} = 1;
|
|
|
- }
|
|
|
- close($fh);
|
|
|
+ return {} if (! -d "$directory");
|
|
|
+ opendir(my $dh, $directory)
|
|
|
+ or die "Unable to open package directory: $!\n";
|
|
|
+ my %packages = map { s/\.tgz$//rx => 1 } grep { !/^\./x } readdir $dh;
|
|
|
+ closedir $dh;
|
|
|
return \%packages;
|
|
|
}
|
|
|
|
|
|
|
|
|
-sub getNotInstalledPackages ($$$) {
|
|
|
+sub printNotInstalledPackages {
|
|
|
+ my $arch = shift;
|
|
|
my $installed = shift;
|
|
|
my $available = shift;
|
|
|
my $dir = shift;
|
|
|
- my $arch = `uname -p`;
|
|
|
- chomp $arch;
|
|
|
|
|
|
- for my $pkg (sort keys %$available) {
|
|
|
+ for my $pkg (sort keys %{$available}) {
|
|
|
if (! exists $installed->{$pkg}) {
|
|
|
print "rm $portsdir/packages/$arch/$dir/$pkg.tgz\n";
|
|
|
}
|
|
|
}
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
+my $arch = getProcessorArch();
|
|
|
print '#! /bin/sh' . "\n";
|
|
|
my $installed = getInstalledPackages();
|
|
|
for my $dir ('all', 'cdrom', 'ftp') {
|
|
|
- my $available = getAvailablePackages($dir);
|
|
|
- getNotInstalledPackages($installed, $available, $dir);
|
|
|
+ my $available = getAvailablePackages($arch, $dir);
|
|
|
+ printNotInstalledPackages($arch, $installed, $available, $dir);
|
|
|
}
|
|
|
|