1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-11-21 00:25:50 +00:00

Update ports-mgmt/portupdate-scan to 0.4

- Add support for pkgng.
- ISCL License
- Incorporates -a argument suggested by Marcel Bonnet in PR 179637. Hence this supersedes PR 179637, which can now be closed.
- Other misc. fixes and enhancements, including correcting typos.

PR:		190051
Submitted by:	alex@stangl.us
Approved by:	swills (eadler)
This commit is contained in:
Jonathan Chu 2014-06-04 15:42:35 +00:00
parent c55e6155ea
commit 4bb37acce5
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=356507
4 changed files with 56 additions and 26 deletions

View File

@ -2,7 +2,7 @@
# $FreeBSD$
PORTNAME= portupdate-scan
PORTVERSION= 0.3
PORTVERSION= 0.4
CATEGORIES= ports-mgmt
MASTER_SITES= # none
DISTFILES= # none
@ -10,6 +10,8 @@ DISTFILES= # none
MAINTAINER= alex@stangl.us
COMMENT= Display pertinent parts of {PORTSDIR}/UPDATING
LICENSE= ISCL
NO_BUILD= yes
USES= perl5 shebangfix
USE_PERL5= run

View File

@ -4,7 +4,7 @@ many ports installed that it is difficult to know which sections are relevant.
It reads /usr/ports/UPDATING, attempting for each block to determine whether
the affected ports are installed. It omits blocks that do not apply.
It handles wildcards and other special cases, however it cannot handle
all variants of phrases used on the APPLIES: line.
all variants of phrases used on the AFFECTS: line.
In uncertain cases, it errs on the side of reporting.
Alex Stangl <alex@stangl.us>

View File

