#!/usr/bin/perl -w
#
# copy updated rpms from one directory to another
#

# init
use Utils qw(copy differ);
$| = 1;

# args parsing
$check = $fast = 0;
$usage = "Usage: $0 [-c] [-f|n] src dst\n";
while (@ARGV && $ARGV[0] =~ /^-/) {
    $_ = shift(@ARGV);
    if (/^-f$/) { $fast = "yes"; next; }
    if (/^-n$/) { $fast = "no"; next; }
    if (/^-c$/) { $check++; next; }
    die "Unknown option: $_\n$usage";
}
die $usage unless @ARGV == 2;
($src, $dst) = @ARGV;

# get rpm list
printf "processing $src\n";
($src_vers, $src_path) = &rpm_list($src);
printf "processing $dst\n";
($dst_vers, $dst_path) = &rpm_list($dst);

# check each file
foreach $name (sort(keys(%$src_vers))) {
    if ($dst_vers->{$name}) {
	# dst file exists
	($sv, $dv) = ($src_vers->{$name}, $dst_vers->{$name});
	($sp, $dp) = ($src_path->{$name}, $dst_path->{$name});
	if ($sv eq $dv) {
	    # same version
	    next unless $check;
	    if (differ("$src/$sp", "$dst/$dp")) {
		print "* different rpms for $name:\n";
		system("ls -l $src/$sp $dst/$dp");
		goto fix;
	    } else {
		print "identical rpms for $sp\n";
	    }
	    next;
	}
    } else {
	$sp = $dp = $src_path->{$name};
	print "* $name ($sp) is not in $dst\n";
    }
  fix:
    print "copy $sp to $dp";
    if ($fast) {
	print " ...";
	$ans = $fast;
    } else {
	print "? ";
	$ans = <STDIN>;
    }
    if ($ans =~ /^y/i) {
	unlink("$dst/$dp");
	copy("$src/$sp", "$dst/$sp");
    }
    if ($fast) {
	print $fast eq "yes" ? "done" : "todo";
	print "\n";
    }
}

# get path and version info for all rpms
sub rpm_list {
    my($top) = @_;
    my($file, $name, $data, $e, $v, $r, $a, %version, %path, $tag, $ans);

    chdir($top) || die "Can't cd to $top: $!\n";
    foreach $file (<*.rpm>) {
        $name = $file;
	unless ($name =~ /^(\S+)-([^-]+)-([^-]+)\.(\w+)\.rpm$/) {
	    print "* bad rpm name: $file\n";
	    next;
	}
        $data=`/bin/rpm -qp --queryformat "%{NAME}:%{EPOCH}:%{VERSION}:%{RELEASE}:%{ARCH}" $name 2>/dev/null`;
        ($name, $e, $v, $r, $a) = split(':',$data);
        $e=0 if ($e =~/none/); 
#	($name, $v, $r, $a) = ($1, $2, $3, $4);
	$tag = "$name $a";
	if ($version{$tag}) {
#	    print "* duplicate: $tag $e:$v-$r  ($version{$tag} or $e:$v-$r)\n";
#	  again:
            ($e1,$e2)=split(':',$version{$tag});
	    
	    $ans=`/usr/bin/rpmver -v $e1:$e2 '>' $e:$v-$r`; 
	    
            next if ($ans =~/is greater/);


#	    print "what should I do (<k>eep $version{$tag} or <t>ake $e:$v-$r): ";
#	    $ans = <STDIN>;
#	    if ($ans =~ /^k/i) {
#		next;
#	    } elsif ($ans =~ /^t/i) {
#		# fall through
#	    } else {
#		goto again;
#	    }
	}
	$version{$tag} = "$e:$v-$r";
	print "* taking: $name-$version{$tag} ($a)\n";
	$path{$tag} = $file;
    }
    return(\%version, \%path);
}
