rpmsafereduce: Fix missing: /usr/local
[nethome.git] / bin / rpmsafereduce
1 #! /usr/bin/perl
2 # rpmsafe|sort -u|rpmsafereduce >EXCLUDE-FILELIST
3 use Carp;
4 my $IGNORE_D;
5 #$IGNORE_D=1; # Do not backup directory entry itself even if it is missing in rpms. 581692 -> 37998 vs. 44248
6 use strict;
7 use warnings;
8 sub slashes($) {
9   my($s)=@_;
10   (my $sl=$s)=~tr{/}{}cd;
11   $sl=length $sl;
12   $sl>=1 or carp "<$s>";
13   return $sl;
14 }
15 my(%d,%f,%t);
16 my $l;
17 while (<>) {
18   chomp;
19   next if $_ eq "/";
20   carp $_ if m{//};
21   m{^/} or carp $_;
22   carp $_ if m{/$};
23   carp "sort -u: $l >= $_" if $l && $l ge $_;
24   $l=$_;
25   my $sl=slashes $_;
26   $t{$_}=1,$d{$_}=$sl if -d;
27   $f{$_}=$sl if -f;
28   s{/[^/]*$}{} or carp $_;
29   $d{$_}=$sl-1 if $IGNORE_D && $_ ne "";
30   $t{$_}=1 if $d{$_};
31 }
32 my $time;
33 my(%b);
34 while (%t) {
35   my @t=keys(%t);
36   %t=();
37   #warn((@t+0)."\n");
38   @t=sort { ($f{$b}||$d{$b}) <=> ($f{$a}||$d{$a}) || $a cmp $b; } @t;
39   while (@t) {
40     if (defined $time&&time()!=$time) {
41       $time=time();
42       print STDERR (@t+0)."    \r";
43     }
44     my $t=shift @t;
45     next if $b{$t};
46     next if !$d{$t}&&!$f{$t};
47     opendir DIR,$t or carp "$t: $!";
48     my $ok=1;
49     local $_;
50     my @d;
51     for my $d (readdir DIR) {
52       push @d,$d;
53       next if $d eq ".";
54       next if $d eq "..";
55       next if $f{"$t/$d"};
56       next if $d{"$t/$d"};
57       $ok=0;
58       last;
59     }
60     closedir DIR or carp "$t: $!";
61     if (!$ok) {
62       do { $b{$t}=1; } while $t=~s{/[^/]*$}{};
63       next;
64     }
65     for my $d (@d) {
66       $b{"$t/$d"}=1;
67     }
68     $f{$t}=slashes $t;
69     $t=~s{/[^/]*$}{} or carp $t;
70     $d{$t}=slashes $t if $IGNORE_D && $t ne "";
71     $t{$t}=1 if $d{$t};
72   }
73 }
74 for my $f (sort keys(%f)) {
75   print "$f\n" if !$b{$f};
76 }