#!/usr/bin/perl

use File::Find;

#--Define--#
$INDIR="/export1/Vine.devel/vpmirror/6.5";
$OUTDIR="/export1/Vine/VinePlus/6.5";
$DATE = `date +%Y/%m/%d`;
$BDIR = "/tmp/backup";
$HDLIST = 0;
chop($DATE);
$BACKUPDIR = $BDIR . "/" . $DATE ;
$suffix = "";
$GENHDLIST = "/usr/lib/anaconda-runtime/genhdlist";
$PACKAGESLIST = "/export1/Vine/VineSeed/packages-vine6x.list";

#--end--#
#--end--#

system("sudo /bin/chown -R vpmirror.vineseed $OUTDIR");
system("sudo /bin/chmod -R g+rw $OUTDIR");
move("",$INDIR,$OUTDIR,$BACKUPDIR);
#move("TestPkg/",$INDIR,$OUTDIR ,$BACKUPDIR);
#move("non-free/",$INDIR,$OUTDIR,$BACKUPDIR);


##########################################################################################
sub move($){
  my ($dir,$INDIR,$OUTDIR,$BACKUPDIR) = @_;
  &getoldpkg("i386");
  &getoldpkg("src");
  &getoldpkg("x86_64");
#--define--#
#--end--#
#--end--#
  $rpmcate2 = "";  
  open(IN,"ls $INDIR/$dir |");
  
  while(<IN>){
    chop($_);
#--define--#
    my $rpmcate="";
    my $suffix ="";
    my $rpmcate = "";
    my $arch="";
    my $rpmcate1=""; 
    my $rpmcate2="";
    my $rpmcate3="";
    my $rpmcate4="";
    if(/\.src\.rpm/){
      $rpmcate = "pool";
      $suffix = '.src.rpm';
      $changelog = "off";
      $arch = "src";
    }elsif(/nosrc\.rpm/){
      $rpmcate = "pool";
      $suffix = '.nosrc.rpm';
      $changelog = "off";
      $arch = "src";
    }elsif(/noarch.rpm/){
      $rpmcate = "i386/pool";
      $rpmcate4 = "x86_64/pool";
      $suffix = '.noarch.rpm' ;
      $changelog = "off";
      $arch = "i386";
    }elsif(/compat32-/){
      if(/i686.rpm/){
        $rpmcate = "x86_64/pool";
        $suffix = '.i686.rpm';
        $changelog = "off";
        $arch = "x86_64";
      }
    }elsif(/x86_64.rpm/){
      $rpmcate = "x86_64/pool";
      $suffix = '.x86_64.rpm';
      $changelog = "off";
      $arch = "x86_64";
    }elsif(/i686.rpm/){
      $rpmcate = "i386/pool";
      $suffix = '.i686.rpm';
      $changelog = "off";
      $arch = "i386";
    }else{
      $rpmcate = "i386/pool";
      $suffix = '.i386.rpm';
      $changelog = "off ";
      $arch = "i386";
    }



#--end--#
#--end--#    
    if($changelog eq "on" ){
       $changelogname = $_;
       $filename = $_;
       $changelogname =~ s/\.[a-z]+\.rpm//;
       open(CHANGELOG,"rpm -qp --changelog $INDIR/$dir$changelogname$suffix|"); 
       $changelog = "";
       $changelog = <CHANGELOG>;
       while(<CHANGELOG>){
         if(/^[\*] /){
           last;
	 }else{
	   $changelog = $changelog . $_;   
	 }
       }
      close(CHANGELOG);
      open(OUTLOG,">> vineplus5changelog");
      print OUTLOG "$changelogname \n$changelog\n";
      $_ = $changelogname. $suffix;  
    }
    
    if(/\.rpm/){
	my $path = $_;
	chomp($path);
	my $name = `rpm -qp $INDIR/$path --queryformat %{NAME}`;
	# $arch = `rpm -qp $INDIR/$path --queryformat %{ARCH}`;

	print $name . "\n";
	system("mkdir -p $BACKUPDIR/$dir");
	my $rpm = "";

	open(RPM,"rpm -K --nosignature $INDIR/$dir$path|");
	while(<RPM>){
	    $rpm = $rpm . $_;
	}
	close(RPM);
      	
	if($rpm =~/md5[ ]+OK/){
	# get arch 
  	  my $pkgarch = `rpm -qp $INDIR/$path --queryformat %{ARCH}`;
	  chomp($pkgarch);
	  if(( $pkgarch ne $arch )&&($arch ne "noarch") && ($arch ne "src")){
	     $arch = $pkgarch;
	  }
	# get category
	my $category;
	$category = `grep ",$name," $PACKAGESLIST | head -1 | cut -f1 -d,`;
	chomp($category);
	if($category eq ""){
	    $category = "plus";
	    open(PLIST, ">> $PACKAGESLIST");
	    print PLIST "$category,$name,,\n";
	    close(PLIST);
        }
	if(($category eq "main") || ($category eq "core") || ($category eq "main-cd") || ($category eq "devel") || ($category eq "ignore")){
	    system("mv $INDIR/$dir$path /export1/Vine.devel/vpmirror/pending");
	    open(MAILBODY, "> pending-packages-mail.txt");
	    print MAILBODY "Subject: uploaded package was rejected by a wrong category". "\n".
	      "From: Vine Linux Incoming System <vpmirror\@vinelinux.org>". "\n".
	      "To: VineSeed\@vinelinux.org". "\n".
	      "Content-Type: text/plain; charset=\"iso-2022-jp\"". "\n".
	      "Content-Transfer-Encoding: 7bit". "\n\n".
	      "Vine Linux Incoming System です。\n\n".
	      "VinePlus/6.5 にアップロードされた以下のパッケージは、カテゴリ間違いのため保留されました\n\n".
	      " - $path : カテゴリが main または devel です\n\n".
	      "--\n"."Vine Linux Incoming System.\n"."This message was automatically sent by incoming system.\n";
	    close(MAILBODY);
	    #system("nkf -j pending-packages-mail.txt | sendmail -t -f 'Vine Linux Incoming System <vpmirror@vinelinux.org>'");
	    next;
	}
	my $rpmdirname;
	if($arch eq "src"){
	    $rpmdirname = SRPMS;
	} else {
	    $rpmdirname = RPMS;
	}
	# merging
 	print "arch:".$arch."\n";
	print "category:".$category."\n";
        print "old package name:"."$OUTDIR/$rpmcate/$dir${$arctree{$arch}}{$name}"."\n";
        print "new:".$path."\n";

	# sanity check
	if( -f "$OUTDIR/$rpmcate/$dir${$arctree{$arch}}{$name}"){
          my $newver = `rpm -qp --qf '%|EPOCH?{%{EPOCH}}:{0}|:%{VERSION}-%{RELEASE}' $INDIR/$dir$path`;
          my $oldver = `rpm -qp --qf '%|EPOCH?{%{EPOCH}}:{0}|:%{VERSION}-%{RELEASE}' $OUTDIR/$rpmcate/$dir${$arctree{$arch}}{$name}`;
          my $mailheader_common =
	      "From: Vine Linux Incoming System <vpmirror\@vinelinux.org>". "\n".
	      "To: VineSeed\@vinelinux.org". "\n".
	      "Content-Type: text/plain; charset=\"iso-2022-jp\"". "\n".
	      "Content-Transfer-Encoding: 7bit". "\n\n".
	      "Vine Linux Incoming System です。\n\n";
	  my $mailfooter =
	      "--\n".
	      "Vine Linux Incoming System.\n".
	      "This message was automatically sent by incoming system.\n";

	  # same version
	  if(!system("rpmver $oldver = $newver")){
	    system("mv $INDIR/$dir$path /export1/Vine.devel/vpmirror/pending");
	    my $mailbody = 
	      "Subject: uploaded package was rejected by conflicted version\n".
	      $mailheader_common.
	      "VinePlus/6.5 にアップロードされた以下のパッケージは、リポジトリ内のパッケージと\n".
	      "同一バージョンのため保留されました\n\n".
	      " - $path : すでに同一バージョンのパッケージがリポジトリに存在します\n\n".
	      $mailfooter;
	    open(MAILBODY, "> pending-packages-mail.txt");
	    print MAILBODY $mailbody;
	    close(MAILBODY);
	    #system("nkf -j pending-packages-mail.txt | sendmail -t -f 'Vine Linux Incoming System <vpmirror@vinelinux.org>'");
	    next;
	  }
	  # old version
	  elsif(!system("rpmver $oldver '>' $newver")){
	    system("mv $INDIR/$dir$path /export/Vine.devel/vpmirror/pending");
	    my $mailbody =
	      "Subject: uploaded package was rejected by wrong version\n".
	      $mailheader_common.
	      "VinePlus/6.5 にアップロードされた以下のパッケージは、リポジトリ内のパッケージより\n".
	      "古いバージョンのため保留されました\n\n".
	      " - $path : より新しいバージョンのパッケージがリポジトリに存在します\n".
	      "   (リポジトリのバージョン: $oldver)\n\n".
	      $mailfooter;
	    open(MAILBODY, "> pending-packages-mail.txt");
	    print MAILBODY $mailbody;
	    close(MAILBODY);
	    #system("nkf -j pending-packages-mail.txt | sendmail -t -f 'Vine Linux Incoming System <vpmirror@vinelinux.org>'");
	    next;
	  }
        }

        # upgrade
	if( -f "$OUTDIR/$rpmcate/$dir${$arctree{$arch}}{$name}"){
	    print "mv $OUTDIR/$rpmcate/$dir${$arctree{$arch}}{$name} $BACKUPDIR/$dir/."."\n";
	    system("mv $OUTDIR/$rpmcate/$dir${$arctree{$arch}}{$name} $BACKUPDIR/$dir/.");
	    print "cp $INDIR/$dir$path  $OUTDIR/$dir$rpmcate/.\n";
	    system("cp $INDIR/$dir$path  $OUTDIR/$dir$rpmcate/.");
	    # symlink
            print("rm -f $OUTDIR/$rpmcate/../$rpmdirname.$category/$dir${$arctree{$arch}}{$name}"."\n");
	    system("rm -f $OUTDIR/$rpmcate/../$rpmdirname.$category/$dir${$arctree{$arch}}{$name}");
	    print("ln -sf ../pool/$path  $OUTDIR/$dir$rpmcate/../$rpmdirname.$category/."."\n");
	    system("ln -sf ../pool/$path  $OUTDIR/$dir$rpmcate/../$rpmdirname.$category/.");
	    # task packages
	    if($category eq "task"){
                print("rm -f $OUTDIR/$rpmcate/../$rpmdirname.plus/$dir${$arctree{$arch}}{$name}"."\n");
	        system("rm -f $OUTDIR/$rpmcate/../$rpmdirname.plus/$dir${$arctree{$arch}}{$name}");
	        print("ln -sf ../pool/$path $OUTDIR//$dir$rpmcate/../$rpmdirname.plus/."."\n");
	        system("ln -sf ../pool/$path $OUTDIR//$dir$rpmcate/../$rpmdirname.plus/.");
	    }
            ${$arctree{$arch}}{$name} = $path if $path ne "";
        }
	# new package
	else {
            print "add new package $path\n";
            print "cp $INDIR/$dir$path  $OUTDIR/$dir$rpmcate/.\n";
            system("cp $INDIR/$dir$path  $OUTDIR/$dir$rpmcate/.");
            system("ln -s ../pool/$path  $OUTDIR/$dir$rpmcate/../$rpmdirname.$category/.");
 	    ${$arctree{$arch}}{$name} = $path if $path ne "";

        }
	if($rpmcate4 eq "x86_64/pool"){
	    print("rm -f $OUTDIR/$rpmcate4/$dir${$arctree{$arch}}{$name} "."\n");
	    print("rm -f $OUTDIR/$rpmcate4/../RPMS.$category/$dir${$arctree{$arch}}{$name}"."\n");
	    print("cp $INDIR/$dir$path  $OUTDIR/$dir$rpmcate4/."."\n");
            print("ln -s ../pool/$path  $OUTDIR/$dir$rpmcate4/../$rpmdirname.$category/."."\n");
	    system("rm -f $OUTDIR/$rpmcate4/$dir${$arctree{$arch}}{$name} ");
            system("rm -f $OUTDIR/$rpmcate4/../RPMS.$category/$dir${$arctree{$arch}}{$name}");
            system("cp $INDIR/$dir$name\-[0-9]*$suffix  $OUTDIR/$dir$rpmcate4/.");
            system("ln -s ../pool/$path  $OUTDIR/$dir$rpmcate4/../RPMS.$category/.");
            $rpmcate4 = "";
	    #${$arctree{$arch}}{$name} = $path if $path ne "";
        }

     } 
      
   }
    
  }
  close(IN);
  system("rm -f  $INDIR/$dir*;");
  #system("cd $OUTDIR/i386 ; $GENHDLIST ./;"); 
}

