Browse Source

CPU arch != machine arch

Prominent example is aarch64 vs. arm64. Rework the regex
usage and the way open is used to satisfy perl critic.
Markus Hennecke 1 year ago
parent
commit
4181ccf175
1 changed files with 28 additions and 23 deletions
  1. 28 23
      cleanup_packages.pl

+ 28 - 23
cleanup_packages.pl

@@ -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);
 }