@ -17,10 +17,7 @@
# Check /usr/ports/UPDATING file for all sections matching packages
# that are installed, and outputting those sections.
# Intended to be used prior to upgrading ports
# Usage: portupdatescan [-dDhmuvV] [--help] [--version]
# Created: 2006/12/21 Alex Stangl
# Updates: 2008/02/04 Alex Stangl INDEX computation change from Tom Doherty
# 2008/07/21 Alex Stangl Tolerate problems w/ MOVED & UPDATING
# Usage: portupdatescan [-dhmuvV] [-a yyyymmdd_date] [-D portsdir] [--help] [--version]
use Text::ParseWords;
use Getopt::Std;
@ -29,7 +26,8 @@ use strict;
# Display usage and exit
sub HELP_MESSAGE() {
print <<EOF;
Usage: portupdate-scan [-dhmuvV] [-D portsdir] [--help] [--version]
Usage: portupdate-scan [-dhmuvV] [-a yyyymmdd_date] [-D portsdir] [--help] [--version]
-a display sections later than date specified in YYYYMMDD format
-d display additional debugging info
-D portsdir override default port directory
-h, --help display this help and exit
@ -42,25 +40,34 @@ EOF
}
sub VERSION_MESSAGE() {
print "portupdate-scan 0.3\n";
print "portupdate-scan 0.4\n";
}
# Fetch cmdline args, display usage if appropriate
$Getopt::Std::STANDARD_HELP_VERSION=1; # std, not paranoia behavior
# our($opt_d, $opt_h, $opt_m, $opt_u, $opt_v, $opt_V);
my %opt; # map of command-line options
HELP_MESSAGE() unless getopts("dD:hmuvV", \%opt);
HELP_MESSAGE() unless getopts("dD:hmuvVa:", \%opt);
HELP_MESSAGE() if $opt{h};
VERSION_MESSAGE() && exit if $opt{V};
my $afterDate = $opt{a}; # display sections later than this date
my $portsdir = $opt{D} || "/usr/ports"; # ports directory
my $portIndexFile = "$portsdir/" . `make -f $portsdir/Makefile -V INDEXFILE`; # port index file
print "+ portIndexFile = $portIndexFile\n" if $opt{d};
# Auto-detect whether PKGNG is in use.
`env TMPDIR=/dev/null ASSUME_ALWAYS_YES=1 PACKAGESITE=file:///nonexistent pkg info -x 'pkg(-devel)?\$' >/dev/null 2>&1`;
my $pkgngInUse = !$?;
print "+ PKGNG in use\n" if $opt{d} && $pkgngInUse;
print "+ Legacy PKG manager in use\n" if $opt{d} && !$pkgngInUse;
my $movedFile = "$portsdir/MOVED"; # file w/ port renames/deletes
my $updatingFile = "$portsdir/UPDATING"; # file w/ ports update news
my @portlist = `pkg_info -aoq`
or die "Error trying to execute pkg_info -aoq: $!";
my @portlist = $pkgngInUse ? `pkg info -aoq` : `pkg_info -aoq`
or die "Error trying to execute pkg info -aoq: $!";
my %installedPorts =
map {chomp($_);$_, 1} @portlist; # map of installed ports -> 1
@ -83,10 +90,10 @@ sub processBlock(@) {
my ($affects, $remainder, $line);
my $index = 0;
foreach $line (@_) {
if ($line =~ /^\s*AFFECTS:/i) {
if ($line =~ /^\s*AFFECTS:/i) {
$affects = $line;
$remainder = $index;
} elsif ($affects and $line =~ /^\s*AUTHOR/i) {
} elsif ($affects and $line =~ /^\s*AUTHOR/i) {
last;
} elsif ($affects) {
$affects .= $line;
@ -132,8 +139,7 @@ sub parseexpr($); # forward declaration needed because of recursion
sub parseexpr($) {
my @retval;
my $sepExp = "(,\\s+and\\s+|,\\s+or\\s+|,\\s+|\\s+and\\s+|\\s+or\\s+|\\s+)";
if ($_[0] =~ /{.*,.*}/)
{
if ($_[0] =~ /{.*,.*}/) {
# Handle expression like textproc/{senna,p5-Senna}
# to produce textproc/senna, textproc/p5-Senna
my ($prefix, $subexpr, $suffix) = ($_[0] =~ /([^{]*){([^}]*)}(.*)/);
@ -145,6 +151,18 @@ sub parseexpr($) {
foreach $line (@exprs) {
push @retval, parseexpr($prefix . $line . $suffix);
}
} elsif ($_[0] =~ /{.*\|.*}/) {
# Handle expression like textproc/{senna|p5-Senna}
# to produce textproc/senna, textproc/p5-Senna
my ($prefix, $subexpr, $suffix) = ($_[0] =~ /([^{]*){([^}]*)}(.*)/);
# Parse portname fragment contained within braces
# Breaks string at "|" and discards quotes and single backslashes
my @exprs = &quotewords('\|', 0, $subexpr);
my $line;
foreach $line (@exprs) {
push @retval, parseexpr($prefix . $line . $suffix);
}
} elsif ($_[0] =~ /\[\d{1,4}\]/) {
# Handle expressions like net/openldap2[34]-server
# to produce net/openldap23-server, net/openldap24-server
@ -164,7 +182,7 @@ sub parseexpr($) {
# Handle "dir1/port1 and dir2/port2" recursively.
my ($prefix, $sep, $suffix) = ($_[0] =~ /(.*?)$sepExp(.*)/);
push @retval, parseexpr($prefix) if $prefix ne "";
push @retval, parseexpr($suffix) if $suffix ne "";
push @retval, parseexpr($suffix) if $suffix ne "" and $suffix ne "any port that depends on it";
} elsif ($_[0] =~ /\*/ or $_[0] =~ /\?/) {
push @retval, expandwildcard($_[0]);
} else {
@ -177,10 +195,12 @@ sub parseexpr($) {
# Parse a single AFFECTS: line
sub parseline($) {
return ("ALL") if $_[0] =~ /^\s+AFFECTS:\s*everybody\s*$/i
or $_[0] =~ /^\s+AFFECTS:\s*everyone\s*$/i
or $_[0] =~ /^\s+AFFECTS:\s*all\s*$/i;
if ($_[0] =~ s/.*([uU]sers|[tT]esters) of[ \t]*(.*)/$2/) {
if ($_[0] =~ s/^\s+AFFECTS:\s*(.*)/$1/) {
return ("ALL") if $_[0] =~ /^everybody\s*$/i
or $_[0] =~ /^everyone\s*$/i
or $_[0] =~ /^all users\s*$/i
or $_[0] =~ /^all\s*$/i;
$_[0] =~ s/.*([uU]sers|[tT]esters) of[ \t]*(.*)/$2/;
my @retval = parseexpr($_[0]);
print "+ parseline returns @retval for $_[0]\n" if $opt{d};
return @retval;
@ -210,7 +230,7 @@ sub expandwildcard($) {
return @retval;
}
# Convert glob-style pattern to standard regular-expression pattern
# Convert glob-style pattern to standard regex pattern
sub glob2pat($) {
(my $globstr = $_[0]) =~ s/(.)/$glob2regexp{$1} || "\Q$1"/ge;
return '^' . $globstr . '$';
@ -303,7 +323,7 @@ sub printall(@) {
# Main entry point. First, open INDEX and read all ports into allPorts
MAIN:{
open(IDX, $portIndexFile) or die "Can't open $portIndexFile: $!";
open(IDX, $portIndexFile) or die "Can't open $portIndexFile: $!. Maybe you should run make fetchindex or make index from ports directory";
while(<IDX>) {
chomp;
my ($portLine) = ($_ =~ /^[^|]*\|\/usr\/ports\/([^|]*)/)
@ -318,9 +338,9 @@ MAIN:{
open(MOVED, $movedFile) or die "Can't open $movedFile: $!";
while(<MOVED>) {
chomp;
if ($_ =~ /^\s*$/) {
print "+ Ignoring MOVED line containing no non-whitespace chars.\n" if $opt{d};
} elsif ($_ !~ /^\s*#/) {
if ($_ =~ /^\s*$/) {
print "+ Ignoring MOVED line containing no non-whitespace chars.\n" if $opt{d};
} elsif ($_ !~ /^\s*#/) {
my ($from, $to) = ($_ =~ /^([^|]*)\|([^|]*)/)
or die "$_ is not a correctly formed MOVED line";
@ -340,6 +360,11 @@ MAIN:{
open(UPD, $updatingFile) or die "Can't open $updatingFile: $!";
while(<UPD>) {
chomp;
if ($opt{a} && /^\d{8}/) {
my $sectionDate = $_;
$sectionDate =~ s/\://;
last if $sectionDate <= $afterDate;
}
if (/^\s*AFFECTS:/ && @bufferBlock > 0) {
processBlock(@bufferBlock);
@bufferBlock = ();

View File

@ -22,6 +22,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl dhmuVv
.Op Fl a Ar yyyymmdd date
.Op Fl D Ar portdir
.Op Fl -help
.Op Fl -version
@ -33,6 +34,8 @@ installed are omitted.
.Pp
The following options are available:
.Bl -tag -width indent
.It Fl a Ar yyyymmdd date
only display sections later than the date specified in yyyymmdd format
.It Fl D Ar portsdir
use portsdir as ports directory instead of /usr/ports
.It Fl d
@ -72,6 +75,6 @@ To include details of installed/uninstalled ports for MIXED sections:
.Sh AUTHORS
.An "Alex Stangl" Aq alex@stangl.us
.Sh BUGS
The concept of machine-interpreting the APPLIES: line in /usr/ports/UPDATING,
The concept of machine-interpreting the AFFECTS: line in /usr/ports/UPDATING,
which were intended for human consumption, is dubious. It would be nice to
evolve some more robust method for communicating this information.