#!/usr/bin/perl my @xdate=localtime; my @month=("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); my $xdate=join('/', $xdate[3], $month[$xdate[4]], $xdate[5]+1900); print "\#\# UCS GENERATED XREF FILE AS OF $xdate \#\#\n"; readrecommended(); @patches=@ARGV; if ($#patches==-1) { opendir(PATCHES, ".") || die; @patches=grep(/.*-.*/, readdir(PATCHES)); closedir(PATCHES); } my %patch; my %obsoleted; for(@patches) { readpatch($_); } for (keys %obsoleted) { my ($patch, $rev)=split('-', $_); my $obsoletedby=$obsoleted{$_}; my $patchref=$patch{$_}; next unless defined($patchref); next if $$patchref[1] > $rev; $$patchref[5]='O'; $$patchref[8]=''; $$patchref[9]=''; $$patchref[10]="OBSOLETED by $obsoletedby"; } for (keys %patch) { my $patchref=$patch{$_}; print join('|', @{$patchref}), "\n"; } sub readrecommended { opendir(DIR, "patches") || die; my @files=readdir(DIR); closedir(DIR); my $found=0; for (grep(/_Recommended.README$/, @files)) { open(REC, "patches/$_") || die; while() { last if /^PATCHES INCLUDED:/ } die unless =~/^-----------------/; die unless =~/^$/; while () { last unless /^(\d+)-\d+\s+/; $recommended{$1}=1; $found=1; } die unless =~/^$/; close(REC); } die("Couldn't find any recommended patch lists\n") unless $found; } sub readpatch { my ($patchrev)=@_; my ($patch, $rev)=split('-', $patchrev); my $recommended=$recommended{$patch}?'R':' '; my $readme="$_/README.$_"; unless (open(README, "$readme")) { print STDERR "$patchrev: Can't open $readme: $!\n"; return; } my ($synopsis, $date, $release); my $security=' '; while() { chomp; $synopsis=$' if /^Synopsis: /; $date=$' if /^Date: /; if (/^Keywords: /) { $security='S' if $'=~/security/; } $release=$1 if /^Solaris Release:\s*(\S+)/; $release='Unbundled' if /^Unbundled Release: ./; if (/Patches accumulated and obsoleted by this patch: /) { my @obsoleted=split(' ', $'); for (@obsoleted) { $obsoleted{$_}=$patch; } } } close(README); $recommended='?' if $recommended eq ' ' && $release eq 'Unbundled'; opendir(PATCH, $patchrev) || die; my @files=grep(/^[^.]/, readdir(PATCH)); close(PATCH); my ($arch, $pkgs); my %pkgs; my %arch; my $files=0; for (@files) { next unless (-f "$patchrev/$_/pkginfo"); open(PKGINFO, "$patchrev/$_/pkginfo") || die; $files++; my ($pkg, $version); while() { chomp; $pkg=$' if /^PKG=/; $arch{"$';"}=1 if /^ARCH=/; $version=$' if /^VERSION=/; } close(PKGINFO); $version=~s/,PATCH=\d+//; $pkgs{"$pkg:$version;"}=1; } if (!$files) { print STDERR "$patchrev: No pkginfo files found\n"; return; } $arch=join('', sort(keys(%arch))); $pkgs=join('', sort(keys(%pkgs))); $patch{$patchrev}=[$patch, $rev, $date, $recommended, $security, ' ', ' ', $release, $arch, $pkgs, $synopsis]; }