Skip to content
This repository
Fetching contributors…

Cannot retrieve contributors at this time

executable file 73 lines (55 sloc) 1.913 kb
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 61 62 63 64 65 66 67 68 69 70 71 72 73
#! /usr/bin/perl -w

if (scalar @ARGV != 1) {
    print "syntax: show-duplication.pl PATH\n";
    exit 1;
}

my $root = $ARGV[0];


my $nameRE = "(?:(?:[A-Za-z0-9\+\_]|(?:-[^0-9]))+)";
my $versionRE = "(?:[A-Za-z0-9\.\-]+)";


my %pkgInstances;


my $pid = open(PATHS, "-|") || exec "nix-store", "-qR", $root;
while (<PATHS>) {
    chomp;
    /^.*\/[0-9a-z]*-(.*)$/;
    my $nameVersion = $1;
    $nameVersion =~ /^($nameRE)(-($versionRE))?$/;
    $name = $1;
    $version = $3;
    $version = "(unnumbered)" unless defined $version;
# print "$nameVersion $name $version\n";
    push @{$pkgInstances{$name}}, {version => $version, path => $_};
}
close PATHS or exit 1;


sub pathSize {
    my $path = shift;
    my @st = lstat $path or die;

    my $size = $st[7];

    if (-d $path) {
        opendir DIR, $path or die;
        foreach my $name (readdir DIR) {
            next if $name eq "." || $name eq "..";
            $size += pathSize("$path/$name");
        }
    }
    
    return $size;
}


my $totalPaths = 0;
my $totalSize = 0, $totalWaste = 0;

foreach my $name (sort {scalar @{$pkgInstances{$b}} <=> scalar @{$pkgInstances{$a}}} (keys %pkgInstances)) {
    print "$name ", scalar @{$pkgInstances{$name}}, "\n";
    my $allSize = 0;
    foreach my $x (sort {$a->{version} cmp $b->{version}} @{$pkgInstances{$name}}) {
        $totalPaths++;
        my $size = pathSize $x->{path};
        $allSize += $size;
        print " $x->{version} $size\n";
    }
    my $avgSize = int($allSize / scalar @{$pkgInstances{$name}});
    my $waste = $allSize - $avgSize;
    $totalSize += $allSize;
    $totalWaste += $waste;
    print " average $avgSize, waste $waste\n";
}


my $avgDupl = $totalPaths / scalar (keys %pkgInstances);
my $wasteFactor = ($totalWaste / $totalSize) * 100;
print "average package duplication $avgDupl, total size $totalSize, total waste $totalWaste, $wasteFactor% wasted\n";
Something went wrong with that request. Please try again.