From owner-ports-jp@jp.freebsd.org  Mon Sep 22 22:53:48 1997
Received: by jaz.jp.freebsd.org (8.8.7+2.7Wbeta7/8.7.3) id WAA06445
	Mon, 22 Sep 1997 22:53:48 +0900 (JST)
Received: by jaz.jp.freebsd.org (8.8.7+2.7Wbeta7/8.7.3) with ESMTP id WAA06384
	for <ports-jp@jp.freebsd.org>; Mon, 22 Sep 1997 22:53:43 +0900 (JST)
From: itojun@itojun.org
Received: from localhost (itojun@localhost.itojun.org [127.0.0.1])
	by coconut.itojun.org (8.8.5/3.6Wbeta6) with ESMTP id WAA25028
	for <ports-jp@jp.freebsd.org>; Mon, 22 Sep 1997 22:53:40 +0900 (JST)
To: ports-jp@jp.freebsd.org
X-Template-Reply-To: itojun@itojun.org
X-Template-Return-Receipt-To: itojun@itojun.org
X-PGP-Fingerprint: F8 24 B4 2C 8C 98 57 FD  90 5F B4 60 79 54 16 E2
Date: Mon, 22 Sep 1997 22:53:40 +0900
Message-ID: <25024.874936420@coconut.itojun.org>
Reply-To: ports-jp@jp.freebsd.org
Precedence: bulk
X-Distribute: distribute [version 2.1 (Alpha) patchlevel=20]
X-Sequence: ports-jp 1703
Subject: [ports-jp 1703] port upgrade checker
Errors-To: owner-ports-jp@jp.freebsd.org
Sender: owner-ports-jp@jp.freebsd.org

	cvsup$B$G(B/usr/ports$B$r99?7$7$F$$$k$H!"4{$K(Binstall$B$7$F$"$k(Bport$B$h$j(B
	$B?7$7$$(Bport$B$,$G$F$$$k$+$b$7$l$^$;$s!#$=$s$J$H$-$KCN$i$;$F$/$l$k(B
	$B%9%/%j%W%H$G$9!#(B
	$B$h!<$9$k$K!"(B/var/db/pkg/*$B$NL>A0$H!"(B/usr/ports/INDEX$B$NCf?H$rHf$Y$^$9!#(B

	perl portupdate.pl -v
	$B$H$+$d$C$F$_$F$/$@$5$$!#(B

itojun



# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	portupdate.pl
#
echo x - portupdate.pl
sed 's/^X//' >portupdate.pl << 'END-of-portupdate.pl'
X#! /usr/bin/perl
X# port update checker.
X# Copyright(c) 1997 by Jun-ichiro itojun Itoh <itojun@itojun.org>.
X# All rights reserved.
X# Freely redistributable.  Absolutely no warranty.
X# $Id: portupdate.pl,v 1.2 1997/09/22 13:52:30 itojun Exp $
X
X$indexfile = 1;
X$verbose = 0;
X$ENV{'PORTSDIR'} = '/usr/ports' if (!defined $ENV{'PORTSDIR'});
X$portsdir = '/usr/ports';
X
X# check arguments
Xforeach $i (@ARGV) {
X	&usage("invalid argument") if ($i !~ /^-/);
X	$i = substr($i, 1);
X	&usage("invalid argument") if ($i =~ /[^vI]/);
X	$verbose++ if ($i =~ /v/);
X	$indexfile = 0 if ($i =~ /I/);
X}
X
Xprint STDERR "# reading list of available ports...\n" if ($verbose);
Xif ($indexfile) {
X	# get name of available ports from /usr/ports/INDEX.
X	open(IN, "< $portsdir/INDEX");
X	while (<IN>) {
X		s/\n$//;
X		$_ =~ s/\|.*//;
X		$portsname{$_}++;
X	}
X	close(IN);
X} else {
X	# get name of available ports in /usr/ports.
X	foreach $i (<$portsdir/*/*/Makefile>) {
X		open(IN, "< $i");
X		$distname = $pkgname = '';
X		while (<IN>) {
X			s/\n$//;
X			if (/^DISTNAME[?+]?=[ \t]*(\S*)/) {
X				$distname = $1;
X			}
X			if (/^PKGNAME[?+]?=[ \t]*(\S*)/) {
X				$pkgname = $1;
X			}
X		}
X		close(IN);
X
X		$pkgname = $distname if ($pkgname eq '');
X		$portsname{$pkgname}++;
X	}
X}
X
X# get name of installed ports in /var/db/pkg.
Xprint STDERR "# reading list of installed ports...\n" if ($verbose);
Xopendir(DIR, '/var/db/pkg');
Xforeach $i (readdir(DIR)) {
X	next if (! -d "/var/db/pkg/$i");
X	next if ($i =~ /^\.\.?$/);
X	$installedname{$i}++;
X}
Xclosedir(DIR);
X
Xselect(STDERR);
Xprint "# performing checks...\n" if ($verbose);
X$nupgrade = 0;
Xforeach $i (keys %installedname) {
X	if ($i =~ /^(.*)-([^-]*)$/) {
X		$iname = $1;
X		$ivers = $2;
X	} else {
X		next;
X	}
X	@tmp = grep($_ =~ /^$iname-([^-]*)$/, keys %portsname);
X
X	if (scalar(@tmp) == 0) {
X		print "???: $i -> (none)\n" if ($verbose);
X		next;
X	}
X
X	if (scalar(@tmp) != 1) {
X		print "???: $i -> " . join(',', @tmp) . "\n" if ($verbose);
X		print "\tcannot decide, multiple port matched\n" if ($verbose);
X		next;
X	}
X
X	$j = $tmp[0];
X	if ($j =~ /^(.*)-([^-]*)$/) {
X		$pname = $1;
X		$pvers = $2;
X	} else {
X		print "???: $i -> $j\n" if ($verbose);
X		print "\tcannot decide, strange name\n" if ($verbose);
X		next;
X	}
X
X	if (&encode($ivers) < &encode($pvers)) {
X		print "UPGRADE: $i -> $j\n";
X		$nupgrade++;
X	}
X}
X
Xexit $nupgrade ? 1 : 0;
X
Xsub encode {
X	local($str) = @_;
X	local($value, $i, @tmp);
X
X	if ($str =~ /^[0-9\.]*$/) {
X		$value = $str;
X		$value =~ s/\.//g;
X	} else {
X		$value = $str;
X		$value =~ s/[^0-9]//g;
X		$value =~ s/\.//g;
X	}
X	return $value;
X}
X
Xsub usage {
X	local($msg) = @_;
X
X	select(STDERR);
X	if ($msg ne '') {
X		print "error: $msg\n";
X	}
X	print <<EOF;
Xusage: portupdate [-vI]
X	-v: verbose
X	-I: scan /usr/ports/*/*/Makefile, instead of /usr/ports/INDEX
XEOF
X	exit 1;
X}
END-of-portupdate.pl
exit

