#!/usr/local/bin/perl -w

# Make an rpm file out of a pkg, or something. Incomplete.

# Waider Feb 1998
my %pkglist;
my %subpkglist;

my $SADM_DIR = '/var/sadm';
my $INSTALL_CONT = 'install/contents';
my $SPEC_DIR = '/usr/local/src/redhat/SPECS';
my $SRC_DIR = '/usr/local/src/redhat/SOURCES';
my $BUILD_DIR = '/usr/local/src/redhat/BUILD';

my $contfile = "$SADM_DIR/$INSTALL_CONT";
open( CONT, "<$contfile" ) || die "$contfile: $!\n";

CONTENTS:
while( <CONT> )
  {
	my ( $major, $minor, $perms, $user, $group, @pkgs );
	my ($file, $type, $subpkg, @rest ) = split;

	next if $file =~ /^#/;
	  
	undef @pkgs;
	  
  TYPESWITCH:
	{
	  if ( $type eq 'c' ) # character device
	  {
		( $major, $minor, $perms, $user, $group, @pkgs ) = @rest;
		last;
	  }
	  if ( $type eq 'd' ) # directory
		{
		  ( $perms, $user, $group, @pkgs ) = @rest;
		  #last;
		  next CONTENTS;
		}
	  if ( $type eq 'e' ) # config file, apparently.
		{
		  ( $perms, $user, $group, $size, $sum, $ctime, @pkgs ) = @rest;
		  last;
		}
	  if ( $type eq 'f' ) # file
		{
		  $file =~ s/^(.*)=.*$/$1/;
		  ( $perms, $user, $group, $size, $sum, $ctime, @pkgs ) = @rest;
		  last;
		}
	  if ( $type eq 'l' ) # hard link
		{
		  $file =~ s/^(.*)=.*$/$1/;
		  @pkgs = @rest;
		  last;
		}
	  if ( $type eq 's' ) # symlink
		{
		  $file =~ s/^(.*)=.*$/$1/;
		  @pkgs = @rest;
		  last;
		}
	  if ( $type eq 'v' ) # config file, also.
		{
		  ( $perms, $user, $group, $size, $sum, $ctime, @pkgs ) = @rest;
		  last;
		}
	  die "Unknown file type $type on line $.\n$_";
	}

	if ( !defined( @pkgs ))
	  {
		warn "Couldn't find package for line $.\n";
	  }
	else
	  {
		for( @pkgs )
		  {
			s/^(.*):.*$/$1/; # ignore package qualifiers
			my $filelist = $pkglist{ $_ };
			$filelist = "", print "New package: $_\n" if ( !defined( $filelist ));
			# $file =~ s#^.*/(.+)$#$1#; # basename, cheap.
			$filelist .= ( length( $filelist ) ? ",$file" : $file );
			$pkglist{ $_ } = $filelist;
		  }
	  }
  }

close( CONT );

for $pkg ( keys %pkglist )
  {
	$filelist = $pkglist{ $pkg };
	warn "No files in $pkg\n", next if !defined( $filelist );

	# Grab data from the pkg directory
	$summary = "Autogenerated RPM for $pkg";
	$description = "Autogenerated RPM for $pkg";
	$group = "Utilities";
	$subcat = "Text";
	$version = "0.0.0";
	
	open( PKG, "<$SADM_DIR/pkg/$pkg/pkginfo" ) || die "Glark ($pkg)!\n";
	while( <PKG>)
	  {
		/^NAME=(.*)$/ and $summary = $1;
		/^DESC=(.*)$/ and $description = $1;
		/^VERSION=(.*),REV=(.*)$/ and $version = $1;
		/^CATEGORY=(.*)$/ and $group = ucfirst( $1 );
		/^PRODNAME=(.*)$/ and $subcat = $1;
	  }
	close( PKG );
	
	if ( open( DEP, "<$SADM_DIR/pkg/$pkg/install/depend" ))
	  {
		$deps = "";
		while( <DEP>)
		  {
			next if /^(\#.*|\s*)$/;
		    chomp;
			if ( /^\s/ )
			  {
				$deps .= ""; # field delimiter
			  }
			else
			  {
				$deps .= "\n"
		      }
			$deps .= $_;
		  }
	    close( DEP );
		$deps .= "\n";
		
		# Parse deps
		undef @pkgdeps;
		while( $deps =~ /[PIR]\s(.*?)\s.*\n/g )
		  {
			push @pkgdeps, $1 if $1 ne $pkg;
		  }

		if ( $#pkgdeps > -1 )
		  {
			$deps = join( ',', @pkgdeps );
		  }
	  }
	
	print "Generating spec for $pkg version $version.\n";
	
	open( SPEC, ">$SPEC_DIR/$pkg-".$version."_1.spec" );
	print SPEC "Summary: $summary\n";
	print SPEC "Name: $pkg\n";
	print SPEC "Version: $version\n";
	print SPEC "Release: 1\n";
	print SPEC "Source: $pkg-$version.tar.gz\n";
	print SPEC "Copyright: Proprietary\n";
	print SPEC "Group: $group/$subcat\n";
	print SPEC "Requires: $deps\n";
	print SPEC "%description\n$description\n\n";
	print SPEC "%prep\n";
	print SPEC "%setup\n\n";
	print SPEC "%build\n\n";
	print SPEC "%install\n\n";
	print SPEC "%files\n";
	print SPEC join( '\n', split( ',', $filelist ));
	print SPEC "\n";
	close( SPEC );
	
	system( "mkdir $BUILD_DIR/$pkg-$version" );
	system( "echo '".$description."' > $BUILD_DIR/$pkg-$version/README" );
	system( "cd $BUILD_DIR && tar cf $pkg-$version.tar $pkg-$version" );
	system( "gzip -9 $BUILD_DIR/$pkg-$version.tar" );
	system( "mv $BUILD_DIR/$pkg-$version.tar.gz $SRC_DIR/$pkg-$version.tar.gz" );
	system( "/bin/rm -rf $BUILD_DIR/$pkg-$version" );
  }
