#!/usr/bin/perl -w # # Version: 2011/06/17-01 (Martin Paul ) # # When run in a directory which contains extracted patch directories, # mkxref creates output in patchdiag.xref format for exactly this set # patches, from information taken from patchinfo/README/pkginfo files. # # Example: # # Extract CPU (meta-data only, for speed-up): # unzip 10_Recommended_CPU_2011-04.zip -x '*/reloc/*' '*/failsafe_archive' # # Create patchdiag.xref: # cd 10_Recommended_CPU_2011-04/patches/ # mkxref > patchdiag.xref use strict; my ($id, $rev, $synopsis, $date, $arch, $osrel, $req, $pkg); print "## PATCHDIAG TOOL CROSS-REFERENCE FILE AS OF Jan/01/01 ##\n##\n"; opendir (P, "."); for my $p (sort readdir (P)) { next unless (($p =~ /\d{6}-\d{2}/) && (-d "$p")); ($id, $rev)= split (/-/, $p); $synopsis=$date=$arch=$osrel=$req=$pkg=""; my %pkgs=(); my %archs=(); open (README, "<$p/README.$p"); while () { if ($_ =~ /^Synopsis:\s+(.*)$/) { $synopsis=$1 } if ($_ =~ /^Date:\s+(.*)$/) { $date=$1; $date =~ s/20(\d\d)/$1/ } } close (README); open (INFO, "<$p/patchinfo"); while () { if ($_ =~ /PATCH_OSRELEASE=\'5.(.*)\'/) { $osrel=$1 } if ($_ =~ /PATCH_REQUIRES=["' ]*([\d -]*)[ '"]*/) { $req=$1; } } close (INFO); $req=join(';', sort split (/ /, $req)); $req && ($req.=';'); opendir (PDIR, "$p"); for my $d (sort readdir (PDIR)) { next unless (($d !~ /^\./) && (-d "$p/$d")); my $t=$d; $t =~ s/\..*$//; # strip arch postfix (SUNWcsl.u -> SUNWcsl) open (PKGINFO, "$p/$d/pkginfo"); while () { chomp; if ($_ =~ /VERSION=(.*)$/) { $pkgs{"$t:$1"}=1 } if ($_ =~ /ARCH=(.*)/) { $archs{$1}=1 } } close (PKGINFO); $pkg=join(';', sort keys %pkgs); $pkg && ($pkg.=';'); $arch=join(';', sort keys %archs); $arch && ($arch.=';'); } closedir (PDIR); print "$id|$rev|$date| | | | |$osrel|$arch$req|$pkg|$synopsis\n"; } closedir (P);