#!/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(<REC>)
		{
			last if /^PATCHES INCLUDED:/
		}
		die unless <REC>=~/^-----------------/;
		die unless <REC>=~/^$/;
		while (<REC>)
		{
			last unless /^(\d+)-\d+\s+/;
			$recommended{$1}=1;
			$found=1;
		}
		die unless <REC>=~/^$/;
		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(<README>)
	{
		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(<PKGINFO>)
		{
			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];
}
