diff options
-rwxr-xr-x | genfilelist | 91 |
1 files changed, 48 insertions, 43 deletions
diff --git a/genfilelist b/genfilelist index b7e8c77..fa4d1dd 100755 --- a/genfilelist +++ b/genfilelist @@ -30,44 +30,39 @@ sub packfilelist { #- search for common parts of name. foreach (@_) { my $filename = $_; - foreach (0..length($filename)) { + foreach (4..length($filename)) { ++$countdir{substr($filename, 0, $_)}; } } + my @costlysort = (sort { $countdir{$b} <=> $countdir{$a} || ($countdir{$b} == $countdir{$a} && length($b) <=> length($a)) } + grep { $countdir{$_} > 2 } + keys %countdir); + #- pass 1: recompute counter. - foreach (sort { $countdir{$b} <=> $countdir{$a} || ($countdir{$b} == $countdir{$a} && length($b) <=> length($a)) } - keys %countdir) { + foreach (grep { length($_) > 4 } @costlysort) { my $filepart = $_; - if (length($filepart) > 4 && $countdir{$filepart} > 1) { - foreach (0..length($filepart)-1) { - my $subpart = substr($filepart, 0, $_); - if (length($subpart) * $countdir{$subpart} < length($filepart) * $countdir{$filepart}) { - $countdir{$subpart} -= $countdir{$filepart} if $countdir{$filepart} > 0; - } else { - $countdir{$filepart} -= $countdir{$subpart} if $countdir{$subpart} > 0; - } + foreach (4..length($filepart)-1) { + my $subpart = substr($filepart, 0, $_); + if (length($subpart) * $countdir{$subpart} < length($filepart) * $countdir{$filepart}) { + $countdir{$subpart} -= $countdir{$filepart} if $countdir{$filepart} > 0; + } else { + $countdir{$filepart} -= $countdir{$subpart} if $countdir{$subpart} > 0; } - } else { - delete $countdir{$filepart}; } } #- pass 2: filter out overstring. - foreach (sort { $countdir{$a} <=> $countdir{$b} || ($countdir{$a} == $countdir{$b} && length($a) <=> length($b)) } - keys %countdir) { + foreach (grep { length($_) > 4 && $countdir{$_} > 2 } reverse @costlysort) { my $filepart = $_; - if ($countdir{$filepart} > 1) { - foreach (0..length($filepart)-1) { - delete $countdir{substr($filepart, 0, $_)}; - } + foreach (4..length($filepart)-1) { + delete $countdir{substr($filepart, 0, $_)}; } } #- pass 3: get result. - foreach (sort { $countdir{$b} <=> $countdir{$a} || ($countdir{$b} == $countdir{$a} && length($b) <=> length($a)) } - keys %countdir) { - push @commonparts, $_ if $countdir{$_} > 1 && @commonparts < 10; + foreach (grep { $countdir{$_} > 2 } @costlysort) { + push @commonparts, $_ if @commonparts < 10; } @commonparts; @@ -76,30 +71,40 @@ sub packfilelist { #- main program. sub main { my ($rpms_dir) = @_; + my (@filelist, @obsoletes) = (); - local *DIR; - opendir DIR, $rpms_dir or die "unable to parse directory: $!"; - foreach (readdir DIR) { - if (/(.*)-[^-]*-[^-]*$/) { - print "#$1\n"; - - my @filelist = split '\n', `rpm -qpl $rpms_dir/$_`; - my @obsoletes = split '\n', `rpm -qp --obsoletes $rpms_dir/$_`; - my @commonparts = packfilelist(@filelist); - - foreach (@obsoletes) { print "*$_\n" } - foreach (0..$#commonparts) { print "=$commonparts[$_]\n" } #- commonparts are printed in from 0 to n-1. - foreach my $filename (@filelist) { - map { - if (substr($filename, 0, length($commonparts[$_])) eq $commonparts[$_]) { - print $_ . substr($filename, length($commonparts[$_])) . "\n"; next; - } - } (0..$#commonparts); - print " $filename\n"; - } + local *RPM_QA; + open RPM_QA, "rpm -qp --queryformat \"#\%{NAME}\\n\" --obsoletes -l $rpms_dir/*.rpm |"; + foreach (<RPM_QA>) { + if (/^\#/) { + #- work on previous obsoletes and filelist. + genfilelist(\@filelist, \@obsoletes); + + (@filelist, @obsoletes) = (); + + print $_; + } else { + chomp; + m|^/| ? push(@filelist, $_) : push(@obsoletes, $_); } } - closedir DIR; + genfilelist(\@filelist, \@obsoletes); +} + +sub genfilelist { + my ($filelist, $obsoletes) = @_; + my @commonparts = packfilelist(@$filelist); + + foreach (@$obsoletes) { print "*$_\n" } + foreach (@commonparts) { print "=$_\n" } #- commonparts are printed in from 0 to n-1. + foreach my $filename (@$filelist) { + map { + if (substr($filename, 0, length($commonparts[$_])) eq $commonparts[$_]) { + print $_ . substr($filename, length($commonparts[$_])) . "\n"; next; + } + } (0..$#commonparts); + print " $filename\n"; + } } foreach (@ARGV) { |