Paste #269673

   
pasted on 25.05.2023 20:51
  • Edit to this paste
  • Print
  • Raw
  • The following pastes replied to this paste:  # 276148
  • Show paste tree
  • Compare with paste
    #  
  • Toggle line numbers
  • Syntax highlighting  
Text paste
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/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);
Add Comment
Author