#!/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);