#!/usr/bin/env perl
use strict;
use warnings;
use version;
use Data::Dumper;
my $DIR_OPT = "/usr/home/portage/x86_64/";
my @dirs;
my @pkgs;
my @remove;
my @skipped;
if ( opendir( DIR, $DIR_OPT ) ) {
@dirs = grep -d "$DIR_OPT/$_", readdir DIR;
closedir( DIR );
}
foreach my $dir ( @dirs ) {
next if ( $dir eq "." );
next if ( $dir eq ".." );
if ( opendir( DIR, $DIR_OPT."/".$dir ) ) {
@pkgs = readdir DIR;
closedir( DIR );
@pkgs = grep {!/(^\.$|^\.\.$)/} @pkgs;
my $pkgver = {};
foreach ( @pkgs ) {
my ($pname, $pver, $prev) = ($_ =~ /(.*)\-([\d\._]+)(\-r\d+)?\.tbz2/i);
if ( ! defined $pname ) {
push @skipped, "$DIR_OPT$dir/$_";
next;
}
$prev = "-r0" if ( ! defined $prev );
$prev =~ s/-r//;
print "-- $_ parsed as $pname, $pver, $prev\n";
if ( ! defined $pkgver->{$pname} ) {
$pkgver->{$pname}[0] = $pver;
$pkgver->{$pname}[1] = $prev;
next;
}
print "Found twin for $pname ($_)\n";
if ( version->parse($pkgver->{$pname}[0]) > version->parse( $pver ) ) {
push @remove, "$DIR_OPT$dir/$_";
next;
}
if ( version->parse($pkgver->{$pname}[0]) == version->parse( $pver ) && $pkgver->{$pname}[1] >= $prev ) {
next if ( $pkgver->{$pname}[1] >= $prev ); # same prog, miracle, just skip it
push @remove, "$DIR_OPT$dir/$_";
next;
}
$pkgver->{$pname}[0] = $pver;
$pkgver->{$pname}[1] = $prev;
$prev = "-r".$prev;
$prev = "" if ( $prev eq "-r0" );
push @remove, "$DIR_OPT$dir/$pname-$pver$prev.tbz2";
}
}
}
unlink @remove;
#print Dumper(@remove);
#print Dumper(@skipped);