socsvn commit: r289925 - soc2015/roam/ports

roam at FreeBSD.org roam at FreeBSD.org
Wed Aug 19 15:56:10 UTC 2015


Author: roam
Date: Wed Aug 19 15:56:09 2015
New Revision: 289925
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=289925

Log:
  Add a script for updating /usr/ports/ with these.
  
  ObQuote:	"Mama's gonna keep baby cosy and warm"

Added:
  soc2015/roam/ports/update.pl

Added: soc2015/roam/ports/update.pl
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2015/roam/ports/update.pl	Wed Aug 19 15:56:09 2015	(r289925)
@@ -0,0 +1,75 @@
+#!/usr/bin/perl
+
+use v5.012;
+use strict;
+use warnings;
+
+use Cwd 'abs_path';
+use POSIX ':sys_wait_h';
+
+sub find_ports($);
+sub process_port($ $ $);
+
+MAIN:
+{
+	my ($base, $tgt) = ('.', '/usr/ports');
+
+	my @ports = find_ports $base;
+	process_port $_, $base, $tgt for @ports;
+}
+
+sub find_ports($)
+{
+	my ($base) = @_;
+	my @res;
+
+	opendir my $db, $base or die "opendir($base): $!\n";
+	while (my $d = readdir $db) {
+		next if $d eq '.' || $d eq '..';
+		chdir $db or die "chdir($base): $!\n";
+		next unless -d $d;
+
+		opendir my $ds, $d or die "opendir($base/$d): $!\n";
+		while (my $p = readdir $ds) {
+			next if $p eq '.' || $p eq '..';
+			chdir $ds or die "chdir($base/$d): $!\n";
+			next unless -d $p && -f "$p/Makefile" && -f "$p/pkg-plist";
+
+			push @res, "$d/$p";
+		}
+		closedir $ds or die "closedir($base/$d): $!\n";
+	}
+	closedir $db or die "closedir($base): $!\n";
+
+	return @res;
+}
+
+sub process_port($ $ $)
+{
+	my ($port, $base, $tgt) = @_;
+
+	my ($basename, $tgtname) = ("$base/$port", "$tgt/$port");
+	my $baseabs = abs_path($basename);
+
+	if (-l $tgtname) {
+		my $lname = readlink $tgtname or die "readlink($tgtname): $!\n";
+		if (abs_path($lname) ne $baseabs) {
+			die "FIXME: remove $tgtname to be replaced by a symlink to $baseabs";
+		}
+		else { say "RDBG just fine: $tgtname is a symlink to $baseabs"; }
+	} elsif (-d $tgtname) {
+		my @cmd = ('rsync', '-av', '--delete', '--', "$baseabs/", "$tgtname/");
+		my $res = system { $cmd[0] } @cmd;
+		if (!WIFEXITED($res) || WEXITSTATUS($res) != 0) {
+			die "@cmd failed\n";
+		}
+		say "RDBG just fine: rsynced $baseabs to $tgtname successfully";
+	} elsif (-e $tgtname) {
+		unlink $tgtname or die "unlink($tgtname): $!\n";
+	}
+
+	if (! -e $tgtname) {
+		symlink $baseabs, $tgtname or
+		    die "symlink($baseabs, $tgtname): $!\n";
+	}
+}


More information about the svn-soc-all mailing list