##############################################################################################
sub getoldpkg($)
{
    $arch = $_[0];
#--define--#
    if($arch eq "src" || $arch eq "src"){
        $archdir = "pool";
    }elsif($arch eq "i386"){
        $archdir = "i386/pool";
    }elsif($arch eq "x86_64"){
        $archdir = "x86_64/pool";
    }else{
        print "fail!!!!!";
        return;

    }

#--end--#
#--end--#

#    find(\&check,"$OUTDIR/$archdir");
    check2();
}

##########################################################################################
sub check{
  my $oldname = "";
  my $oldname,$pkgarch;
  my $larch;
  $larch = $arch;
  return unless( $_ =~ /.rpm$/);
  ($oldname, $pkgarch)  = split(",", `rpm -qp $OUTDIR/$archdir/$dir/$_ --queryformat %{NAME},%{ARCH}`);
  # $oldname  = `rpm -qp $OUTDIR/$archdir/$dir/$_ --queryformat %{NAME}`;
  # $pkgarch = `rpm -qp $OUTDIR/$archdir/$dir/$_ --queryformat %{ARCH}`;
  chomp($oldname);
  chomp($pkgarch);
  if(( $pkgarch ne $larch )&&($larch ne "noarch") && ($larch ne "src") ){
      $larch = $pkgarch;
  }

  ${$arctree{$larch}}{$oldname} = $_ if $oldname ne "";
#  $oldpkg{$oldname} = $_ if $oldname ne "";

#  if($arch ne ""){
#      $arctree{$arch} = $oldpkg;
#  }
  print  $larch.",".$oldname.",".  ${$arctree{$larch}}{$oldname}. "\n";
}

##########################################################################################
sub check2{
    my $oldname = "";
    my $oldname,$pkgarch,$pkgname;
    my $larch;
    if ( $arch eq "src" ) {
        open(RPMIN, "rpm -qp $OUTDIR/$archdir/$dir/\\* --queryformat \"src,%{N},%{N}-%{V}-%{R}.src.rpm\\n\" |");
    } else {
        open(RPMIN, "rpm -qp $OUTDIR/$archdir/$dir/\\* --queryformat \"%{ARCH},%{N},%{N}-%{V}-%{R}.%{ARCH}.rpm\\n\" |");
    }
    while ( $line = <RPMIN> ) {
        $larch = $arch;
	($pkgarch, $oldname, $pkgname) = split(",", $line);
        if(( $pkgarch ne $larch )&&($larch ne "noarch") && ($larch ne "src") ){
            $larch = $pkgarch;
	}
        chomp($oldname);
        chomp($pkgarch);
        chomp($pkgname);
        ${$arctree{$larch}}{$oldname} = $pkgname if $oldname ne "";
        print  $larch.",".$oldname.",".  ${$arctree{$larch}}{$oldname}. "\n";
    }
}
